繁体   English   中英

如果udpclient在C#中丢失数据包会怎样?

[英]What happens if udpclient lost packets in C#

我现在正在研究计算机网络。 现在,我知道TCP和UDP之间的最大区别是UDP在通信时会丢失其数据包。 我想知道C#如何应对这种迷失。 例如,一个主机将"ABCD\\n"字符串发送给另一台主机。 如果有数据包丢失,接收主机是否会抛出任何exception或只是出现"AB\\n" (添加),我想知道某种方法来强制udpclient丢失其数据包。 然后我可以做实验。

C#不在乎-实际上,它甚至都不知道包丢失了。 您的代码/逻辑对该丢失的数据包可能有问题,也可能没有问题。 这完全取决于您编码的逻辑,并且与基础编程语言/运行时系统无关。

我还认为您正在对此过度考虑/过于复杂:丢失一个数据包===不发送一个数据包...

您应该自己实现CRC机制(与语言无关)

例如:

host1希望将udp数据报发送到host2。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM