0

我正在尝试连接到多播组以接收一些 UDP 数据包。我正在使用的代码运行良好,我正在接收数据包并且我之前没有遇到过这个问题。但是刚才有一个新的要求,需要数据包通过一个需要看到组播加入消息的交换机。在它只是愚蠢的开关之前,这不是问题。

要加入多播组,我使用以下代码:

var LocalAddress = "228.12.12.27";
var LocalPort = 46715;
var LocalEndPoint = new IPEndPoint(IPAddress.Parse(LocalAddress), LocalPort);
var RxSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

RxSocket.Blocking = false;
RxSocket.ReceiveBufferSize = UInt16.MaxValue;
RxSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);

RxSocket.Bind(new IPEndPoint(IPAddress.Any, LocalEndPoint.Port));
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(LocalEndPoint.Address));
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 50);

RxSocket.Close();

生成 IGMP Join 消息的行是

RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(LocalEndPoint.Address));

并发出 IGMP Join 消息。

但是,当我使用 Wireshark 窥探网络时,我发现 IGMP 消息的校验和错误; http://i.imgur.com/6Ct52QG.png

这是我的代码或输入的问题吗?或者还有别的什么?

4

2 回答 2

0

这是在硬件中进行校验和的现代网卡所期望的。不要担心这个。

于 2013-03-07T19:52:03.843 回答
0

这是我的代码的问题吗

不,因为您的代码没有生成IP校验和。这要么是由操作系统的网络堆栈生成的,要么是由 Nikolai Fetissov 在他的回答中指出的,由网络适配器生成。

如果您的网络分析器正在发送数据包的机器上运行,并且校验和是由网络适配器而不是由网络堆栈生成的,那么,因为捕获您自己的数据包是由网络堆栈“循环这些数据包”来完成的捕获机制而不是通过网络适配器捕获它传输的数据包(如果有适配器的话,很少有),捕获的数据包将没有计算 IP 校验和,因此几乎肯定会出现错误的 IP 校验和。

注意“可能是由“IP校验和卸载”引起的?” 在 Wireshark 显示中。这就是 Wireshark 所说的。

于 2013-03-07T22:06:27.243 回答