2012-09-25 21 views
6

Wiem, że to pytanie było wielokrotnie zadawane. Przeczytałem WSZYSTKIE odpowiedzi i wypróbowałem EVRY kawałek kodu, który mogłem znaleźć. Po kilku dniach jestem tak zdesperowany, że muszę prosić o pomoc.Odbieranie wiadomości UDP Broadcast w języku C#

Mam urządzenie i komputer w mojej sieci domowej. Urządzenie wysyła komunikaty rozgłaszania UDP. Na moim komputerze widzę te wiadomości w Wireshark:

Źródło Destination Długość

192.168.1.102 0.0.0.0 port UDP 60 Źródło: 9050 Port docelowy: 0

Oznacza to, że pakiety są przybywających na mój PC. Następnym krokiem było stworzenie aplikacji C#, która odbiera te pakiety. Jak wspomniano powyżej, wypróbowałem każde możliwe rozwiązanie, ale po prostu nic nie otrzymam.

Sądzę więc, że musi być coś bardzo podstawowego, co robię źle. Czy ktoś może mi pomóc? Dzięki!

+1

Czy możesz wysłać kod, którego używasz do nasłuchiwania pakietów? – tomasmcguinness

+0

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

+0

dowolna aktywna zapora ogniowa? Nie jestem pewien, gdzie Wireshark przechwytuje pakiety, ale może być tak, że zapora zatrzymuje je później. – Default

Odpowiedz

0

Jesteś OK, mają coś przewodowego w kodzie, który powoduje problem. (Nie czytałem tego artykułu, tylko kopiowałem wklejone)

Zawsze działa z lokalnego komputera, ale z odległej maszyny z jakiegoś powodu zawiedzie.

Aby to naprawić: W Broadcst.cs emitują dwa razy. raz dla localhost, a następnie dla docelowego adresu IP (iep2). po prostu usuń i powinien zadziałać.

Nie mam pojęcia dlaczego.

1

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!