了解INADDR_ANY套接字编程

我想编程一些套接字,所以,在服务器端,我使用htonl(INADDR_ANY) 。 就我的理解程度而言,在我看来,这个函数会产生一个随机IP(我是否正确?)。 事实上,我想要绑定我的localhost套接字。 但是,如果我运行这个

 printf("%d",htonl(INADDR_ANY)); 

我得到0作为返回值。 有人可以提出一些解释吗?

  1. INADDR_ANY的bind()不会“生成随机IP”。 它将套接字绑定到所有可用的接口 。

  2. 对于服务器,您通常要绑定到所有接口 – 不仅仅是“本地主机”。

  3. 如果你只想将你的套接字绑定到本地主机,那么语法是my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); ,然后调用bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)

  4. 碰巧,“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 ... 
  5. 如果您还不熟悉它,我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”)