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!
Puoi pubblicare il codice che stai utilizzando per ascoltare i pacchetti? – tomasmcguinness
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
qualsiasi firewall attivo? Non sono sicuro di dove Wireshark intercetti i pacchetti ma potrebbe essere che il firewall li arresti in seguito – Default