2011-07-12 28 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,表示套接字綁定到主機上的所有本地地址,而不僅僅是一個地址。您要求提供一個地址,但您沒有綁定到一個地址,因此getsockname()無法報告特定地址。

如果你想getsockname()報告一個特定的地址,你必須bind()到那個特定的地址。因此,使用GetAdaptersAddresses來枚舉本地主機上的所有接口,並將bind()單獨插入到每個地址,而不是在單個套接字上綁定INADDR_ANY

否則,您可以bind()一個插座INADDR_ANY,然後使用(而不是recv()recvfrom(),或WSARecvFrom()WSARecvMsg()讀取傳入數據包。 WSARecvMsg()可以報告有關每個數據包到達接口和目標地址的詳細信息,如果您使用setsockopt()啓用適當的選項。

+0

套接字將通過多個接口接收數據報。但是,可以確定任何給定的傳入數據報經過哪個接口。 –