2016-11-14 62 views
0

我正在學習現在的計算機網絡。現在我知道TCP和UDP之間的一個很大的區別在於UDP在通信時可能會丟失數據包。我想知道C#如何應對這種失落。例如,一臺主機將"ABCD\n"字符串發送給另一臺主機。如果有丟包,接收主機是否丟棄exception或者只有"AB\n"? (另外),我想知道一些強制udpclient丟失數據包的方法。然後我可以做實驗。如果udpclient在C#中丟失了數據包會發生什麼?

回答

2

C#不在乎少 - 事實上它甚至不知道數據包丟失了。你的代碼/邏輯可能會或可能沒有與丟失的數據包有關的問題。這完全取決於您編寫的邏輯,並且與底層編程語言/運行時系統無關。

我也想你得太多/過於複雜的:丟失一個包===不發送一個...

+3

這是不完全正確,C#是在一個數據包 –

1

你應該自己(與語言無關)

例如實現CRC機制:

host1想發送給host2一個udp數據報。

  1. host1計算數據包crc,然後將數據包發送到host2。
  2. 當host2收到數據包時,應計算數據包crc,然後用該值回覆host1。
  3. host1比較兩個crc值,如果匹配,則數據包發送正確併到達主機2。如果不是host1則必須重新發送數據包。

這裏有一個C#CRC類的例子:

public static class Crc16 
{ 
    const ushort polynomial = 0xA001; 
    static readonly ushort[] table = new ushort[256]; 

    public static ushort ComputeChecksum(byte[] bytes) 
    { 
     ushort crc = 0; 
     for (int i = 0; i < bytes.Length; ++i) 
     { 
      byte index = (byte)(crc^bytes[i]); 
      crc = (ushort)((crc >> 8)^table[index]); 
     } 
     return crc; 
    } 

    static Crc16() 
    { 
     ushort value; 
     ushort temp; 
     for (ushort i = 0; i < table.Length; ++i) 
     { 
      value = 0; 
      temp = i; 
      for (byte j = 0; j < 8; ++j) 
      { 
       if (((value^temp) & 0x0001) != 0) 
       { 
        value = (ushort)((value >> 1)^polynomial); 
       } 
       else 
       { 
        value >>= 1; 
       } 
       temp >>= 1; 
      } 
      table[i] = value; 
     } 
    } 
} 
+0

注意,這可以防止數據包損壞,無法對數據包丟失的損失noticably難過。 ..你也應該知道[UDP有它自己的校驗和機制](https://en.wikipedia.org/wiki/User_Datagram_Protocol#Checksum_computation) – fvu

+0

@fvu我明白UDP已經有自己的校驗和了。但是這個應用層校驗和機制沒有識別丟包?比如缺少我自己協議的一些字節? –

+1

@YounghyoKim字節和數據包在所有變形例中都是完全不同的範圍(您可以在技術上將每個字節發送到一個單獨的數據包中,但效率非常低,並且要求麻煩)。 – fvu

相關問題