我有一个用C#编写的简单UDP应用程序,需要在Linux的mono下运行。在我的个人PC上(Windows 10)它可以正常工作,但是在Linux机器上校验和显然不好。
我试图禁用校验和,但这只是使其完全不发送。
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoChecksum, true);
我知道校验和不好的原因是因为tcpdump向我显示了
192.168.88.98.5059 > 192.168.88.37.5059: [bad udp cksum 0x3354 -> 0x56e7!] UDP, length 354
除此之外,还有很多工作代码,例如TcpListener等,这是不起作用的部分:
...
UdpClient udpClient = new UdpClient();
udpClient.ExclusiveAddressUse = false;
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
// udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoChecksum, true);
udpClient.Client.Bind(IpEndPoint);
udpClient.Send(rtnMessage, rtnMessage.Length, RemoteIpEndPoint);
此外,无论使用这些选项还是校验和,我都不会在另一侧收到UDP消息。