C语言非阻塞TCP服务器accept()返回-1(errno=11)问题求助
非阻塞TCP服务器中accept()返回EAGAIN的处理建议
关于EAGAIN错误的处理
不能直接忽略,但这不是需要排查的异常错误——非阻塞模式下,accept()返回EAGAIN(errno=11)完全是正常行为,它表示当前没有新的客户端连接请求到达。你需要做的是:
- 检测到EAGAIN时,跳过后续的连接建立逻辑,转而执行定期发送输出的任务
- 之后回到循环中,再次尝试调用
accept()
关于select()方案的可行性
用select()结合套接字集合是处理这类场景的标准方案,完全不用担心问题,反而能更高效地统筹“监听新连接”和“定期发送输出”两个任务,具体实现思路:
- 将监听套接字加入
readfds集合,调用select()时设置一个超时时间(这个时间就对应你定期发送输出的周期) - 如果
select()返回值大于0,且监听套接字在readfds中,说明有新连接请求,此时调用accept()不会返回EAGAIN,可以正常处理连接 - 如果
select()返回0,说明超时,此时执行定期发送输出的逻辑 - 处理
select()可能出现的信号中断错误(比如errno=EINTR),做好重试即可
额外注意事项
- 不用
select()的话,直接循环处理accept()的EAGAIN会导致CPU空转,而select()的超时机制刚好能避免这个问题 - 当存在已连接的客户端套接字时,要把它们也加入
select()的集合中,这样可以同时处理客户端的命令输入,避免阻塞定期输出任务
内容的提问来源于stack exchange,提问作者user1538798
相关产品推荐
相关产品推荐

