套接字-在客户端使用INADDR_ANY

Ben*_*ber 5 c sockets linux ip-address

我最近遇到了一篇博客文章该文章描述了使用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;
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我对这一行很感兴趣:

addr.sin_addr.s_addr = htonl(INADDR_ANY);
Run Code Online (Sandbox Code Playgroud)

在服务器端,我知道这INADDR_ANY会将端口绑定到所有可用接口,但是我不确定在客户端这有何意义。最后,客户端将需要在特定接口上进行连接。以前,我总是指定IP地址或使用INADDR_LOOPBACK

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

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

感谢您的回答!

Ben*_*igt 5

看来您的问题实际上并不是关于“客户端”,而是关于bindvs connect

INADDR_ANY可以bind在客户端和服务器上合理使用。使用它connect()是没有意义的,并且会导致连接失败。

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

Ben*_*ber 5

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

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