linux - 写入 TCP 套接字不断返回 EAGAIN

标签 linux sockets networking tcp

我遇到这样一种情况,我有一个正在写入的 TCP 套接字(非阻塞),但在负载下它会进入不断返回 EAGAIN 的情况。我知道这是因为它停止了处理,我可以附加一个调试器并单步执行它。单步执行,写入调用返回一个错误,errno 每次都设置为 EAGAIN(它忙于等待 EAGAIN...忽略这是个坏主意:)

我的理解是,如果缓冲区已满,EAGAIN 应该只在写入时返回,但我不明白什么会阻止它耗尽和写入调用最终成功。

这是 Ubuntu,Linux 内核 3.19.0-47-generic。

想法?

最佳答案

阻止它耗尽的原因是同行的阅读速度不如您的写作速度。对等方的接收缓冲区已满,您的发送缓冲区已满,您无法写入。

it busy-waits on EAGAIN...ignore that this is a bad idea

我不能忽视这一点。这是个坏主意。您应该在这种特定情况下使用 select() 来告诉您套接字何时可写,而不是无意识地循环。

关于linux - 写入 TCP 套接字不断返回 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539580/

相关文章:

c++ - 在 C++ 中使用 popen 调用时 cli 实用程序崩溃。在 shell 或 fork、exec 等中工作正常

python - 如何在 Python 中获取特定程序的当前 CPU、GPU 和 RAM 使用情况?

java - 如何使我的 Java 服务器可供世界各地使用?

c - 通过无线连接的两台计算机之间的信息交换

http - 通过 TCP/IP 端口不断读取/写入数据。哪一个?

ios - 从循环中的 URL 下载图像以获取 Collection View

linux - QEMU 错误且权限被拒绝

linux - 可以通过路由器回显 AT 命令的结果吗?

python - 使用 python 发送屏幕截图

c++ - 如何确定其他进程是否正在使用文件描述符?