Il server non dovrebbe essere associato a un indirizzo ottenuto da getaddrinfo
, invece dovrebbe essere associato a 127.255.255.255
(per l'interfaccia di loopback).
Per un esempio già pronto di broadcast server/client vedere http://www.ccplusplus.com/2011/09/udp-broadcast-client-server-example.html
I socket di dominio Unix non supportano il multi-/broadcasting.
Puoi trasmettere sull'interfaccia locale 127.0.0.1.
Sebbene la domanda originale non lo dica esplicitamente, credo che il richiedente originale volesse "trasmettere" a più applicazioni in esecuzione sulla stessa istanza del sistema operativo (stesso computer per i vecchi timer).
Ciò è supportato dall'uso di "SO_REUSEADDR" nell'esempio del listener, dai commenti successivi di Yuvi e infine dal suggerimento di utilizzare il multicast IP.
La domanda originale dovrebbe essere chiarita.
Credo che la distribuzione dei pacchetti con più raccoglitori su una singola porta UDP vari tra i sistemi operativi quando si utilizza SO_REUSEADDR. La mia esperienza su Windows recente è che un singolo "raccoglitore" riceve esclusivamente tutti i pacchetti fino a quando non rilascia il suo collegamento, a quel punto, un altro il raccoglitore viene scelto e presenta tutti i pacchetti ricevuti, fino a quando non viene rilasciato, e così via...
Questo apparentemente differisce dai recenti kernel Linux, come spiegato in questo link:https://stackoverflow.com/a/14388707/86375Quella pagina sembra affermare che Linux riceverà i pacchetti round-robin tra più raccoglitori.
Il risultato finale, se speri di inviare a molti utilizzando un singolo datagramma inviato come ha fatto il poster originale e tenti di utilizzare IP unicast, non IP multicast, potresti rimanere deluso. (La mia esperienza e il collegamento sopra mostra che puoi eseguire il multi-bind, ma ciò non implica la consegna multipla dei datagrammi ricevuti, né su Linux né su Windows)
Il poster originale avrebbe dovuto provare a usare il multicast.