2012-09-25 13 views
6

So che questa domanda è stata posta molte volte. Ho letto TUTTE le risposte e ho provato il pezzo di codice EVRY che ho trovato. Dopo alcuni giorni sono così disperato che devo chiederti aiuto.Ricezione messaggio broadcast UDP in C#

Nella mia rete domestica ho un dispositivo e un PC. Il dispositivo invia messaggi broadcast UDP. Sul mio PC posso vedere quei messaggi in Wireshark:

Fonte Destinazione Lunghezza

192.168.1.102 0.0.0.0 Porta UDP 60 Fonte: 9050 Porta di destinazione: 0

Ciò significa che i pacchetti sono in arrivo sul mio PC. Il mio prossimo passo è stato quello di creare un'applicazione C# che riceva quei pacchetti. Come accennato in precedenza ho provato ogni possibile soluzione, ma semplicemente non riceverò nulla.

Quindi immagino ci sia qualcosa di molto semplice che sto sbagliando. Qualcuno può darmi una mano? Grazie!

+1

Puoi pubblicare il codice che stai utilizzando per ascoltare i pacchetti? – tomasmcguinness

+0

Ho provato il codice da: http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ e http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast. htm e anche http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris

+0

qualsiasi firewall attivo? Non sono sicuro di dove Wireshark intercetti i pacchetti ma potrebbe essere che il firewall li arresti in seguito – Default

risposta

0

OK, hanno qualcosa collegato al codice che causa il problema. (Non ho letto l'articolo, copia appena incollato)

Funziona sempre dal computer locale, ma da una macchina remota non funzionerà per qualche motivo.

Per risolvere il problema: In Broadcst.cs hanno trasmesso due volte. una volta per il localhost e poi per l'indirizzo IP di destinazione (iep2). è sufficiente rimuovere il

sock.SendTo(data, iep1); 

e dovrebbe funzionare.

Non ho idea del perché.

1

Ho appena sperimentato lo stesso problema e ho voluto condividere ciò che per me è stato risolto.

In breve: sembra che Windows Firewall sia stato in qualche modo la causa di questo strano comportamento e la semplice disattivazione del servizio non è di aiuto. È necessario autorizzare esplicitamente i pacchetti UDP in arrivo per un programma specifico (eseguibile) nell'elenco delle regole di ingresso di Windows Firewall.

Per la descrizione completa del caso, continua a leggere.

La mia configurazione di rete è: l'IP della mia macchina (ricevente) era 192.168.1.2, l'IP della macchina trasmittente era 192.168.1.50 e la maschera di sottorete su entrambe le macchine era 255.255.255.0. La mia macchina esegue Windows 7 x64.

Questo è il codice (grosso modo) che ho usato:

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); 

Inizialmente questo non ha funzionato a meno che non ho mandato un pacchetto broadcast da quella presa prima che chiami ReceiveFrom su di esso. Cioè l'aggiunta di questa linea prima ReceiveFrom chiamata:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort)) 

quando non ho inviato il pacchetto broadcast prima di ricevere presa, pacchetti di trasmissione in arrivo non sono stati ricevuti dalla medesima, anche se sono apparsi in Wireshark (destinazione dei pacchetti era 255.255. 255,255).

Ho pensato che sembra che il firewall faccia casino con i pacchetti in arrivo (a meno che un qualche tipo di foro UDP sia aperto prima dal pacchetto in uscita - anche se non ho sentito prima che il punchino UDP si applica ai pacchetti broadcast in qualche modo), quindi Sono andato a servizi e disabilitato del tutto il servizio firewall di Windows. Questo non ha cambiato nulla.

Tuttavia, dopo aver provato tutto il resto, ho riattivato il servizio firewall e ho provato a eseguire nuovamente il programma. Questa volta, il prompt del firewall è apparso chiedendomi se volevo consentire il processo MyProgram.vshost.exe (stavo eseguendo il debug in Visual Studio) tramite firewall, l'ho accettato e voilà: tutto funzionava! I pacchetti in arrivo venivano ora ricevuti!