我正在尝试编程一些套接字,因此在服务器端,我使用htonl(INADDR_ANY)
。就我所知,在我看来,该功能会生成一个随机IP(我正确吗?)。实际上,我想将套接字与绑定localhost
。但是如果我运行这个
printf("%d",htonl(INADDR_ANY));
我得到0作为返回值。有人可以带来一些解释吗?
Answers:
bind()
的INADDR_ANY
的确不是“随机生成一个IP”。它将套接字绑定到所有可用接口。
对于服务器,通常需要绑定到所有接口-而不仅仅是“ localhost”。
如果您只想将套接字绑定到localhost,则语法为my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
,然后调用bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
。
碰巧INADDR_ANY
是一个等于“零”的常数:
http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html
# define INADDR_ANY ((unsigned long int) 0x00000000)
...
# define INADDR_NONE 0xffffffff
...
# define INPORT_ANY 0
...
如果您还不熟悉它,我敦促您查看Beej的套接字编程指南:
由于人们仍在阅读此内容,因此请注意:
当进程想要接收新的传入数据包或连接时,应使用bind(2)将套接字绑定到本地接口地址。
在这种情况下,只有一个IP套接字可以绑定到任何给定的本地(地址,端口)对。在bind调用中指定INADDR_ANY时,套接字将绑定到所有本地接口。
在未绑定的套接字上调用listen(2)时,该套接字会自动绑定到本地地址设置为INADDR_ANY的随机空闲端口。
在未绑定的套接字上调用connect(2)时,套接字会自动绑定到随机空闲端口或本地地址设置为INADDR_ANY的可用共享端口上。
有几个特殊地址:INADDR_LOOPBACK(127.0.0.1)始终通过环回设备引用本地主机;INADDR_ANY(0.0.0.0)表示任何要绑定的地址...
也:
如果(sin_addr.s_addr)字段设置为常数INADDR_ANY(如netinet / in.h中所定义),则调用者正在请求将套接字绑定到主机上的所有网络接口。随后,来自所有接口(与绑定名称匹配)的UDP数据包和TCP连接被路由到应用程序。当服务器为多个网络提供服务时,这一点变得很重要。通过不指定地址,服务器可以接受为其端口发出的所有UDP数据包和TCP连接请求,而不管请求到达的网络接口如何。
INADDR_LOOPBACK
代替inet_addr("127.0.0.1")
吗?
INADDR_ANY
指示侦听套接字绑定到所有可用接口。等同于尝试绑定到inet_addr("0.0.0.0")
。为了完整起见,我还要提到还有IPv6的IN6ADDR_ANY_INIT,它与尝试绑定到::
IPv6套接字的地址相同。
#include <netinet/in.h>
struct in6_addr addr = IN6ADDR_ANY_INIT;
另外,请注意,将IPv6套接字IN6ADDR_ANY_INIT
绑定到套接字时,它将绑定到所有IPv6接口,并且还应该能够接受来自IPv4客户端的连接(尽管映射了IPv6的地址)。
htonl(INADDR_ANY)
。医生说这个功能会产生一个随机IP…… ”这是不正确的。哪个文档告诉您?