请考虑以下用于接受连接的代码:
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
参数是一个value-result参数:调用者必须初始化它才能包含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_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));
修改
不清楚在哪种情况下"地址的实际大小"可能有用。
如果"从对等方获得的地址"的实际大小在某种程度上是有用的,那么"地址的实际大小"从本地主机获得时也必须有用。然后必须有一种方法来获得"地址的实际大小"对于struct sockaddr
和connect
中使用的bind
,因为bind
和connect
都不会这样做。那么,在不使用accept
的情况下,我们如何获得它们呢?
为什么bind
和connect
未设置"地址的实际大小"。
操作系统:Linux
答案 0 :(得分:1)
地址参数是accept()
中的输出,但bind()
和connect()
中的输入。因此,它及其关联的长度值结果参数都需要在accept()
而不是bind()
和connect()
中可写。