- 締切済み
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です。 どなたか情報をお持ちの方がいらっしゃいましたら、 お教え頂けませんでしょうか。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- trapezium
- ベストアンサー率62% (276/442)
> ただ、ファイアウォールを無効にすると取得できるのです。 ということは、DNS 問い合わせがブロックされてるんじゃないの? エラーしたとき h_errno が設定されるようです。herror(), hstrerror() も。 gethostbyaddr() の代りに getaddrinfo(), getnameinfo() 使ってみるとか。こっちの方がエラー診断情報多いと思いますし、どういうエラーコードになってるかによって、firewall との関係も分かるかと思います。
お礼
trapeziumさん回答ありがとうございます。 getaddrinfo(), getnameinfo()なんですが、 設定してもエラーにはならないのですが、 何もデータが入っていないようなのです・・・。 何か設定が間違っているとは思うのですが。 それからWSAGetLastError()でエラー情報を取得してみたところ、 11004:WSANO_DATA 「要求した名前は有効ですが、要求された種類のデータは見つかりませんでした。」 というエラーが返ってきました。 ちなみにgethostbyname関数は成功します。 それから下記のように直接設定してconnectしてみたところ正常に接続することができました。 server.sin_family = AF_INET ; server.sin_port = htons(EPortNum->Text.ToInt() ) ; // ポート番号を引数から server.sin_addr.s_addr = inet_addr(EHost->Text.c_str()); gethostbyaddrだけが失敗するのです。 何かお分かりになりますでしょうか。 お手数ですがよろしくお願いいたします。