2017-04-11 24 views
0

我目前正在使用System.Net.Sockets.Socket.Send發送TCP數據時的假設,我保證會得到一個異常if連接下降。是否有可能在OS層沒有收到C#應用程序頂部的通知/異常的情況下刪除連接?是否有可能丟棄一個tcp連接,但沒有收到通知/異常

我不認爲在.net中會出現這種情況,但我會如何去證明這件事對於懷疑的人。

+0

使用TCP,沒有「包」這樣的東西。 TCP是一種面向流的協議,意味着數據只是一個大的字節流。如果您在數據流結束之前接收到數據(接收操作以0字節結束),則可以100%肯定發送給您的所有數據實際上都已收到。當然,如果你強行終止連接,或者如果你保持連接打開,並且想知道你是否收到了迄今爲​​止發送的所有內容,那麼沒有......沒有辦法知道你有沒有辦法。 –

+0

如果您是發件人,那麼確保遠程端點已收到您的數據的唯一方法是詢問它。當然,實現這一點的一種方式是讓您的應用程序級協議要求遠程端點保持連接處於打開狀態,直到它收到您發送的所有數據爲止。在這種情況下,從遠程終端接收流結束_from_通知發件人他們已經收到了一切。但顯然這適用於數據向一個方向發展;兩個端點不可能知道每個端點都收到了對方的數據,而無需進行額外的協商。 –

+0

當我說包時,我指的是包含TCP段的IP數據報。 –

回答

0

其實據我所知這是可能的。想象一下,你創建一個數據包發送它,並順便說一句。 O應該在ttl超時時自動重新傳輸。在放棄之前它會重試幾次。據我所知,更高級的防火牆有一個小的選項。有或沒有通知的情況下。其次看起來數據包在去往目的地的途中「丟失」了。他們實際上收到了它,但是讓我們說 - 沒有任何答案就將它們發送給null。 我不知道socket.send的工作原理,但從網絡的角度來看,可能無法確認每個丟失/丟棄的數據包。

相關問題