You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:46:02