2009-04-28 11 views
1

Ich habe eine Linux-Anwendung, die einen UDP-Socket öffnet und es an einen Port bindet. Ich hatte kein Problem beim Senden von Unicast-Paketen durch den Socket. Ich hatte die Gelegenheit, ein Broadcast-Paket zu senden, also habe ich SO_BROADCAST aktiviert, das die Broadcast-Pakete passieren ließ, aber dann bemerkte ich, dass auch die Unicast-Pakete gesendet wurden. Ist dies das erwartete Verhalten für einen UDP-Socket oder ist es wahrscheinlicher, dass ich etwas falsch konfiguriert habe?UDP Broadcast und Unicast über die gleiche Buchse?

Antwort

2

Von was ich verstehe SO_BROADCAST ist eine Socket-Option. Also, wenn Sie es auf Ihrem Socket aktivieren, wird dieser Socket übertragen. Ich denke, Sie müssen verschiedene Sockets öffnen, wenn Sie Unicast und Broadcast aus dem gleichen Code ausführen möchten.

+0

Danke. Dafür habe ich gegraben. Ich dachte, ich hätte erwartet, dass es etwas tun würde, für das es nicht vorgesehen war. Ein zweiter Socket sollte den Trick machen, obwohl ich denke, dass ich an einen zweiten Port (Bummer) binden muss. –

0

Ich habe hier nicht viel Programmierarbeit gemacht, aber Sie müssen wahrscheinlich mehr Informationen über die Bibliothek, Betriebssystemversion, Code, etc. zur Verfügung stellen. Vielleicht ein Codebeispiel?

Wenn ich mich an die Bücher erinnere, die ich gelesen habe, wenn Sie das Flag auf dem Socket setzen, wird dies alle Datagramme vom Socket betroffen, da der Socket im Grunde eine Datenstruktur von Netzwerk Flags + ein Dateideskriptor ist.

-1

Ich habe herausgefunden, das gleiche Problem unter Linux über einen Socket bekommen Unicast und Broadcast zur gleichen Zeit. Ich löste das Problem wie folgt (Pseudocode):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Öffnen Sie die Buchse
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Ermöglicht eingehende und ausgehende Sendung von dieser Buchse
  3. bind(sock, bindaddr, sizeof(struct sockaddr) mit

bindaddr.sin_family = AF_INET

bindaddr.sin_port = <YourPort>

bindaddr.sin_addr.s_addr = INADDR_ANY

  • Erhalten Sie alle eingehenden Nachrichten auf jeder Karte für <YourPort>

Der Nachteil ist, dass es keine Filterung (siehe Einschränkung in 3.). So erhalten Sie alle Nachrichten. Die gesendeten Nachrichten werden entweder unicasted oder auf der angegebenen Adresse in der sendto() depedning gesendet.

+0

Können Sie bitte erklären, was das & 1 bedeutet? – dashesy