socket listen函数

#include <sys/socket.h>

int listen(int sockfd, int backlog);

返回:0--成功, -1--出错

函数listen仅被TCP服务器调用,它做两件事:

  1. 当函数socket创建一个套接口时,它被假设为一个主动套接口,也就是说,它是一个将调用connect发起连接的客户套接口,函数listen将未连接的套接口转换成被动套接口,指示内核应接受指向此套接口的连接请求。调用函数listen导致套接口从CLOSED状态转换到LISTEN状态。
  2. 函数的第二个参数规定了内核为此套接口排队的最大连接个数。

一般来说,此函数应在调用函数socket和bind之后,调用函数accept之前调用。为了理解参数backlog,我们必须明白,对于给定的监听套接口,内核要维护两个队列:

  1. 未完成连接队列(incomplete connection queue),为每个这样的SYN分节开设一个条目:已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程。这些套接口都处于SYN_RCVD状态。
  2. 已完成连接队列(completed connection queue),为每个已完成TCP三路握手的客户开设一个条目。这些套接口都处于ESTABLISHED状态。

当来自客户的SYN到达时,TCP在未完成连接队列中创建一个新条目,然后三路握手的第二个分节即服务器的SYN响应,并附带对客户SYN的ACK。这个条目一致保留在未完成连接队列中,直到三路握手的第三分节到达或本条目超时才撤销。如果三路握手正常完成,改条目从未完成连接队列搬到已完成队列的队尾。当进程调用函数accept时,已完成队列中的队列头条目返回给进程,但当队列为空时,进程将睡眠,直到有条目放入已完成连接队列才唤醒它。

从上述看出,参数backlog并不表示socket可连接的client的最大个数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值