2011-12-07 99 views
2

我將一個套接字綁定到我的地址來監聽連接。爲此,我使用系統調用getaddrinfo()獲得我的地址信息,該系統調用爲我提供了一種獨立於ip的方式來執行我想要的操作。問題是這個系統調用返回的結構體的IP地址字段全部爲空。例如:如何從一個struct addrinfo獲取我自己的IP地址

struct addrinfo hints, *servinfo, *p; 
int sock; 

memset(&hints, 0, sizeof(struct addrinfo)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_flags = AI_PASSIVE; 

getaddrinfo(NULL, port, &hints, &servinfo) 

for (p = servinfo; p != NULL; p = p->ai_next) 
    if (p->ai_family == AF_INET6) 
     break; 

sock = socket(p->ai_family, p->sock_type, p->protocol); 
bind(sock, p->ai_addr, p->ai_addrlen) 

在上面的代碼中。 *p變量應該有關於我的機器的IPv6地址的某種信息,因爲綁定成功,但字段p->ai_addr->sin6_addr(假定這將在沒有投射的情況下工作)是空白的。我怎樣才能確切知道我將使用什麼地址?

回答

4

地址不爲空 - 全爲零,即0::0。這是特殊的通配符地址,意思是綁定到全部本地接口。

您不應該保健您的主人有哪些地址 - 此列表可能會隨時更改,包括您在檢查後立即更改。

一旦連接了客戶端,您可以在由accept()返回的套接字上使用getsockname()來確定客戶端連接到的哪個本地地址。

+0

您可能不得不在意機器是否連接到多個網絡,並且您不想監聽所有機器的連接。在這種情況下,您必須綁定到您想要收聽的特定IP。 –

+0

@ RemyLebeau-TeamB:在這種情況下,您應該從用戶那裏獲得IP,並將它們提供給'node'參數中的'getaddrinfo()'。 – caf

2

你爲什麼不綁定到localhost(即IPV4 127.0.0.1)或ip6-localhost(即IPV6 ::1),如果你要聽只有本地連接?

否則,請在@caf建議的地址中留下所有零。