2011-04-07 81 views
1

如果客戶端通過正常的tcp連接連接到服務器,並且稍後客戶端的連接斷開,服務器將獲得(假設爲主動模式){tcp_closed,Socket}。但有些情況下,服務器不知道客戶端已斷開連接,如電源故障或崩潰等(我相信,我可能是錯的)。在這些情況下,客戶端消失了,但服務器仍然認爲它已連接。如果服務器在這種情況下嘗試向客戶端發送消息,它是否會假定客戶端收到消息,或者tcp堆棧是否會在低級別上對其進行排序,並且服務器返回某種錯誤?Erlang:在關閉的連接上發送

我知道這是一個簡單的問題,但我一直無法自己測試它,因爲我無法讓客戶端發生災難性的失敗,就像我需要它(甚至殺死-9沒有這樣做) 。有人對這個有經驗麼?

+2

TCP會知道該消息沒有被傳遞,但Erlang是否會接受它是一個不同的問題。您是否嘗試拔掉客戶端的以太網電纜?這是非常低的影響和易於測試。 – nmichaels 2011-04-07 17:50:14

+0

我只使用我自己的機器來測試使用本地主機,我目前無法訪問另一臺機器。 – 2011-04-07 17:51:19

+0

啊,沒有趣......我想你可以使用虛擬機,但是這比在虛擬機上提問要方便得多。 – nmichaels 2011-04-07 17:53:30

回答

3

答案取決於。當您嘗試發送數據時,內核TCP窗口將緩慢填充,直到它無法接收更多數據。那麼你的發送將被阻塞,因爲內部內核緩衝區已滿。 TCP有一些定時器會在一段時間後觸發。當發生這種情況時,內核會錯誤發送請求,Erlangs VM運行時會將其轉換爲{error, Reason},其中Reason是來自底層系統的posix()錯誤消息。

如果您想確保數據通過,您必須以其他方式在流上確認。或者您可以使數據具有冪等性,以便您可以毫無問題地重新發送數據。如果另一個端點客戶端是像移動電話一樣的設備,那麼斷開連接將一直髮生,這一點尤其重要。

要測試它,您可以阻止與lo上的防火牆規則進行通信。

相關問題