решено Я решил проблему с отключением брандмауэра 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")...
, но это не помогает.
Единственное отличие, которое я вижу.На компьютере, где работает программа, я могу видеть дейтаграммы только при запуске программы.На компьютере, где программа не работает, я всегда вижу дейтаграммы, даже если приложение выключено.
Вопрос в том, как мне устранить проблему?
- Я уверен, чтов сети есть дейтаграммы, потому что я вижу их в wireshark
- я уверен, что мое приложение и wireshark используют одну и ту же multicastGroup, multicastPort, sourceIp
- я уверентот же интерфейс, потому что я предоставляю его явно
Но 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