放弃对EAGAIN的回复

时间:2014-01-31 13:21:09

标签: sockets

我有一个客户端应用程序,它通过套接字连接重复发送命令到服务器并接收相应的响应。此套接字连接具有发送/接收超时集。

如果服务器由于某种原因响应缓慢,则客户端会收到EAGAIN。在超时时,我希望客户端忽略该响应并继续发送下一个请求。

但是,目前当我忽略EAGAIN并发送下一个请求时,我会收到先前请求的响应。

忽略/放弃EAGAIN上的响应的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

你做不到。你必须阅读它。没有机制可以忽略TCP字节流中的字节。

答案 1 :(得分:1)

EAGAIN可能表示已超时(您还需要处理EWOULDBLOCK)。如果您使用TCP,则必须才能读取待处理数据,然后才能读取任何后续数据。如果在读取时得到EAGAIN,则必须使用相同的参数再次执行相同的读取。仅仅因为服务器响应缓慢(或者网络传递响应很慢)并不意味着响应根本不会到达,除非连接关闭/丢失。

如果您真的希望能够无序接收响应,则需要设计通信协议以支持响应。为每个请求提供一个在其响应中回显的唯一ID。发送请求但不要等待响应到达。这将允许客户端一次有多个飞行请求,并允许服务器以任何顺序发回响应。客户端必须在到达时读取每个响应(这意味着您必须异步读取,通常使用单独的线程或其他并行信令机制)并将每个响应的ID与其原始请求进行匹配,以便您知道如何处理它。