【发布时间】:2014-04-18 13:05:47
【问题描述】:
我最近遇到了this blog post,它描述了一个使用 libev 的 TCP 服务器客户端。服务器使用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;
}
特别是我对这条线感兴趣:
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,但没有给出任何理由或解释。
那么这实际上在做什么?它是否会尝试所有接口,直到找到一个可用于连接的端口?这是按什么顺序发生的?
感谢您的回答!
【问题讨论】:
-
post you have cited 并没有像您在这里所说的那样说任何事情。
标签: c linux sockets ip-address