如果udpclient在C#中丢失数据包会发生什么

时间:2016-11-14 12:26:03

标签: c# sockets udp

我现在正在学习计算机网络。现在我知道TCP和UDP之间的一个很大区别是UDP可以在通信时丢失数据包。我想知道C#如何应对这种损失。例如,一个主机将"ABCD\n"字符串发送到另一个主机。如果丢失了数据包,接收主机是否会抛出任何exception或只是"AB\n"? (另外)我想知道一些强制udpclient丢失数据包的方法。然后我可以做实验。

2 个答案:

答案 0 :(得分:2)

C#并不在乎 - 事实上它甚至不知道数据包丢失了。您的代码/逻辑可能会或可能不会丢失丢失的数据包。这完全取决于您编写的逻辑,与底层编程语言/运行时系统无关。

我也认为你正在过度思考/过度复杂化:丢失一个数据包===不发送一个......

答案 1 :(得分:1)

您应该自己实现CRC机制(语言不可知)

例如:

host1想要向host2发送一个udp数据报。

  1. host1计算数据包crc,然后将数据包发送到host2。
  2. 当host2收到数据包时,应该计算数据包crc,然后用该值回复host1。
  3. host1比较两个crc值,如果匹配则数据包发送正确并且到达host2 。如果不是host1必须重新发送数据包。
  4. 这是一个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;
            }
        }
    }