我正在绑定一个套接字到我的地址来听连接。 为了做到这一点,我使用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)
在上面的代码中。 由于绑定成功, *p
variables应该拥有关于我的机器的IPv6地址的某种信息,但是字段p->ai_addr->sin6_addr
(假设这将在没有铸造的情况下工作)是空白的。 我怎样才能知道我将使用什么地址?
地址不是空白 – 全是0::0
,即0::0
。 这是特殊的通配符地址,意思是绑定到所有本地接口。
你不应该关心你的主机有什么地址 – 这个列表可能在任何时候改变,包括在你检查之后。
一旦连接了客户端,就可以在getsockname()
返回的套接字上使用getsockname()
accept()
来确定客户端连接到的哪个本地地址。
如果只想监听本地连接,为什么不绑定到localhost
(即IPV4 127.0.0.1
)或ip6-localhost
(即IPV6 ::1
)?
否则,请在@caf建议的地址中保留全零。