2011-07-11 20 views
1

私はこれまでに尋ねたことを見ましたが、うまくいきませんでした。その情報を他のクライアントに転送するために、私のサーバが接続されているコンピュータの明示的なIPアドレス(123.456.789.100)とPORT番号を取得する必要があります。私はWinSock2.hをWindows 7(Home Premium)、Visual Studio 2010 Professional上で使用しています。これは「C++コンソールアプリケーション」です。これはTCP接続です。 はここで、これまでに私のコードです:Windowsソケット(C++)から接続ホストのIPアドレスを取得するにはどうすればよいですか?

sockaddr_in* addr = new sockaddr_in; 
int addrsize = sizeof(addr); 
getsockname(clientSock, (sockaddr*)addr, &addrsize); 
char* ip = inet_ntoa(addr->sin_addr); 
int port = addr->sin_port; 
printf("IP: %s ... PORT:%d\n", ip, port); 

これは常にたびにIPのために私に205.205.205.205を与え、PORT用52685。私はgethostbynameを含む代替案を試しましたが、実際のIP自体が必要です。 getsockname()の代わりにgetpeername()も試しましたが、結果は同じでした。私はルータの背後にありますが、私はこれまで同じマシン上でサーバとクライアントの両方を使用しています。

ご協力いただきありがとうございます!

答えて

3

getpeername()は、使用する関数です。私はあなたのコードで表示さ

一部のエラー:

1)あなたは、ヒープ上のaddrを割り当てています。それを行う必要はありません、単に "sockaddr_in addr;を宣言してくださいあなたのgetpeername()呼び出しにaddrの代わりに& addrを渡してください。

2)addrsizeポインタ(例えば4または8)ことを意味する実際のsockaddr_inのサイズ、...

3)のgetsockname()におそらく失敗しない大きさに設定されています、しかし、あなたは

5)の結果は、あなたがしていることを意味し、エラーかどうか、があった場合

4)ので、あなたが見ることのgetsockname()の戻り値をチェックしていないことを知りませんseekingは、getsockname()/ getpeername()コールの前にランダムなガベージデータがあった(* addr)ものを表示しています。これは、コールが広告に何も書き込まずに失敗したためですdr構造体。

6)もう1つ... ntohl()コールでaddr.sin_addrへの参照を、ntohs()コールでaddr.sin_portへの参照を必ず入れてください。それらはあなたが望むものではないリトルエンディアン(インテルベースのコンピュータ)で動作するビッグエンディアン形式です。

+0

はい、あなたは正しく、エラーを投げていて、私はそれをチェックしていません。非常にありがとう、あなたの解決策は働いた。 – Sefu

1

はい、あなたは正しく、エラーを投げていましたが、私はそれをチェックしていません。非常にありがとう、あなたの解決策は働いた。私のために働いた最終的なコードは次の通りです:

sockaddr_in addr; 
int addrsize = sizeof(addr); 
int result = getpeername(clientSock, (sockaddr*) &addr, &addrsize); 
printf("Result = %d\n", result); 
char* ip = inet_ntoa(addr.sin_addr); 
int port = addr.sin_port; 
printf("IP: %s ... PORT: %d\n", ip, port); 

そして、それは私に正しい結果をもたらしました。私はあなたの助けに感謝します。ありがとう!