如何从一个struct addrinfo获得我自己的IP地址

我正在绑定一个套接字到我的地址来听连接。 为了做到这一点,我使用getaddrinfo()系统调用来获取我的地址信息,这使得我可以独立完成ip操作。 问题是,这个系统调用返回的结构的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) 

在上面的代码中。 由于绑定成功, *pvariables应该拥有关于我的机器的IPv6地址的某种信息,但是字段p->ai_addr->sin6_addr (假设这将在没有铸造的情况下工作)是空白的。 我怎样才能知道我将使用什么地址?

地址不是空白 – 全是0::0 ,即0::0 。 这是特殊的通配符地址,意思是绑定到所有本地接口。

你不应该关心你的主机有什么地址 – 这个列表可能在任何时候改变,包括在你检查之后。

一旦连接了客户端,就可以在getsockname()返回的套接字上使用getsockname() accept()来确定客户端连接到的哪个本地地址。

如果只想监听本地连接,为什么不绑定到localhost (即IPV4 127.0.0.1 )或ip6-localhost (即IPV6 ::1 )?

否则,请在@caf建议的地址中保留全零。