我现在正在学习计算机网络。现在我知道TCP和UDP之间的一个很大区别是UDP可以在通信时丢失数据包。我想知道C#如何应对这种损失。例如,一个主机将"ABCD\n"
字符串发送到另一个主机。如果丢失了数据包,接收主机是否会抛出任何exception
或只是"AB\n"
? (另外)我想知道一些强制udpclient丢失数据包的方法。然后我可以做实验。
答案 0 :(得分:2)
C#并不在乎 - 事实上它甚至不知道数据包丢失了。您的代码/逻辑可能会或可能不会丢失丢失的数据包。这完全取决于您编写的逻辑,与底层编程语言/运行时系统无关。
我也认为你正在过度思考/过度复杂化:丢失一个数据包===不发送一个......
答案 1 :(得分:1)
您应该自己实现CRC机制(语言不可知)
例如:
host1想要向host2发送一个udp数据报。
这是一个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;
}
}
}