11 Stimmen

Empfang von UDP-Broadcast

Ich muss einen UDP-Broadcast empfangen (in Ubuntu, falls das einen Unterschied macht). Mit Wireshark kann ich sehen, dass das Paket vom Server gesendet wird, und ich kann sehen, dass es von meinem Client-Rechner empfangen wird, aber mein Programm ist völlig ahnungslos. Das ist, was ich habe:

sockaddr_in si_me, si_other;
int s;
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
int port=6000;
int broadcast=1;

setsockopt(s, SOL_SOCKET, SO_BROADCAST,
            &broadcast, sizeof broadcast);

memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;

assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);

while(1)
{
    char buf[10000];
    unsigned slen=sizeof(sockaddr);
    recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);

    printf("recv: %s\n", buf);
}

Es wird im Debug-Modus kompiliert, die Asserts werden während der Kompilierung nicht gelöscht, und mein Programm blockiert einfach bei recvfrom .

Gibt es noch andere Hürden, die ich überwinden muss, um eine ungezielte UDP-Übertragung zu empfangen?

Bearbeiten: nur ein bisschen mehr Informationen, ich habe die beiden Computer auf einem dedizierten Switch verbunden, keine Störungen von außen. Ich habe auch eine zweite Netzwerkkarte in meinem Client-Computer, die mit dem Firmennetzwerk verbunden ist, was auch funktioniert.

Ich kann sowohl die Außenwelt (Internet funktioniert) als auch meinen Servercomputer anpingen (und ich kann die tatsächlichen Pakete in Wireshark sehen), aber man weiß nie, was dieses Problem verursachen könnte.

4voto

Blindy Punkte 59463

Wie sich herausstellte, ist mein Code völlig in Ordnung, wie ich es mir gedacht hatte. Es gab ein Problem mit der Netzwerkeinrichtung selbst.

Für die Nachwelt hatte ich zwei Computer mit statischer IP auf einem eigenen Hub eingerichtet, anstatt den eingebauten DHCP-Server auf dem Server-Rechner zu verwenden, um die IP-Adresse für den anderen Computer zuzuweisen. Mein Problem ist ziemlich lokalisiert, aber man weiß ja nie

0voto

Fl0 Punkte 33

So senden und empfangen Sie Rundsendungen

  1. Vergewissern Sie sich, dass die Netzmaske korrekt ist. Unter Windows spielt die Maske für Broadcast-Pakete keine Rolle, nicht aber unter Linux.

  2. Sockel an INADDR_ANY binden

  3. setockopt to BROADCAST

  4. sendto mit sendaddr aufrufen.sin_addr.s_addr = inet_addr("your_interface_broadcast_address"). oder - rufen Sie sento mehrmals für jede Schnittstelle mit ihrer Broadcast-IP-Adresse auf.

  5. Rufen Sie recvfrom auf. Richten Sie jederzeit vor dem Aufruf von recvfrom den Parameter length ein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X