- 締切済み
VB6でのgethostbyaddrの使用方法について
IPアドレスからホスト名(コンピュータ名)を取得するため gethostbyaddrを使用したいのですがうまくいきません。 (動くのですが戻り値が常に0となります。名前解決はできています。また、gethostbynameは正常に動きました。) すみませんが教えてください。 HOSTENT = gethostbyaddr(addr,inglen,ingtype) 上記のaddr、inglen、ingtypにはどのような値を入れればよいので しょうか? addrはgethostbynameで取得した値(102379333)を入れるのでしょうか? それとも「10.10.999.999」のような値を入れるのでしょうか? 環境は以下の通りです。 OS:Windows XP またはWindows2003 server 言語:VB6 使用関数はgethostbyaddrを使用しないといけません。 調べたところいろいろありましたが 具体的なコーディングがありませんでした。 お手数ですがよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1416)
二重ポインタを処理しなければなりません。以下は回答です。 Declare Function WSAStartup Lib "WS2_32" _ (ByVal V As Integer, ByRef D As Byte) As Long Declare Function inet_addr Lib "WS2_32" _ (ByVal A As String) As Long Declare Function gethostbyaddr Lib "WS2_32" _ (ByRef A As Long, ByVal S As Long, ByVal T As Long) As Long Declare Function WSACleanup Lib "WS2_32" () As Long Declare Function SysAllocStringByteLen Lib "OLEAUT32" _ (ByVal S As Long, ByVal L As Long) As String Declare Function lstrlenA Lib "KERNEL32" _ (ByVal P As Long) As Long Declare Sub RtlMoveMemory Lib "KERNEL32" _ (ByRef D As Long, ByVal S As Long, ByVal L As Long) Sub Main() Dim A As Long, P As Long, N As String ReDim D(397) As Byte 'WSADataの定義を横着した A = inet_addr("192.168.0.1") '文字列のIPアドレスを数値化 WSAStartup &H202, D(0) 'WinSockを初期化 P = gethostbyaddr(A, 4, 2) 'IPアドレスから情報を取得 If P = 0 Then P = Err.LastDllError 'エラーコードを取得 MsgBox "WinSock Error Code = " & P ,vbCritical Else RtlMoveMemory P, P, 4 '二重ポインタ→単ポインタ A = lstrlenA(P) 'ホスト名のバイト数を取得 N = SysAllocStringByteLen(P, A) 'VB文字列に変換 MsgBox "Host = " & N End If WSCleanup End Sub gethostbyaddr(A, 4, 2) について (1)A はIPアドレスを数値化したもの (2)4 は変数Aのバイト数 (3)2 は定数 AF_INET の定義値 ホスト名はANSI文字列なのでVB文字列に変換しています。
- redfox63
- ベストアンサー率71% (1325/1856)
MSDNなどで WinAPIのリファレンスをちゃんと引いて見ましょう addrはByte(Char)型の配列で 192.168.1.10でしたら4つの要素を持つ配列で addr(0)=192, addr(1)=168, addr(2)=1, addr(3)=10といった具合になるでしょう inglenは addrがどれだけの長さなのかですから 4 ingtypeはaddrの数値がどのタイプですので TCP/UDPなどなら2 (AF_INET)を設定でしょう
お礼
ありがとうございました。 解決しました。 本当に助かりました。