PB 電子会議室

コメント

発言No. 更新日 題名(クリックすると発言内容と関連するコメントが表示されます)
14291 01/01/16 13:42:20 RE(5):WinSockでローカルIPアドレスを取得する方法 By Taka
14288 01/01/16 12:46:50 RE(4):WinSockでローカルIPアドレスを取得する方法 By ryochan
14285 01/01/16 11:41:21 RE(3):WinSockでローカルIPアドレスを取得する方法 By Taka
14284 01/01/16 09:26:23 RE(2):WinSockでローカルIPアドレスを取得する方法 By ryochan
14277 01/01/14 09:15:54 RE(1):WinSockでローカルIPアドレスを取得する方法 By Taka
14263 01/01/11 01:28:34 PB7.0: ローカルIPアドレスをとりたい。 By の?やん

カテゴリ:スクリプトの記述
日付:2001年01月16日 11:41 発信者:Taka
題名:RE(3):WinSockでローカルIPアドレスを取得する方法

ryochanさん、さすがです。(^^;

>HOSTENTのh_addr_listについて、charと宣言されていますが
>この正体はIN_ADDR構造体です。

これなんですが、マニュアルには
「ネットワークアドレスを指すポインタからなるNULLで終わる配列」
と書いてありました。この解説どおりに処理しようとしてもまともな結果にならないので
格納フォーマットが良く解らなかったんです。

ryochanさんの解説からすると、
| IP-Addr(1) | IP-Addr(2) | ? | IP-Addr(n) | ホスト名の文字列 |
のように格納されているんですね。勉強になりました。

ほとんどの場合IPアドレスは1個だけだと思うので、単純にダブルポインタ的に
処理すればいいかと思ったのですが、やはりきちんとやったほうが良いのでしょうか...


>//IPアドレス配列部のサイズを取得
>ll_len = len(string(lb_addr))-len(nam)

これなんですが、私の環境では -len(nam) ではダメなようです。
gethostnameで取得した文字列ではなく、HOSTENT構造体.h_nameが指している文字列の長さを
使ってやると、うまくいきました。(ネットワーク環境の設定によって違うのかな?)
「うまくいきました」と言っても、マルチアドレスの設定ではないのでテストできない...

ryochanさんからの情報をもとに調整してみました。
前回の私のレスを、部分的に差替えてください。(^^;

// IPアドレスの取得&文字列に変換(マルチアドレス対応)
ulong p_addr, addr, n
blob{80} addr_buf
string s_addr

RtlMoveMemory( p_addr, host.h_addr_list, 4 )
RtlMoveMemory( addr_buf, p_addr, 80 )

nam = String( host.h_name, \'address\' )

do until( String(addr_buf) = nam )
 n ++
 addr = Long( BlobMid(addr_buf,1,4) )
 s_addr = String( inet_ntoa(addr), \'address\' )
 MessageBox( \"IP Address(\" + string(n) + \")\", s_addr )
 addr_buf = BlobMid(addr_buf,5)
loop

付加情報:

PowerBuilder Version (記載なし)

Client SoftWare

OS (記載なし)
DBMS Oracle SQL*Net 8
Browser (記載なし)

Server SoftWare

OS HP-UX
DBMS Oracle 8.0
WebServer (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.