一尘不染

套接字-在客户端使用INADDR_ANY

linux

我最近遇到了一篇博客文章该文章描述了使用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

Linux IP手册页没有讨论INADDR_ANY在客户端使用。我确实在这里找到了另一个Stack
Overflow帖子,
其中说OP应该INADDR_ANY在客户端使用,但是没有给出任何理由或解释。

那么这到底在做什么呢?是否尝试所有接口,直到找到一个可用于连接的端口?这是以什么顺序发生的?

感谢您的回答!


阅读 1659

收藏
2020-06-03

共1个答案

一尘不染

这是nos在评论中提供的答案。如果nos回来并将其发布为答案,我将nos标记为答案并删除该帖子。

INADDR_ANY通常定义为0。即IP地址0.0.0.0。RFC 1122表示这意味着“此网络上的主机”。linux
IP堆栈似乎只是将其路由到回送接口。(例如,尝试ping 0.0.0.0甚至只是ping
0)。我想说作者打错了字,应该使用INADDR_LOOPBACK。

2020-06-03