我正在尝试连接到多播组以接收一些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加入消息的行是
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(LocalEndPoint.Address));
发送IGMP加入消息。
然而,当我使用Wireshark窥探网络时,我发现IGMP消息的校验和错误;
这是我的代码或输入的问题吗?或者还有其他什么?
答案 0 :(得分:0)
现在的网卡可以在硬件中进行校验和。别担心。
答案 1 :(得分:0)
这是我的代码的问题
不,因为您的代码未生成 IP 校验和。这可能是由OS的网络堆栈生成的,或者正如Nikolai Fetissov在他的回答中所说,由网络适配器生成。
如果您的网络分析器在发送数据包的计算机上运行,并且校验和是由网络适配器而不是网络堆栈生成的,那么,因为捕获您自己的数据包是由网络堆栈完成的“循环这些数据包”返回“捕获机制而不是网络适配器捕获它传输的数据包(如果有任何适配器将会很少),捕获的数据包将不会计算IP校验和,因此几乎肯定会出现错误的IP校验和
注意“可能是由”IP校验和卸载引起的“?”在Wireshark显示屏中。这就是Wireshark所说的。