socket API--listen

函数原型

   #include <sys/socket.h>
   int listen(int sockfd, int backlog);

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

1.把一个未连接的socket转换成一个被动socket, 指示内核应接受指向该socket的连接请求,调用listen导致socket由CLOSED状态转换到LISTEN状态。

2.函数的第二个参数规定了内核应该为相应socket排队的最大连接个数。

listen函数通常应该在调用socket和bind后,并在调用accept之前调用。

参数简介

sockfd
	socket描述符,标识一个socket.

backlog
	socket监听队列的长度,表示当前socket支持的最大待处理的连接请求数。

返回值

成功返回0; 错误返回-1,并设置errno.

backlog详解

内核为任何一个给定的TCP socket维护两个队列

1.未完成队列,每个SYN对应一项:已由某个客户端发出并到达服务器,而服务器在等待完成相应的TCP三路握手过程。这些socket处于SYN_RECVD状态。

2.已完成队列,每个已完成TCP三路握手过程的客户对应其中一项。这些socket处于ESTABLISHED状态

当来自客户的SYN到达时,TCP在未完成队列中创建一个新项,然后回复SYN/ACK。这一项一直保留在未完成队列中,直到客户端的ACK到达或超时为止。如果三路握手过程完成,该项被移到已完成队列的队尾。当进程调用accept时,已完成队列的头项将返回给进程,或者如果该队列为空,那么进程被阻塞。

关于这两个的队列的处理,有几点需注意:

  1. backlog指定了两个队列总和的最大值,但是这是与实现有关的,应与具体实现为准。
  2. 不要把backlog设为0,因为不同的实现对些有不同的解释。
  3. 对一人繁忙的服务器,backlog应指定一个较大的值。
  4. 当一人客户SYN到达时,若这些队列是满的,TCP会忽略该SYN. 对客户来说相当于没有回应。
  5. 三路握手完成后,但在服务器调用accept之前到达的数据由服务器TCP排队,最大数量为相应连接的接收缓冲区大小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值