C语言 了解用于套接字编程的INADDR_ANY

7nbnzgx9  于 2023-06-21  发布在  其他
关注(0)|答案(7)|浏览(147)

我正在尝试编写一些套接字,因此,在服务器端,我使用htonl(INADDR_ANY)。在我理解的程度上,在我看来,这个函数生成了一个随机IP(我说得对吗?)。事实上,我想把我的socket和我的localhost绑定在一起。但如果我运行这个

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

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

ffscu2ro

ffscu2ro1#

  1. INADDR_ANYbind()NOT“生成随机IP”。binds the socket to all available interfaces
    1.对于服务器,您通常希望绑定到所有接口-而不仅仅是“localhost”。
    1.如果只想将套接字绑定到localhost,语法是my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");,然后调用bind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
    1.碰巧,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
...

1.如果您还不熟悉它,我建议您查看Beej的套接字编程指南:
http://beej.us/guide/bgnet/
既然大家还在阅读这篇文章,那就再加一条:
man (7) ip
当一个进程想要接收新的传入数据包或连接时,它应该使用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)表示用于绑定的任何地址...
另外:
bind() — Bind a name to a socket
如果(sin_addr.s_addr)字段设置为常量INADDR_ANY(如netinet/in. h中所定义),则调用方请求将套接字绑定到主机上的所有网络接口。随后,来自所有接口(与绑定名称匹配)的UDP数据包和TCP连接被路由到应用程序。当服务器向多个网络提供服务时,这变得很重要。通过不指定地址,服务器可以接受对其端口发出的所有UDP数据包和TCP连接请求,而不管请求到达的网络接口。

3pmvbmvn

3pmvbmvn2#

INADDR_ANY用于不需要将套接字绑定到特定IP的情况。当您在调用bind()时使用此值作为地址时,套接字接受到机器的所有IP的连接。

41zrol4v

41zrol4v3#

要使用 *localhost**绑定 * socket,在调用 bind 函数之前,应正确设置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);
rqdpfwrv

rqdpfwrv4#

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客户端的连接(通过IPv6Map地址)。

jljoyd4f

jljoyd4f5#

当你有一个服务器时,你创建一个套接字,然后将它绑定到一个IP和端口,这为套接字提供了一种基于唯一套接字类型、地址族、IP和端口的唯一识别方式。然后使用listen()将套接字设置为服务器模式,然后使用accept(),它将等待一个连接,该连接将具有目标IP/端口的入站数据包,这些数据包将在该套接字上排队。您不需要将其绑定到IP,但是它可以接受所有接口上的连接。
当你有一个客户端时,你创建一个套接字,然后你connect()套接字到一个远程IP和端口,如果它还没有使用bind(INADDR_ANY,0)绑定到一个IP和端口,它也会将www.example.com和一个随机的未使用的临时端口绑定到套接字。0.0.0.0 and a random unused ephemeral port to the socket if it hasn't been already bound to an IP and port using bind(INADDR_ANY, 0). connect() returns when it connects, and uses the IP and port as the source address in the outbound packets, where 0.0.0.0 is always substituted with an IP based on src hint in the routing table or the IP of the selected interface (if it has multiple IPs then first IP with same or bigger scope is selected), and then you use sendall to send application data.
INADDR_ANY比以编程方式获取接口的当前内部IP更快,后者可能随时更改,并且端口上将不再接收数据包,但它们仍然会在www.example.com上接收,因为它是任何地址。0.0.0.0 because it is any address.
请注意,套接字可以绑定到www.example.com,但不能绑定到端口0,因为它是一个通配符,使其为套接字提供随机的临时端口,因此当您使用bind(INADDR_ANY,0)时,它绑定到0.0.0.0和随机的临时端口。0.0.0.0, but not port 0, because its a wildcard that makes it give the socket a random ephemeral port, so when you use bind(INADDR_ANY, 0) it binds to 0.0.0.0 and a random ephemeral port.

jjhzyzn0

jjhzyzn06#

INADDR_ANY是一个常量,其值包含0。这将使用只有当你想从所有的活动端口连接你不关心ip-add .因此,如果您想连接任何特定IP,您应该像my_sockaddress.sin_addr.s_addr = inet_addr(“192.168.78.2“)那样指定

ua4mk5z4

ua4mk5z47#

#include <arpa/inet.h>                                                                     
.                                                                                   
.                                                                                        
tcpsock.sin_addr.s_addr = inet_addr("192.168.1.2")

为我工作

相关问题