2014-01-31 44 views
0

我有一個客戶端應用程序,通過套接字連接重複地發送命令到服務器並接收相應的響應。這個套接字連接有一個發送/接收超時設置。在EAGAIN上放棄響應

如果服務器由於某種原因響應緩慢,客戶端會收到EAGAIN。在超時時,我希望客戶端忽略該響應並繼續發送下一個請求。

但是,當我忽略EAGAIN併發送下一個請求時,我收到來自先前請求的響應。

在EAGAIN上忽略/放棄響應的最佳方法是什麼?

回答

1

你不行。你必須閱讀它。沒有機制可以忽略TCP字節流中的字節。

+0

@Seymour你錯了。 OP詢問如何做一些根本無法完成的事情。答案是這樣說的。沒有批評或澄清是必要的。如果你認爲你知道的更好,我建議你發佈你的答案,以便我們可以評論,投票等。 – EJP

1

EAGAIN可能表示已經超時(您還需要處理EWOULDBLOCK)。如果您使用的是TCP,則您必須在讀取任何後續數據之前必須讀取待處理數據。如果在讀取時獲得EAGAIN,則必須使用相同的參數再次執行相同的讀取操作。僅僅因爲服務器響應緩慢(或者網絡傳輸響應緩慢)並不意味着響應不會到達,除非連接關閉/丟失。

如果您確實希望能夠按順序接收響應,您需要設計自己的通信協議以便首先支持該響應。爲每個請求提供一個在其響應中回顯的唯一ID。發送請求但不要等到響應到達。這將允許客戶一次有多個請求,並允許服務器以任何順序發回響應。客戶端必須在每個響應到達時讀取它(這意味着您必須異步執行讀取,通常使用單獨的線程或其他並行信號機制),並將每個響應的ID與其原始請求進行匹配,以便您知道如何處理它。

+0

EAGAIN不能是'錯誤的'。它的真正含義是響應花費的時間比超時時間長,這反過來可能表明超時時間太短。它應該足夠長,以便任何到期表明真正的連接問題。 – EJP