【发布时间】:2018-03-19 11:52:54
【问题描述】:
花了几个小时搜索,仍然感到困惑。根据我的发现,INADDR_ANY 旨在指定套接字将接受与分配给服务器的任何地址的连接。但是,以下导致客户端只能从同一台机器连接到localhost:7777。
addrinfo hints;
addrinfo* result;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(INADDR_ANY, "7777", &hints, &result);
SOCKET listenSocket = INVALID_SOCKET;
listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
bind(listenSocket, result->ai_addr, (int)result->ai_addrlen);
我找到的唯一解决方案是将 INADDR_ANY 更改为机器的本地 IP:
getaddrinfo("192.168.0.105", "7777", &hints, &result);
我需要了解 INADDR_ANY 的工作原理,因为我觉得我只是在以某种方式滥用它。任何帮助将不胜感激。
【问题讨论】:
-
INADDR_ANY具有您所期望的效果当它作为参数直接传递给bind()。你不这样做。您将此值传递给getaddrinfo()。这是一个完全不同的故事。现在,在这种情况下,您为什么不检查getaddrinfo()返回的内容,然后自己弄清楚。如果您想接受任何本地 IP 地址上的连接,则不需要getaddrinfo()。彻底摆脱这一切,直接致电bind()。 -
你怎么知道
getaddrinfo()甚至工作?您不必费心检查返回值。根据the POSIX standard:“getaddrinfo()的返回值为零表示成功完成;非零返回值表示失败。错误的可能值列在错误部分中。” -
getaddrinfo可以返回几个个地址;而且你还需要freeaddrinfo(result)但你只绑定了第一个。 -
你读过the documentation吗?
-
为了简洁起见,我省略了错误检查,我的错。
标签: c windows sockets tcp getaddrinfo