Domanda

Ho un'applicazione Linux che apre un socket UDP e lo collega a una porta. Non ho avuto problemi a inviare pacchetti unicast attraverso il socket. Ho avuto occasione di inviare un pacchetto di trasmissione, quindi ho abilitato SO_BROADCAST, che ha permesso il passaggio dei pacchetti di trasmissione, ma poi ho notato che venivano trasmessi anche i pacchetti unicast. Questo comportamento previsto è per un socket UDP o è più probabile che abbia configurato male qualcosa?

È stato utile?

Soluzione

Da quello che ho capito SO_BROADCAST è un'opzione socket. Quindi, se lo abiliti sul tuo socket, questo socket trasmetterà. Immagino che dovrai aprire socket diversi se vuoi fare unicast e trasmettere dallo stesso codice.

Altri suggerimenti

Non ho fatto molta pratica sulla programmazione qui, ma probabilmente è necessario fornire ulteriori informazioni sulla libreria, versione del sistema operativo, codice, ecc. Forse un esempio di codice?

Se ricordo i libri che ho letto, se imposti il ??flag sul socket, ciò influenzerà tutti i datagrammi inviati dal socket, poiché il socket è sostanzialmente una struttura di dati di flag di rete + un descrittore di file.

Ho capito lo stesso problema su Linux di avere un socket che ottiene unicast e trasmette allo stesso tempo. Ho risolto il problema come segue (pseudo-codice):

  1. sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Apri il socket
  2. setsockopt (calzino, SOL_SOCKET, SO_BROADCAST e & amp; 1)
    • Consente la trasmissione in entrata e in uscita da questo socket
  3. bind (calzino, bindaddr, sizeof (struct sockaddr) con
  
    
      

bindaddr.sin_family = AF_INET

             

bindaddr.sin_port = < YourPort >

             

bindaddr.sin_addr.s_addr = INADDR_ANY

    
  
  • Ricevi tutti i messaggi in arrivo su qualsiasi scheda per <YourPort>

L'avvertenza è che non esiste alcun filtro (vedere avvertenza in 3.). Quindi riceverai tutti i messaggi. I messaggi inviati sono unicasted o trasmessi in base all'indirizzo specificato in sendto () .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top