我正在try 编程一些套接字,所以在服务器端,我使用htonl(INADDR_ANY).据我所知,在我看来,这个函数会生成一个随机IP(对吗?).事实上,我想用localhost把我的插座绑起来.但如果我负责这个

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

我得到0作为返回值.有人能解释一下吗?

推荐答案

  1. INADDR_ANY个中的bind()个"生成随机IP".binds the socket to all available interfaces美元.

  2. 对于服务器,您通常希望绑定到所有接口,而不仅仅是"localhost".

  3. 如果您希望仅将套接字绑定到localhost,则语法为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. 如果您还不熟悉它,我建议您查看Beej的Socket编程指南:

    http://beej.us/guide/bgnet/

由于人们仍在阅读这篇文章,还有一点需要注意:

man (7) ip:

当进程想要接收新的传入数据包或连接时,

在这种情况下,只有一个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连接 对其端口的请求,与上的网络接口无关 请求到达的地方.

C++相关问答推荐

使用指针调用函数并在参数中传递它

从带有句点的文件中读取数字(整数和小数)作为分隔符

从 C 文件调用 C++ 标准头文件 (cstdint)

这两个具有递归函数和静态变量的 C 程序谁有不同的输出?

使用R的`.C`接口处理读/写文件

C 是否有 [[nodiscard]] 机制在忽略值时发出警告?

为什么我不能将动态函数指针传递给 atexit()?

C unsigned long 与转换未正确添加

使用 realloc() 进行无效插入

可能的堆栈粉碎?

如何从文件中读取并解析它

如何仅将 C 中 for 循环中的三个最大整数分配给三个单独的变量?

套接字编程中shutdown()函数中SHUT_RDWR的用途

为什么`(char)~0`和`(unsigned char)~0`返回不同宽度的值?

是否有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域中?

并行将 64 位整数中的压缩 8 位整数减 1,没有硬件 SIMD 的 SWAR

为什么我应该总是启用编译器警告?

“使用带二进制位运算符的有符号整数操作数” - 使用无符号短时

使用指向过去的 malloc 的指针是否定义明确?

在结构中,使用一个数组字段访问另一个数组字段是否合法?