Sockets accept()与bind()和connect()有何不同?

Sockets accept()与bind()和connect()有何不同?,sockets,tcp,Sockets,Tcp,考虑以下接受连接的代码: struct sockaddr_in peer_addr; socklen_t peer_addr_size = sizeof (struct sockaddr); int peer_fd = accept(fd, (struct sockaddr *) &peer_addr, &peer_addr_size); 在accept(2)中说: addrlen参数是一个值结果参数:调用者必须初始化它以包含 addr指向的结构的大小(字节);返回时,它将包含

考虑以下接受连接的代码:

struct sockaddr_in peer_addr;
socklen_t peer_addr_size = sizeof (struct sockaddr);
int peer_fd = accept(fd, (struct sockaddr *) &peer_addr, &peer_addr_size);
accept(2)
中说:

addrlen
参数是一个值结果参数:调用者必须初始化它以包含
addr
指向的结构的大小(字节);返回时,它将包含实际大小 对等地址的名称

另一方面,
bind
connect
不设置结构的大小,由
addr
指向:

struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bind(fd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr));
编辑

目前尚不清楚“地址的实际大小”在哪些情况下可能有用。 如果从对等机获得的“地址的实际大小”在某种程度上是有用的,那么从本地主机获得的“地址的实际大小”也必须是有用的。然后必须有一种方法来获取
struct sockaddr
的“地址的实际大小”,它在
connect
bind
中使用,因为
bind
connect
都不这样做。那么,在不使用
accept
的情况下,我们如何获得它们呢? 为什么
bind
connect
不设置“地址的实际大小”


OS:Linux

地址参数是
accept()
中的输出,但是
bind()
connect()
中的输入。因此,它及其关联的长度值结果参数都需要在
accept()
中可写,而不是在
bind()
connect()
中可写,它也是
accept
中的输入参数-请参阅“调用者必须初始化它”。问题是为什么
addr
bind
connect
中不是“输出参数”?(或者等效地,为什么
addr
accept
中的“输出参数”)。在什么情况下,我们可能需要“地址的实际大小”?不,读我写的。地址参数只是
accept()
中的一个输出参数。address length参数也是一个输入,或者使用我和您引用的文档使用的单词,是一个value result参数。它们不是
bind()
connect()
中的输出参数,因为这些函数读取它们,而不是写入它们,因为它们的语义。您正在告诉他们绑定或连接到什么:
accept()
告诉您连接客户端的远程地址。如果从对等方获取的“地址的实际大小”在某种程度上是有用的,那么从本地主机获取的“地址的实际大小”也必须是有用的。然后必须有一种方法来获取
struct sockaddr
的“地址的实际大小”,该地址在
connect
bind
中使用,从本地主机获取时如何?无论是
bind()
还是
connect()
都不会这样做。你以某种方式获得了它,并为这些函数提供了它和它的长度。而不是相反。我已经说过两次了。我提供了
sizeof(struct sockaddr)
bind
connect
,而不是“地址的实际大小”。在第一条评论中,我的意思是“地址长度”,而不是
addr
。另外,请参见OP中的编辑。
struct sockaddr_in peer_addr;
peer_addr.sin_family = AF_INET;
peer_addr.sin_port = htons(PORT);
peer_addr.sin_addr.s_addr = inet_addr(ADDR);
connect(fd, (struct sockaddr *) &peer_addr, sizeof (struct sockaddr));