已解决我已解决了关闭Windows防火墙的问题
我在两台不同的计算机上运行相同的代码。
s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
ipep = new IPEndPoint(IPAddress.Any, int.Parse(mcastPort));
s.Bind(ipep);
// setting options
// ................
// s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, option);
if (s.Poll(1, SelectMode.SelectRead))
{
Console.WriteLine("Poll returned true");
} else
{
Console.WriteLine("Poll returned false");
}
在一台计算机上,代码运行正常,所以至少它有效。
但是在另一台计算机上它不起作用。在一种情况下Poll
返回true,而在另一种情况下Poll
返回false;我使用Wireshark来检查两台计算机上是否可以看到指定连接上的数据报(mcastGroup,mcastPort,sourceIp)。我当时认为可能在第二台计算机上使用了错误的界面,因此我将new IPEndPoint(IPAddress.Any...
替换为new IPEndPoint(IPAddress.Parse("10.11.12.13")...
,但这没有帮助。
我能看到的唯一区别。在程序运行的计算机上,我只能在程序启动时看到数据报。在程序不起作用的计算机上,我总是看到数据报,即使应用程序已关闭。
问题是 - 我怎么能解决这个问题?
但Socket.Poll
仍然返回false。我还应该做什么?
upd 此外,我在嗅探器中注意到无法使用的计算机使用IGMP v2,而运行正常的计算机使用IGMP V3。功能AddSourceMembership
可能是IGMP v3的新功能,这就是我的程序不起作用的原因?如何强制计算机使用IGMP v3?
upd 我创建了另一个问题https://stackoverflow.com/questions/9775405/the-same-udp-multicast-addsourcemembership-code-results-in-completely-different因为我认为这不是c#或.net问题