套接字 – 在客户端使用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 。 我在这里find另一个堆栈溢出的post ,说这个OP应该在客户端使用INADDR_ANY ,但没有任何理由或解释。

那么这到底是什么呢? 是否尝试所有接口,直到find一个端口可用于连接? 这是怎么发生的?

感谢您的回答!

Solutions Collecting From Web of "套接字 – 在客户端使用INADDR_ANY"

看起来你的问题不是关于“客户端”,而是bind vs connect

INADDR_ANY可以在客户端和服务器上合理地使用bind 。 与connect()是毫无意义的,应该导致连接失败。

这是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是多余的,但我已经看到了一些代码,我想这是'完整性'。 你可以在客户端指定接口,如果你想强制一个特定的接口,例如在多宿主机器。

绑定到客户端的端口也不常见。 让系统找到一个可用的端口通常是一个比较好的主意,否则程序可能会失败,因为端口恰好被客户端或服务器使用。