gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:51:53 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com