sockets - 需要更多关于 listen system call linux 的见解

标签 sockets tcp network-programming udp system-calls

int listen(int sockfd, int backlog);

这是 linux 手册页的描述

listen() 将 sockfd 引用的套接字标记为被动套接字, 也就是说,作为将用于接受传入连接的套接字 使用 accept(2) 请求。

sockfd 参数是一个文件描述符,它指向一个套接字 键入 SOCK_STREAM 或 SOCK_SEQPACKET。

积压参数定义队列的最大长度 sockfd 的挂起连接可能会增长。如果一个连接请求 当队列已满时到达,客户端可能会收到一个错误 ECONNREFUSED 的指示,或者,如果底层协议(protocol)支持 重传时,该请求可能会被忽略,以便稍后重试 连接成功。

让我非常困扰的是为什么我们实际上需要调用listen。是不是让服务器开始监听绑定(bind)的地址和端口。一旦绑定(bind)地址和端口不是这样吗到套接字描述符,客户端可以简单地连接到该绑定(bind)地址。当我们在创建 UDP 服务器期间不进行监听调用时,会变得更加困惑,UDP 服务器是否会在绑定(bind)地址后立即自动开始监听

最佳答案

主机可以随时随地接收来自任何地方的数据包。使用 TCP,在您调用 listen 之前,操作系统会使用 RST 数据包响应任何到达的数据包。 listen 之后,它将使用 SYN-ACK 数据包回复 SYN 数据包,并将有关远程端的信息添加到待定“连接”列表中,现在连接已建立。

UDP 没有连接。如果应用程序正在等待 UDP 数据包并且有一个到达,操作系统会将数据包传递给应用程序。如果没有人期待数据包,操作系统会丢弃它们。

bind 函数只是给出套接字的地址。它不仅限于在服务器中使用,您还可以在客户端套接字上使用 bind 来设置您连接的 IP 和端口。它通常不是必需的,因此您不会经常看到它。

关于sockets - 需要更多关于 listen system call linux 的见解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078223/

相关文章:

c# - TCP 客户端有时会合并数据包

networking - Netmap/PF_RING 和 TCP 分段卸载和大型接收卸载

Python unittest 在单个套接字的 tcp 服务器上进行多个测试

c - 如果我使用 libnetfilter_queue 进行更改,网络数据包将被拒绝

java - 为什么会发生这种情况?

objective-c - Objective-C 中的 TCP/IP?

java - java中的socket问题

c# - 如何使用 .net 获取子网掩码?

c++ - C/C++ - 为 PUT 请求实现 http 协议(protocol)

C Accept Client Socket "Invalid Argument"添加信号线程时出错