c++ UDP-broadcast senden

Für ein Projekt brauche ich zum senden einer UDP-broadcast-jede Sekunde zu 87.255.255.255 und port 4448 mit den Werten von meinem Projekt. Ich habe geschrieben ein code in c++, aber ich bekam immer die Fehlermeldung:

Behauptung `::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1′ failed

mit dieser Zeile:

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

Wenn ich diese Zeile löschen wird der code ausgeführt, aber ich finde nichts auf wireshark.

Hat jemand eine Lösung oder einige zusätzliche Informationen zum erstellen eines broadcast-Absender?

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <assert.h>
#include <string.h>
#include <ctime>

int main(int argc, char const *argv[]) {

  sockaddr_in si_me, si_other;
  int s;
  printf("Making socket\n");
  assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
  fprintf(stderr,"usage %s hostname port\n", argv[0]);
  int port=4448;
  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)
  {
     printf("Send message to broadcast\n");
     char buf[10000];
     strcpy(buf, "test for wireshark");
     unsigned slen=sizeof(sockaddr);
     send(s, buf, sizeof(buf)-1, 0);
     //recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
     printf("recv: %s\n", buf);
     sleep(1);
  }
}
  • Es ist in der Regel eine schlechte Idee, wrap-Funktionen in assert(), da Sie entfernt werden, wenn das debugging ausgeschaltet ist. Statt einer Geltendmachung nennen perror() so können Sie sehen, warum es fehlschlägt.
  • ich versuche, es zu ändern perror aber ich habe den Fehler: cannot convert ‚bool‘ in ‚const char*‘ for argument ‚1‘ to ‚void perror(const char*)‘
  • if (bind(...)<0) perror("bind()"); statt assert(bind(...)!=-1);
  • Ich habe dies geändert und der code wird ausgeführt, aber ich habe gar nicht gesehen, was die übergabe in wireshark.
  • Wenn es abgebrochen wird, bevor, sollten Sie jetzt sehen, eine Beschreibung des Fehlers an die Konsole ausgegeben.
  • Zuerst wurde der Hafen bereits verwendet wurde und ich mich geändert habe „portnumber“. Jetzt bekomme ich nicht die Fehler, sondern ich sehe nichts auf wireshark

InformationsquelleAutor josejos41 | 2016-04-06



2 Replies
  1. 3

    Anscheinend gibt es einige unheimliche Begegnungen mit Rundfunk unter UNIX. Also dies kann oder kann nicht wie erwartet funktionieren.

    void errno_abort(const char* header)
    {
        perror(header);
        exit(EXIT_FAILURE);
    }
    
    int main(int argc, char* argv[])
    {
    #define SERVERPORT 4567
        struct sockaddr_in send_addr, recv_addr;
        int trueflag = 1, count = 0;
        int fd;
        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
            errno_abort("socket");
    #ifndef RECV_ONLY
        if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST,
                       &trueflag, sizeof trueflag) < 0)
            errno_abort("setsockopt");
    
        memset(&send_addr, 0, sizeof send_addr);
        send_addr.sin_family = AF_INET;
        send_addr.sin_port = (in_port_t) htons(SERVERPORT);
        //broadcasting address for unix (?)
        inet_aton("127.255.255.255", &send_addr.sin_addr);
        //send_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    #endif //! RECV_ONLY
    
    #ifndef SEND_ONLY
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
                       &trueflag, sizeof trueflag) < 0)
            errno_abort("setsockopt");
    
        memset(&recv_addr, 0, sizeof recv_addr);
        recv_addr.sin_family = AF_INET;
        recv_addr.sin_port = (in_port_t) htons(SERVERPORT);
        recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
        if (bind(fd, (struct sockaddr*) &recv_addr, sizeof recv_addr) < 0)
            errno_abort("bind");
    #endif //! SEND_ONLY
    
        while ( 1 ) {
    #ifndef RECV_ONLY
            char sbuf[256] = {};
            snprintf(sbuf, sizeof(sbuf), "Hello(%d)!", count++);
            if (sendto(fd, sbuf, strlen(sbuf)+1, 0,
                       (struct sockaddr*) &send_addr, sizeof send_addr) < 0)
                errno_abort("send");
            printf("send: %s\n", sbuf);
            usleep(1000000/2);
    #endif //! RECV_ONLY
    
    #ifndef SEND_ONLY
            char rbuf[256] = {};
            if (recv(fd, rbuf, sizeof(rbuf)-1, 0) < 0)
                errno_abort("recv");
            printf("recv: %s\n", rbuf);
    #endif //! SEND_ONLY
        }
        close(fd);
        return 0;
    }

    Hoffe, das hilft. Viel Glück.

  2. 0

    Sendet ein UDP-Paket mit der Größe 10000 ist wahrscheinlich eine schlechte Idee.
    Versuchen Sie es mit strlen(buffer) statt beim aufrufen von send(). Dies könnte ein Grund sein, warum Sie nicht sehen, nichts auf Hai.

    Einen Grund zu finden, warum bind() fehlschlägt, müssen Sie eval errno.

    BTW: ich erinnere mich an einen TCP-stack-Implementierung, die nicht wie IPPROTO_UDP als Dritter parameter an die socket () – Aufruf, obwohl es funktionieren soll nach dem standard. Versuchen Sie es mit 0 statt.

    • Habe ich geändert, den Puffer in der 20. Dies tut nichts, aber ich muss löschen der assert-Zeile, um es zu kompilieren.
    • ich habe geändert, IPPROTO_UDP null , aber ich sehe nichts vorbei auf wireshark.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.