我正在編寫一個網絡C程序,客戶端向服務器發送數據塊,並且我希望 確保服務器在關閉客戶端套接字之前已讀取所有數據側。我想從服務器發送一個特殊的'ok'字符到客戶端,但我想如果在執行服務器程序期間發生了錯誤,服務器關閉了管道(例如讀取系統調用失敗),客戶將等待讀取系統調用以獲取永不會發生的事情。任何關於如何解決這個問題的想法?服務器 - 客戶端通信
感謝, 尼科斯
我正在編寫一個網絡C程序,客戶端向服務器發送數據塊,並且我希望 確保服務器在關閉客戶端套接字之前已讀取所有數據側。我想從服務器發送一個特殊的'ok'字符到客戶端,但我想如果在執行服務器程序期間發生了錯誤,服務器關閉了管道(例如讀取系統調用失敗),客戶將等待讀取系統調用以獲取永不會發生的事情。任何關於如何解決這個問題的想法?服務器 - 客戶端通信
感謝, 尼科斯
我想確保所有的數據都 被服務器B * 安伏讀我關閉 插座從客戶端 *。
如果您使用的是TCP考慮一下:當你發送的數據,即使你關閉套接字/退出程序,TCP堆棧將繼續盡最大努力把它。
一旦你send
/write
的數據,它已經從你手中消失了。它被複制到內核緩衝區並在一段時間後發送。在幕後(netinet
深處),連接不關閉,直到所有發送的數據已被確認/連接因其他原因而終止。
您提出的實施聽起來不錯,對我來說 - 如果一些錯誤發生了,這是一個特殊情況 - 趕上這一點,你需要使用一個超時您讀的呼叫。
在客戶端實現超時。在服務器的響應中等待一些可配置/合理的時間。如果這段時間過去了,相應採取行動。
alternating bit protocol是一種解決方法。有不同的實現方式。
當A發送消息時,它重新發送它連續 ,具有相同的序列 號,直到它接收到來自乙一個 確認包含 相同的序列號。當發生 時,A補充(翻轉) 序列號並開始發送下一個消息 。
有沒有必要擔心什麼時候關閉客戶端的套接字。只要數據已寫入套接字,隨後可以隨時關閉它。 @cnicutar在他的回答中提供了一個很好的解釋。
至於從您的服務器回到客戶端的特殊確認字符,您不應該擔心與TCP。但是,您可能需要修改數據塊,以便它包含一個指示有多少數據的標題。例如,數據塊的前4個字節可以是一個長度字段,表示有多少字節。服務器可以讀取前4個字節,然後知道要讀取多少字節。 TCP通信通常具有類似的情況。
好像有你的客戶端四種可能的結果:
前三個可以在客戶端上直接處理。爲了處理第四個問題,你需要在客戶端實現一個超時 - 但是那時你會冒着提前超時的風險,當時服務器的響應速度很慢,而不是真正的中斷。可能最好的辦法是讓超時時間非常慷慨(例如30秒?),並確保您的服務器可靠並且不會掛起。 :)
你使用TCP或UDP? – 2011-05-31 16:24:47
@Matt Davis:我正在使用TCP – nikos 2011-05-31 16:25:53