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

时间:2018-04-30 05:00:29

标签: 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参数是一个value-result参数:调用者必须初始化它才能包含   addr指向的结构的大小(以字节为单位);返回时它将包含实际大小   对等地址。

另一方面,bindconnect未设置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 sockaddrconnect中使用的bind,因为bindconnect都不会这样做。那么,在不使用accept的情况下,我们如何获得它们呢? 为什么bindconnect未设置"地址的实际大小"。

操作系统:Linux

1 个答案:

答案 0 :(得分:1)

地址参数是accept()中的输出,但bind()connect()中的输入。因此,它及其关联的长度值结果参数都需要在accept()而不是bind()connect()中可写。