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

如何在Linux非阻塞TCP客户端套接字中让::write()返回0?

复现特定TCP场景的求助

我正尝试复现以下场景:

  • 套接字关闭并返回0
  • 缓冲区大小非零(已观测到)
  • 观测到write()返回0后套接字状态为CLOSE_WAIT
  • 服务器已关闭
  • 使用Solarflare网卡
  • 开启TCP_NODELAY

我曾偶然遇到该场景,但尝试多种组合均无法复现,恳请各位提供建议。

注:此问题并非询问非阻塞write是否能返回0或其含义,而是寻求复现该场景的方法。

相关::write()代码(简化非套接字逻辑)

signal(SIGPIPE, SIG_IGN);
const uint64_t length=1000000;
char buffer[1000000];
while(true)
{
  ssize_t ret = ::write(fd, buffer, length);
  if (ret>=0)
  {
    std::cout<<"ret "<<ret<<std::endl;
  }
  else
  {
    int errnum = errno;
    std::cout<<"errno "<<errnum<<std::endl;
    if (errnum != EAGAIN && errnum != EINTR)
      break;
  }
  ::sleep(1); // 1 second.
}

观测到的现象

打印ret 0后,持续打印errno 11(即EAGAIN),且netstat -anpc输出如下:

tcp        1      0 **.**.**.**:46298       **.**.**.***:****       CLOSE_WAIT  6622/./blabla

内容的提问来源于stack exchange,提问作者Vladimir Sakharuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:04