本文主要是介绍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之前调用。
参数简介
sockfdsocket描述符,标识一个socket.backlogsocket监听队列的长度,表示当前socket支持的最大待处理的连接请求数。
返回值
成功返回0; 错误返回-1,并设置errno.
backlog详解
内核为任何一个给定的TCP socket维护两个队列
1.未完成队列,每个SYN对应一项:已由某个客户端发出并到达服务器,而服务器在等待完成相应的TCP三路握手过程。这些socket处于SYN_RECVD状态。
2.已完成队列,每个已完成TCP三路握手过程的客户对应其中一项。这些socket处于ESTABLISHED状态
当来自客户的SYN到达时,TCP在未完成队列中创建一个新项,然后回复SYN/ACK。这一项一直保留在未完成队列中,直到客户端的ACK到达或超时为止。如果三路握手过程完成,该项被移到已完成队列的队尾。当进程调用accept时,已完成队列的头项将返回给进程,或者如果该队列为空,那么进程被阻塞。
关于这两个的队列的处理,有几点需注意:
- backlog指定了两个队列总和的最大值,但是这是与实现有关的,应与具体实现为准。
- 不要把backlog设为0,因为不同的实现对些有不同的解释。
- 对一人繁忙的服务器,backlog应指定一个较大的值。
- 当一人客户SYN到达时,若这些队列是满的,TCP会忽略该SYN. 对客户来说相当于没有回应。
- 三路握手完成后,但在服务器调用accept之前到达的数据由服务器TCP排队,最大数量为相应连接的接收缓冲区大小。
这篇关于socket API--listen的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!