2011-07-12 34 views
2

UDPソケットがバインドされているIPアドレスを見つけようとしました(別の方法でコンピュータのIPアドレスを検索したくないと仮定して)。これはどうすればできますか?以下のコードは、ポート番号に動作しますが、常にアドレスの0.0.0.0を返します。UDPソケット(Windows C++)からIP情報を取得するにはどうすればよいですか?

struct sockaddr_in sin; 
int addrlen = sizeof(sin); 
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 && 
    sin.sin_family == AF_INET && 
    addrlen == sizeof(sin)){ 
    printf("RETURNING ADDR: %s: len = %d\n", inet_ntoa(sin.sin_addr), 
     strlen(inet_ntoa(sin.sin_addr))); 
} 

ソケットは、次のコードを使用してバインドされました:

sockaddr_in local; 
local.sin_family = AF_INET; 
local.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1"); 
local.sin_port = 0; //assign given port 
result = bind(clientSock, (sockaddr*)&local, sizeof(local)); 

を任意およびすべての助けをいただき、ありがとうございます。私はあなたの時間を感謝します!

答えて

2

0.0.0.0INADDR_ANYです。つまり、ソケットは1つのアドレスだけでなく、ホスト上のすべてのローカルアドレスにバインドされています。 1つのアドレスを要求していますが、1つのアドレスにバインドされていないため、getsockname()は特定のアドレスを報告できません。

getsockname()に特定のアドレスを報告したい場合は、その特定のアドレスにbind()する必要があります。したがって、ローカルホストのすべてのインターフェイスを列挙するのにGetAdaptersAddressesを使用し、INADDR_ANYを1つのソケットにバインドする代わりに、bind()を各アドレスとは別のソケットに列挙してください。

そうしないと、あなたはINADDR_ANYに単一のソケットをbind()して、着信パケットを読み取るために(その代わりrecv()recvfrom()、またはWSARecvFrom()の)WSARecvMsg()を使用することができます。 WSARecvMsg()は、setsockopt()で適切なオプションを有効にすると、各パケットの着信インターフェイスと宛先アドレスに関する詳細を報告できます。

+0

ソケットは複数のインターフェイスでデータグラムを受信します。ただし、どのインタフェースが任意の着信データグラムによってトラバースされたかを判断することは可能です。 –

関連する問題