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/