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

タイトルの通りなのですが、
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です。

どなたか情報をお持ちの方がいらっしゃいましたら、
お教え頂けませんでしょうか。
よろしくお願いいたします。

A 回答 (1件)

> ただ、ファイアウォールを無効にすると取得できるのです。



ということは、DNS 問い合わせがブロックされてるんじゃないの?

エラーしたとき h_errno が設定されるようです。herror(), hstrerror() も。

gethostbyaddr() の代りに getaddrinfo(), getnameinfo() 使ってみるとか。こっちの方がエラー診断情報多いと思いますし、どういうエラーコードになってるかによって、firewall との関係も分かるかと思います。
    • good
    • 0
この回答へのお礼

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だけが失敗するのです。

何かお分かりになりますでしょうか。
お手数ですがよろしくお願いいたします。

お礼日時:2011/01/15 20:39

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