Po prostu doświadczyłem tego samego problemu i chciałem podzielić się tym, co naprawiono dla mnie.
Krótko mówiąc: wygląda na to, że Zapora systemu Windows była w jakiś sposób przyczyną tego dziwnego zachowania, a samo wyłączenie tej usługi nie pomaga. Musisz jawnie zezwalać na przychodzące pakiety UDP dla określonego programu (wykonywalny) na liście reguł przychodzących Zapory systemu Windows.
Pełny opis przypadku, czytaj dalej.
Moja konfiguracja sieci to: IP mojego urządzenia (odbierającego): 192.168.1.2, adres IP maszyny wysyłającej to 192.168.1.50, a maska podsieci na obu komputerach to 255.255.255.0. Mój komputer ma system Windows 7 x64.
Jest to kod (w przybliżeniu), że użyłem:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
sock.Bind(iep);
sock.EnableBroadcast = true;
EndPoint ep = (EndPoint)iep;
byte[] buffer = new byte[1000];
sock.ReceiveFrom(buffer, ref ep);
Początkowo nie działa chyba wysłałem paczkę rozgłaszania z tego gniazda zanim zadzwonię ReceiveFrom
na nim. To znaczy. dodając tę linię przed ReceiveFrom
rozmowy:
sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort))
Kiedy nie wysłać pakiet broadcast pierwszy od otrzymania gniazdo, przychodzące pakiety broadcast nie zostały otrzymane przez nią, mimo że pojawił się w Wireshark (docelowy pakietów było 255,255. 255.255).
Pomyślałem, że wygląda na to, że firewall miesza się z przychodzącymi pakietami (chyba że jakiś rodzaj UDP jest najpierw otwierany przez wychodzący pakiet - mimo, że nie słyszałem wcześniej, że dziurkowanie UDP ma zastosowanie do pakietów emisji w jakiś sposób), więc Poszedłem do usług i całkowicie wyłączyć zaporę systemu Windows. To nic nie zmieniło.
Jednak po wypróbowaniu wszystkiego innego ponownie włączyłem usługę zapory i spróbowałem ponownie uruchomić program. Tym razem pojawił się monit zapory z pytaniem, czy chcę zezwolić na proces MyProgram.vshost.exe (debugowałem w Visual Studio) przez firewall, zaakceptowałem to i voila - wszystko działało! Otrzymane pakiety przychodzące!
Czy możesz wysłać kod, którego używasz do nasłuchiwania pakietów? – tomasmcguinness
Próbowałem kod z: http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ i http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast. htm, a także http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris
dowolna aktywna zapora ogniowa? Nie jestem pewien, gdzie Wireshark przechwytuje pakiety, ale może być tak, że zapora zatrzymuje je później. – Default