linux socket编程之listen函数
linux socket:相关的一些函数的介绍,是从linux的man帮助文档中翻译来的,如果有不正确的地方,欢迎指正。listen #includeint listen(int sockfd, int backlog);返回值 : 成功返回0,失败返回-1,并将errno设置为对应的错误描述 : listen()函数将
#include <sys/socket.h>
int listen(int sockfd, int backlog);
返回值:
成功返回0,失败返回-1,并将errno设置为对应的错误。
描述:
listen()函数将sockfd标记为被动打开的套接字,并作为accept的参数用来接收到达的连接请求。
sockfd是一个套接字类型的文件描述符,具体类型为SOCK_STREAM或者SOCK_SEQPACKET。
acklog参数用来描述sockfd的等待连接队列能够达到的最大值。当一个请求到达并且该队列为满时,客户端可能会收到一个表示连接失败的错误,或者如果底层协议支持重传(比如tcp协议),本次请求会被丢弃不作处理,在下次重试时期望能连接成功(下次重传的时候队列可能已经腾出空间)。
错误:
EADDRINUSE 另一个套接字已经绑定在相同的端口上。
EBADF 参数sockfd不是有效的文件描述符。
ENOTSOCK 参数sockfd不是套接字。
EOPNOTSUPP 参数sockfd不是支持listen操作的套接字类型。
相关:
listen函数首次出现在 4.2BSD。
注意:
为了能够正常接收到连接请求,必须的流程如下:
1. 调用socket函数创建对应的套接字类型。
2. 调用bind函数将套接字绑定到本地的一个端口地址,其他的套接字可以调用connect函数连接该地址。
3. 接受到来连接请求的意向以及到来请求队列的限制是listen提供的。
4。调用accept函数接收到来的连接请求。
特殊说明backlog参数的含义:
backlog参数的行为在linux2.2中发生了变化。现在用来表示完成连接的处于established状态等待被accept的socket的队列的大小,而不是等待连接的请求队列的大小。
未完成连接的队列大小可以在/proc/sys/net/ipv4/tcp_max_syn_backlog中被设置。当syncookies生效时,没有逻辑上的该值的最大值,因此该设置无效。
如果backlog的值比/proc/sys/net/core/somaxconn中的还要大,则会被截断,文件中默认的值的大小是124。
更多推荐
所有评论(0)