linux socket编程之listen函数


#include

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。

你可能感兴趣的:(linux网络编程,网络)