了解INADDR_ANY套接字编程
我想编程一些套接字,所以,在服务器端,我使用htonl(INADDR_ANY)
。 就我的理解程度而言,在我看来,这个函数会产生一个随机IP(我是否正确?)。 事实上,我想要绑定我的localhost
套接字。 但是,如果我运行这个
printf("%d",htonl(INADDR_ANY));
我得到0作为返回值。 有人可以提出一些解释吗?
-
INADDR_ANY的bind()不会“生成随机IP”。 它将套接字绑定到所有可用的接口 。
-
对于服务器,您通常要绑定到所有接口 – 不仅仅是“本地主机”。
-
如果你只想将你的套接字绑定到本地主机,那么语法是
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 ...
-
如果您还不熟悉它,我build议您查看Beej的套接字编程指南:
http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html
当您不需要将套接字绑定到特定IP时,将使用INADDR_ANY
。 当你使用这个值作为调用bind()
的地址时,套接字接受到机器所有IP的连接。
要在调用bind函数之前将 socket与localhost 绑定 ,应该正确设置sockaddr_in结构的sin_addr.s_addr字段。 适当的价值可以通过获得
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
或通过
my_sockaddress.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
INADDR_ANY是一个常量,其值为0。 这将只用于当你想连接你不关心ip-add的所有活动端口。 所以如果你想连接任何特定的IP你应该提到像my_sockaddress.sin_addr.s_addr = inet_addr(“192.168.78.2”)