我最近遇到了一篇博客文章,该文章描述了使用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; }
具体来说,我对这一行很感兴趣:
addr.sin_addr.s_addr = htonl(INADDR_ANY);
在服务器端,我知道这INADDR_ANY会将端口绑定到所有可用接口,但是我不确定在客户端这有何意义。最后,客户端将需要在特定接口上进行连接。以前,我总是指定IP地址或使用INADDR_LOOPBACK。
INADDR_LOOPBACK
Linux IP手册页没有讨论INADDR_ANY在客户端使用。我确实在这里找到了另一个Stack Overflow帖子,其中说OP应该INADDR_ANY在客户端使用,但是没有给出任何理由或解释。
那么这到底在做什么呢?是否尝试所有接口,直到找到一个可用于连接的端口?这是以什么顺序发生的?
感谢您的回答!
这是nos在评论中提供的答案。如果nos回来并将其发布为答案,我将nos标记为答案并删除该帖子。
INADDR_ANY通常定义为0。即IP地址0.0.0.0。RFC 1122表示这意味着“此网络上的主机”。linux IP堆栈似乎只是将其路由到回送接口。(例如,尝试ping 0.0.0.0甚至只是ping 0)。我想说作者打错了字,应该使用INADDR_LOOPBACK。