一句话总结:采用一个空闲的文件描述符来解决
accept函数
头文件:
<sys/types.h>
<sys/socket.h>
函数形式
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
返回值
成功:返回新的套接字文件描述符
失败:返回-1,记录错误信息errno
EAGAIN:套接字处于非阻塞状态,当前没有连接请求。EBADF:非法的文件描述符。
ECONNABORTED:连接中断。
EINTR:系统调用被信号中断。
EINVAL:套接字没有处于监听状态,或非法的addrlen参数。
EMFILE:达到进程打开文件描述符限制。
ENFILE:达到打开文件数限制。
ENOTSOCK:文件描述符为文件的文件描述符。
EOPNOTSUPP:套接字类型不是SOCK_STREAM。
int connfd = accept4(listenfd, (struct sockaddr*)&sockaddr, &socklen, SOCK_NONBLOCK | SOCK_CLOEXEC);
if (connfd == -1)
{
if (errno == EMFILE)
{
close(idlefd);
idlefd = accept(listenfd, NULL, NULL);
close(idlefd);
idlefd = open("/dev/null", O_RDONLY | O_CLOEXEC);
continue;
}
else
ERR_EXIT("accept4");
}