[英] Understanding INADDR_ANY for socket programming
我正在try 编程一些套接字,所以在服务器端,我使用htonl(INADDR_ANY)
.据我所知,在我看来,这个函数会生成一个随机IP(对吗?).事实上,我想用localhost
把我的插座绑起来.但如果我负责这个
printf("%d",htonl(INADDR_ANY));
我得到0作为返回值.有人能解释一下吗?
我正在try 编程一些套接字,所以在服务器端,我使用htonl(INADDR_ANY)
.据我所知,在我看来,这个函数会生成一个随机IP(对吗?).事实上,我想用localhost
把我的插座绑起来.但如果我负责这个
printf("%d",htonl(INADDR_ANY));
我得到0作为返回值.有人能解释一下吗?
INADDR_ANY
个中的bind()
个"生成随机IP".binds the socket to all available interfaces美元.
对于服务器,您通常希望绑定到所有接口,而不仅仅是"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的Socket编程指南:
由于人们仍在阅读这篇文章,还有一点需要注意:
当进程想要接收新的传入数据包或连接时,
在这种情况下,只有一个IP套接字可以绑定到任何给定的本地端口
在未绑定套接字上调用listen(2)时,套接字为 自动绑定到设置了本地地址的随机空闲端口 设置为INADDR_ANY.
在未绑定套接字上调用connect(2)时,套接字为 自动绑定到随机空闲端口或可用共享端口 将本地地址设置为INADDR_ANY.
有几个特殊地址:INADDR_LOOPBACK(127.0.0.1) 始终通过环回设备引用本地主机;INADDR_ANY (0.0.0.0)表示绑定的任何地址.
也:
bind() — Bind a name to a socket:
如果(sin_addr.s_addr)字段设置为常量INADDR_ANY,则为 在netinet/in.h中定义,调用方请求将套接字 绑定到主机上的所有网络接口.随后,UDP数据包 以及来自所有接口的TCP连接(与绑定名称匹配) 被路由到应用程序.这在以下情况下变得很重要:服务器 为多个网络提供服务.通过留下地址 未指定,服务器可以接受所有UDP数据包和TCP连接 对其端口的请求,与上的网络接口无关 请求到达的地方.