问题描述
这是代码.它与此类似问题的代码相同: http://.org/freebsd/archive/freebsd stable/200401/msg00032.html .当我运行时,我总是会得到输出:
在0.0.0.0:54493上听.显然,端口发生了变化,但我不知道为什么我继续获得0.0.0.0的IP地址.我想念什么吗?
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { int sock; int len = sizeof(struct sockaddr); struct sockaddr_in addr, foo; if((sock=socket(AF_INET, SOCK_STREAM, 0))<0) { exit(0); } memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(0); if(bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))<0) { perror("bind"); exit(0); } if(listen(sock, 5)<0) { perror("listen"); exit(0); } getsockname(sock, (struct sockaddr *) &foo, &len); fprintf(stderr, "listening on %s:%d\n", inet_ntoa(foo.sin_addr), ntohs(foo.sin_port)); return 0; }
推荐答案
您指定INADDR_ANY而不是特定的IP地址,因此它绑定到通配符(所有接口)0.0.0.0.因此,当您致电getsockname()时,这就是您回来的.
如果您指定0.0.0.0为IP地址而不是INADDR_ANY,则会获得相同的行为;您将绑定到计算机上的所有网络接口.
例如,可以说您只有一个网络接口,其中IP 192.168.1.12分配给它.默认情况下,您还具有回环 - 127.0.0.1
使用0.0.0.0或INADDR_ANY意味着您将绑定到两个地址,而不是特定的地址.您将能够通过任何一个IP连接到您的过程.
如果要绑定到特定的IP而不是INADDR_ANY,则您的过程只会在该IP上聆听,并且您会使用getsockname().
其他推荐答案
是的,如果将其绑定到环回,则必须指定Inaddr_loopback. 否则,它将自己附加到0.0.0.0,代表所有可用的网络接口.在发出getNameInfo()呼叫时,我面临着同样的问题.
其他推荐答案
如其他答案中提到的,0.0.0.0被返回,因为INADDR_ANY被指定为听力套接字的主机地址.这是有道理的,如果您认为在多个主机中,客户连接可能会在任何这些接口上进行(因此应报告?)
扩展这些答案;如果需要客户连接的实际IP地址,请使用从accept()返回的SOCKET使用getsockname()>.这将在客户端连接的服务器上提供接口地址.