• 締切済み

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を使用しないといけません。 調べたところいろいろありましたが 具体的なコーディングがありませんでした。 お手数ですがよろしくお願いします。

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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文字列に変換しています。

zibika
質問者

お礼

ありがとうございました。 解決しました。 本当に助かりました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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

関連するQ&A

  • gethostbyaddrでのホスト名取得エラー

    タイトルの通りなのですが、 gethostbyaddr関数にてサーバーPCのホスト名を取得しようとしたところ、 NULLが返ってきてしまうのです。 ただ、ファイアウォールを無効にすると取得できるのです。 他のPCで試したところ正常に取得できたので、 処理自体は間違っていないかと思います。 取得部分だけですが以下に示します。 // サーバ情報の取得 if( isalpha( EHost -> Text.SubString(1,1).c_str()[0] ) ) { hostEnt = gethostbyname( EHost -> Text.c_str() ) ; } else // IPアドレスの時 { addr = inet_addr( EHost -> Text.c_str() ) ; hostEnt = gethostbyaddr( (char*)&addr, 4, AF_INET ) ; } if( hostEnt == NULL ) { errMsg = "エラー:アドレスを解決できない [" + EHost -> Text + "]" ; MessageDlg( errMsg, mtWarning, TMsgDlgButtons() << mbOK, 0 ) ; SB -> SimpleText = errMsg ; WSACleanup() ; return ; } この処理自体は本についていたサンプルですので、 問題はないとおもいっています。 PCの設定も正常に取得できるPCに合わせてみても駄目でした。 ただ、何処か別の設定があるのかがわからないのです。 それと、OSがWindows Embedded Standard 2009なので、 OSイメージの作成に問題があるのかとも考えているのですが、 ファイアウォールの無効だけで取得できるようになるということは 何処か設定なのではと思っているのですが・・・。 開発環境はBoriand Developer Studio 2006です。 どなたか情報をお持ちの方がいらっしゃいましたら、 お教え頂けませんでしょうか。 よろしくお願いいたします。

  • ホスト名が認識できない

    Solaris+Cです。 対向装置(VBで作成)と送受信するために、ソケットを使用している以下のようなコードがあります。 iRet = waitAccept( giSocket, &sockAddr, &iSockAddrLen, &giAccept); /* iRetがエラーの場合のエラー処理(割愛)*/ /* IPアドレスからホスト名取得 */ hentpName = gethostbyaddr(   (char *)&(sockAddr.sin_addr), 4, AF_INET); ここで、waitAcceptは正常に抜けてくるのですが、gethostbyaddrが常にNULLを返してきます。 gethostbyaddrでホスト名を取得させるためには、どこかに何らかの設定が必要なのでしょうか? よろしくお願いします。

  • IPアドレスを4バイト長にパックする方法

    環境は、DNSによる名前解決が出来ないUnixサーバです。 下記のようにgethostbyname関数を使って変数$addrに代入される値を、 IPアドレスから変換して取得したい考えています。 $addr = gethostbyname("www.aaa.co.jp") 仮にIPアドレスを 172.17.5.5 とした場合、このIPアドレスを gethostbyname関数を使って変数$addrに代入される値と、同じ値に 変換する方法はありますでしょうか。

    • ベストアンサー
    • Perl
  • HOSTENT構造体を宣言する必要はないのですか?

    ネットワークプログラミングを勉強しているのですが,ソケットを用いた通信のサンプルで, HOSTENT *lphost として,HOSTENT構造体へのポインタを宣言して, lphost = gethostbyname(ホスト名の文字列); で,サーバーのアドレスをHOSTENT構造体にセットするとあります。 構造体へのポインタを宣言しても,構造体自体の領域は確保されないのではないかと思うのですが,gethostbyname関数が返すポインタは,いったい誰がどこに確保した領域を指しているのか,そしてその領域はいつまで保持されるのか,よく理解できません。構造体そのものを宣言せずに,それへのポインタを宣言し,それに関数の戻り値を代入するというのが,よく理解できないです。どなたか解説していただけると幸いです。

  • VB 関数

    初めまして。 VB初心者なので,簡単な質問なのかしれませんが御願いします。 C言語で,   int      main        (void) 戻り値の型    関数名      戻り値なし と書きますが,これと同じ意味を持つプログラムをVBで書くとどのようになりますか? 関数の作り方がまだわかってないので教えていただけますか? 宜しく御願いします。 

  • Winsockコントロールにて・・・。

     Winsockコントロールでホスト名からIPアドレスを求めることはできたので、今度はIPアドレスからホスト名を取得しようと試みています。 APIを用いた場合、     ret =gethostbyname("ホスト名") でホスト名からIPアドレスを求めることができ、     ret =gethostbyaddr("IPアドレス",len,type) でIPアドレスからホスト名を取得することができるので、もしかしたらできるのでは?と思いチャレンジしていますがなかなか上手くいきません…。  やはりWinsockコントロールでは限界があるのでしょうか? ※環境はVisualBasic6.0 pro です。

  • IPからホスト名の変換

    教えてください。 [内容] IPアドレスからHOST名の取得(ネットワーク) [ソース] 宣言 char ipaddress[128]; // ホスト名 PHOSTENT phostent; // ホストエントリ構造体 IN_ADDR in; // IPバイナリ char *hostIP; // IP文字列 int nResult = 0; BOOL flag = TRUE; // 関数戻り値 unsigned long addr; memset(ipaddress,0x00,sizeof(ipaddress)); _tcscpy(ipaddress,mstrIpAddressNet); // WinSock2のスタート flag = soc_start(); if (!flag) { return -1; } addr = ::inet_addr(ipaddress); phostent = ::gethostbyaddr((char *)&addr, 4, AF_INET); //→★ // WinSock終了 soc_end(); ★のところでエラーがでます。 内容は error C2018: 文字 '0x81' は認識できません。 と出力されます。 MSDNには inet_addrの戻り値はLongと記載されていましたが、違っているのでしょうか? もしよろしければ、間違っているところを教えてください。

  • HOSTが表示されない。

    お世話になります。 早速ですが、サイトで調べ、 以下のコーディングでipアドレスと、ホスト名?を表示したいのですが、 perlのシミュレーションで実行すると表示されるのですが、 私が借用しているサイト(infoseek)ではipアドレスしか表示されません。 (ipアドレスを、直接$addrにセットしても同じ結果です。) サイトにより、制限等が掛けられているのでしょうか。 コーディングの誤りであれば指摘していただきたくお願いします。 $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); print "$host\n"; print "<br>\n"; print "$addr\n"; 以上、宜しくお願いします。

    • ベストアンサー
    • Perl
  • VBのプログラムで、実行時に与えられた値の取得方法について

    VB初心者です。 VBのプログラム呼び出しで、実行時に与えられた値を取得したいのですが、 そのやり方がわかりません。 「C:¥TEST.EXE "abc"」で、実行したとき、"abc"の文字列を TEST.EXEで取得したいのですが、このときのVBのコーディングを 教えて下さい。 宜しくお願い致します。 

  • PerlでIPアドレスを取得する方法

    Perl5.6 or 5.8を使っております。 環境変数からIPの取得をするのは、CGIで動いている前提?ですが、 CGIでなくてperlスクリプトが単体で動作した場合に他の例えばサーバーのアドレスを知るにはどのようにしたらよいのでしょうか? 自アドレスはgethostbyaddrで取得できます。 REMOTE_ADDRの値を取得したいです。

    • ベストアンサー
    • Perl