我最近遇到this blog post,它描述了一個使用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;
}
具體我interesed在該行:
addr.sin_addr.s_addr = htonl(INADDR_ANY);
在服務器端,我的理解是INADDR_ANY
將端口綁定到所有可用的接口,但我不確定這在客戶端是如何合理的。最終,客戶端需要連接到特定的接口。以前我一直指定IP地址或使用INADDR_LOOPBACK
。
The Linux IP man page沒有談論在客戶端使用INADDR_ANY
。我發現another Stack Overflow post here表示OP應在客戶端使用INADDR_ANY
,但沒有任何理由或解釋。
那麼這到底是什麼呢?它是否嘗試所有接口,直到找到可用於連接的端口?這是怎麼發生的?
感謝您的回答!
相關:http://stackoverflow.com/questions/11982562/socket-connect-to-0-0-0-0-windows-vs-mac –