接收连接

函数原型

1
2
3
4
#include <sys/types.h>
#include <sys/socket.h>

int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen);

形参

sockfd参数是执行listen系统调用监听的socket。addr参数用来获取被接受连接的远端socket地址,该socket地址的长度由addrlen参数指出。

返回值

成功时,返回一个文件描述符,用来标识被接受的这个连接,服务器可通过读写该文件描述符与被连接的对应的客户端通信。如果accept失败,则返回-1,并且设置errno。

accept函数扩展

accept只是从监听队列中取出连接,而不论连接处于何种状态,更不关心任何网络状况的变化;因此如果监听队列中处于ESTABLISHED状态的连接对应的客户端出现了网络异常,或者提前退出,服务器对这个连接执行的accept函数是可以正常返回的。

注意:检测客户端网络出现异常的情况的通常采用的方式是服务端发送心跳包。