如何在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
相关产品推荐
相关产品推荐

