有时当我尝试连续发送一些数据包时(我正在使用send()API),我收到此错误。现在我不确定我该怎么办。我有这些问题: 1)我可以重新发送吗?如果是,那么我应该多久再试一次。是否有任何特定的策略可供遵循
2)缓冲区大小是否超出其限制是唯一的原因?
3)有人可以给我一个更好的主意/代码,如何处理这种情况。
感谢。 Sambit。
答案 0 :(得分:3)
从send():“EAGAIN - 套接字被标记为非阻塞,请求的操作将被阻止。”并且
当消息不适合套接字的发送缓冲区时,发送正常的块,除非套接字已置于非阻塞I / O模式。在非阻塞模式下,它会在这种情况下返回EAGAIN。 select(2)调用可用于确定何时可以发送更多数据。
This thread有一个使用select()来处理EAGAIN的简单示例,接下来是关于表面下隐藏着什么类型的惊喜的重要讨论。
答案 1 :(得分:2)
当没有剩余出站缓冲区时,通常会返回EAGAIN。等待多长时间取决于底层连接的速度。通常的方法是等到select()或poll()告诉您套接字可用于写入。如果在Linux上,请查看select_tut(2)联机帮助页,当然还有send(2)联机帮助页。
如果您希望呼叫等待,直到有可用空间,您可以更改为阻止操作(这是默认设置)。或者您可以调用select(2)等待套接字可写,然后再试一次。
还有一个重要的考虑因素。如果您要发送UDP数据包,请记住,不能保证拥塞控制,如果您通过Internet发送数据包,如果您尝试尽可能快地发送UDP数据包,则几乎肯定会丢失数据包(这不一定适用于其他数据报套接字,如Unix套接字)。