アプリ版:「スタンプのみでお礼する」機能のリリースについて

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を使用しないといけません。

調べたところいろいろありましたが
具体的なコーディングがありませんでした。

お手数ですがよろしくお願いします。

A 回答 (2件)

二重ポインタを処理しなければなりません。

以下は回答です。

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文字列に変換しています。
    • good
    • 0
この回答へのお礼

ありがとうございました。

解決しました。

本当に助かりました。

お礼日時:2009/02/07 18:29

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)を設定でしょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!