Linux socket 编程API listen(SOCKET s, int backlog)

本文详细解析了listen函数的工作原理,包括其在服务器端的作用、参数含义及如何管理未完成和已完成连接队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数原型:#int listen (int sockfd, int backlog);

该函数在bind()之后accept()调用之前调用。第一个参数为已经创建的监听socket, 第二个参数是socket 监听队列最大监听连接数。

对于一个给定的监听socket,内核其实维护了两个队列:未完全连接队列和完全连接队列。

未完全连接队列主要存放的是客户端发过来的SYN 报文实体, 此时sockets 处于SYN_RCVD状态。

完全连接队列存放的是经过三此握手建立连接的实体,此时队列中的sockets处于ESTABLISHED状态, accep()调用从该队列中获得socket实体。

未完全连接队列中的实体和完全连接队列的转换过程:

当客户端SYN报文到达时,TCP在未完全连接队列中建立一个相应的实体,并发确认报文(即服务器SYN报文),该实体一直呆在未完全连接队列等待三次握手的第三个报文或者时间超时,当第三个报文到达后该实体从未完全连接队列移动到完全连接队列,等待accep()函数调用。转换图如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值