限制最大并发连接数
应对accept()时文件描述符file descriptor耗尽的办法
- 服务端用Reactor模式处理并发连接
- 在某个端口
listen
连接socketFd = accept(listenFd)
epoll
电平触发,如果有新连接就到达返回- 用
accept()
来活得新连接的socketfd
- 在某个端口
- 假如
accept()
返回错误EMFILE
该怎么办- 进程的文件描述符用完,无法创建
socketfd
- 由于无法拿到
socketfd
,也就无法close()
- 在下次
epoll_wait()
时会立刻返回,因为新连接还在那里,listenfd
还是可读的 - 程序陷入
busy loop
- 进程的文件描述符用完,无法创建
- 应对的方法
- 准备一个空闲的文件描述符,
nullfd = open("/dev/null")
close(nullfd)
获得文件描述符空间,然后accept
,close(socketFd)
,然后再nullfd = open("/dev/null")
,这个方法不是线程安全的
- 准备一个空闲的文件描述符,
限制并发连接数
增加一个int
的成员,表示当前的活动连接数,如果超过最大的允许数,则关闭连接。