我正在遵循 Beej 的 NP 指南。
我做了一些修改,并尝试通过 getaddrinfo() 获取我的服务器程序的 IP。
(原文可以在这里找到http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#simpleserver http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#simpleserver)
以下是我更改/添加的部分。
if ((rv = getaddrinfo(NULL, "0", &hints, &servinfo)) != 0) { //0 for random port?
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
//... some code emitted ...
//freeaddrinfo(servinfo); //I still need it!
printf("ip: %s\nport: %d\n",
inet_ntop(AF_INET, &((struct sockaddr_in *)p->ai_addr)->sin_addr, ip4, INET_ADDRSTRLEN),
ntohs(((struct sockaddr_in *)p->ai_addr)->sin_port)
);
问题是我得到结果
ip: 0.0.0.0
port: 0
问题 1:我从几个网站上读到,为端口设置“0”会告诉操作系统您想要下一个可用端口,而不是实际上 0。这是真的吗?
Q2:我还读到 gethostbyname(gethostname(...)) 可以给你机器的 ip,但 Beej 说这些已被 getaddrinfo() 取代。那么,我应该使用 getaddrinfo 吗?或者 gethostbyname ?
Q3:我还有什么做错的地方吗?
它返回的结果正是您所期望的。
From man getaddrinfo
:
如果在hints.ai_flags中指定了AI_PASSIVE标志,并且node为NULL,则返回的套接字地址将适合bind(2)将接受(2)连接的套接字。返回的套接字地址将包含“通配符地址”(对于 IPv4 地址为 INADDR_ANY,对于 IPv6 地址为 IN6ADDR_ANY_INIT)。通配符地址由打算接受任何主机网络地址上的连接的应用程序(通常是服务器)使用。如果节点不为 NULL,则忽略 AI_PASSIVE 标志。
您链接到的代码集hints.ai_flags
to AI_PASSIVE
你正在路过NULL
对于节点。通配符地址是0.0.0.0
。按规定工作。绑定到该地址意味着您绑定到计算机上的每个 IP 地址。
至于端口......你指定"0"
这...正是您要返回的内容。您需要将其设置为您希望侦听的实际端口,就像您链接到的示例代码一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)