2011-05-31 154 views
1

我正在編寫一個網絡C程序,客戶端向服務器發送數據塊,並且我希望 確保服務器在關閉客戶端套接字之前已讀取所有數據側。我想從服務器發送一個特殊的'ok'字符到客戶端,但我想如果在執行服務器程序期間發生了錯誤,服務器關閉了管道(例如讀取系統調用失敗),客戶將等待讀取系統調用以獲取永不會發生的事情。任何關於如何解決這個問題的想法?服務器 - 客戶端通信

感謝, 尼科斯

+0

你使用TCP或UDP? – 2011-05-31 16:24:47

+0

@Matt Davis:我正在使用TCP – nikos 2011-05-31 16:25:53

回答

1

我想確保所有的數據都 被服務器B * 安伏讀我關閉 插座從客戶端 *。

如果您使用的是TCP考慮一下:當你發送的數據,即使你關閉套接字/退出程序,TCP堆棧將繼續盡最大努力把它

一旦你send/write的數據,它已經從你手中消失了。它被複制到內核緩衝區並在一段時間後發送。在幕後(netinet深處),連接不關閉,直到所有發送的數據已被確認/連接因其他原因而終止。

+0

,所以如果我使用的是TCP,我建議不需要執行該檢查(從服務器發回的特殊查詢字符)。 – nikos 2011-05-31 16:31:15

+0

@nikos這就是我所建議的。不要在'TCP'確認數據,它比程序員更好。 – cnicutar 2011-05-31 16:32:12

+0

非常感謝:) – nikos 2011-05-31 16:36:31

0

您提出的實施聽起來不錯,對我來說 - 如果一些錯誤發生了,這是一個特殊情況 - 趕上這一點,你需要使用一個超時您讀的呼叫。

0

在客戶端實現超時。在服務器的響應中等待一些可配置/合理的時間。如果這段時間過去了,相應採取行動。

0

alternating bit protocol是一種解決方法。有不同的實現方式。

當A發送消息時,它重新發送它連續 ,具有相同的序列 號,直到它接收到來自乙一個 確認包含 相同的序列號。當發生 時,A補充(翻轉) 序列號並開始發送下一個消息 。

+0

認真嗎? *爲什麼*在TCP的極端複雜性之上分層這樣的協議?即使Tanenbaum這本糟糕的書也說,交替位協議會帶來*加載問題。 – cnicutar 2011-05-31 16:35:53

+0

tcp已經保證像cnicutar這樣的握手已經說過了。所以不理我的答案;) – mkind 2011-05-31 16:51:36

0

有沒有必要擔心什麼時候關閉客戶端的套接字。只要數據已寫入套接字,隨後可以隨時關閉它。 @cnicutar在他的回答中提供了一個很好的解釋。

至於從您的服務器回到客戶端的特殊確認字符,您不應該擔心與TCP。但是,您可能需要修改數據塊,以便它包含一個指示有多少數據的標題。例如,數據塊的前4個字節可以是一個長度字段,表示有多少字節。服務器可以讀取前4個字節,然後知道要讀取多少字節。 TCP通信通常具有類似的情況。

0

好像有你的客戶端四種可能的結果:

  1. 服務器執行命令併發送回「OK」。
  2. 服務器在執行命令時出現問題,而是發回錯誤字符串。
  3. 服務器嘗試執行命令時退出,崩潰或以其他方式消失,並且TCP連接已關閉。
  4. 服務器出問題並在嘗試執行命令時掛起,或者由於其他原因永不發回任何響應(但它保持TCP連接打開)。

前三個可以在客戶端上直接處理。爲了處理第四個問題,你需要在客戶端實現一個超時 - 但是那時你會冒着提前超時的風險,當時服務器的響應速度很慢,而不是真正的中斷。可能最好的辦法是讓超時時間非常慷慨(例如30秒?),並確保您的服務器可靠並且不會掛起。 :)