2011-12-07 67 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建议的地址中留下所有零。