套接字-在客户端使用INADDR_ANY

我最近遇到了一篇博客文章,该文章描述了使用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在客户端使用,但是没有给出任何理由或解释。

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

感谢您的回答!

回答:

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

INADDR_ANY通常定义为0。即IP地址0.0.0.0。RFC 1122表示这意味着“此网络上的主机”。linux

IP堆栈似乎只是将其路由到回送接口。(例如,尝试ping 0.0.0.0甚至只是ping

0)。我想说作者打错了字,应该使用INADDR_LOOPBACK。

以上是 套接字-在客户端使用INADDR_ANY 的全部内容, 来源链接: utcz.com/qa/434488.html

回到顶部