2009-04-28 6 views
1

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 unicast via le socket. J'ai eu l'occasion d'envoyer un paquet de diffusion, j'ai donc activé SO_BROADCAST, ce qui a permis aux paquets de diffusion de passer, mais j'ai ensuite remarqué que les paquets unicast étaient également diffusés. Est-ce que ce comportement est attendu pour une socket UDP, ou est-il plus probable que j'ai mal configuré quelque chose?Diffusion UDP et monodiffusion via le même socket?

Répondre

2

D'après ce que je comprends SO_BROADCAST est une option de socket. Donc, si vous l'activez sur votre socket, cette socket sera diffusée. Je suppose que vous devrez ouvrir des sockets différents si vous voulez faire un monodiffusion et diffuser à partir du même code.

+0

Merci. C'est ce que je cherchais. Je pensais que je m'attendais à faire quelque chose pour lequel il n'était pas conçu. Une deuxième socket devrait faire l'affaire, même si je suppose que je vais devoir me lier à un second port (bummer). –

0

Je n'ai pas fait grand-chose sur la programmation ici, mais vous avez probablement besoin de 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 le drapeau sur le socket, cela affectera tous les datagrammes envoyés par le socket, car le socket est une structure de données de drapeaux réseau + un descripteur de fichier.

-1

J'ai trouvé le même problème sous Linux pour avoir une socket en réception et diffusée en même temps. Je l'ai résolu le problème comme suit (pseudo-code):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Ouvrir la prise
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Permet la diffusion entrant et sortant de cette prise
  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 une carte pour <YourPort>

La mise en garde est qu'il n'y a pas de filtrage (voir mise en garde à 3.). Donc, vous recevrez tous les messages. Les messages envoyés sont soit dégroupés soit diffusés à l'adresse indiquée dans le champ sendto().

+0

Pouvez-vous expliquer ce que cela signifie & 1? – dashesy

Questions connexes