Question

J'ai une application Linux qui ouvre un socket UDP et le lie à un port. Je n'ai eu aucun problème à envoyer des paquets en envoi individuel via le socket. J'ai eu l'occasion d'envoyer un paquet de diffusion, alors j'ai activé SO_BROADCAST, qui permettait aux paquets de diffusion de passer, mais j'ai ensuite remarqué que les paquets en envoi individuel étaient également diffusés. Ce comportement est-il attendu pour un socket UDP ou est-il plus probable que j'ai mal configuré quelque chose?

Était-ce utile?

La solution

D'après ce que j'ai compris, SO_BROADCAST est une option de socket. Donc, si vous l'activez sur votre socket, ce socket sera diffusé. J'imagine que vous devrez ouvrir différentes prises si vous souhaitez effectuer la monodiffusion et la diffusion à partir du même code.

Autres conseils

Je n'ai pas fait beaucoup de programmation pratique ici, mais vous devrez probablement fournir plus d'informations sur la bibliothèque, la version du système d'exploitation, le code, etc. Peut-être un exemple de code?

Si je me souviens des livres que j'ai lus, si vous définissez l'indicateur sur le socket, cela affectera tous les datagrammes envoyés depuis le socket, car le socket est essentiellement une structure de données composée d'indicateurs de réseau et d'un descripteur de fichier.

J'ai découvert le même problème sous Linux, à savoir que le socket soit unicast et diffusé en même temps. J'ai résolu le problème comme suit (pseudo-code):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Ouvrez le socket
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Autorise les diffusions entrantes et sortantes à partir de ce socket
  3. bind(sock, bindaddr, sizeof(struct sockaddr) avec
  
    
      

bindaddr.sin_family = AF_INET

             

bindaddr.sin_port = <YourPort>

             

bindaddr.sin_addr.s_addr = INADDR_ANY

    
  
  • Obtenez tous les messages entrants sur n'importe quelle carte pour <YourPort>

La mise en garde est qu'il n'y a pas de filtrage (voir la mise en garde en 3.). Donc, vous recevrez tous les messages. Les messages envoyés sont soit en monodiffusion, soit en diffusion, en fonction de l’adresse indiquée dans le sendto().

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top