2016-11-25 101 views
0

假設我使用System.Net.Sockets.TcpClient連接到某人。我發送消息給他們,然後我立即調用TcpClient.Close();另一個客戶是否保證收到消息?另外,在大多數TCP實現中,這是真/假嗎?TCP - 發送消息,然後斷開

+1

總之 - 不,不能保證(除了一些特定的條件/用法) – Vlad

+0

出於好奇,爲什麼TCP上UDP,如果你正在尋找一個火災和遺忘類型的消息? – ColinM

+0

@ColinM - 我正在製作一個聊天應用程序,並試圖找到「踢」某人的最佳方式。我希望服務器可以發送一條消息,說明該人已被X踢了Y原因,然後立即關閉連接並斷開連接。 –

回答

1

Vlad的評論是正確的 - 交付不能保證。

假設建立了與對等方的TCP連接。發送操作只是將數據複製到操作系統中的網絡堆棧,並且發送它是OS的責任。你稱操作關閉。操作系統不會停止發送以前的數據。 OS將套接字關閉直到數據被髮送。從應用的角度來看它是透明的。

但是可能會發生錯誤。對方可能會崩潰,網絡可能會中斷或者其他任何事情。儘管如果TCP ACK未收到,操作系統會嘗試重新傳輸數據,但重新發送可能會一次又一次地失敗,直到操作系統放棄。這種通用機制在所有實現TCP協議的操作系統中都是相同的。

如果您需要有保證的交付,那麼您必須實施應用程序級別機制來確認收到的數據。