我最近遇到this blog post,它描述了一个使用libev的TCP服务器客户端。服务器使用INADDR_ANY
绑定到我熟悉的界面。然而,我很惊讶在客户端代码中看到INADDR_ANY
。在客户端代码中的相关代码如下:套接字 - 在客户端使用INADDR_ANY
// Create client socket
if((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket error");
return -1;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NO);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// Connect to server socket
if(connect(sd, (struct sockaddr *)&addr, sizeof addr) < 0)
{
perror("Connect error");
return -1;
}
具体我interesed在该行:
addr.sin_addr.s_addr = htonl(INADDR_ANY);
在服务器端,我的理解是INADDR_ANY
将端口绑定到所有可用的接口,但我不确定这在客户端是如何合理的。最终,客户端需要连接到特定的接口。以前我一直指定IP地址或使用INADDR_LOOPBACK
。
The Linux IP man page没有谈论在客户端使用INADDR_ANY
。我发现another Stack Overflow post here表示OP应在客户端使用INADDR_ANY
,但没有任何理由或解释。
那么这到底是什么呢?它是否尝试所有接口,直到找到可用于连接的端口?这是怎么发生的?
感谢您的回答!
相关:http://stackoverflow.com/questions/11982562/socket-connect-to-0-0-0-0-windows-vs-mac –