recvfrom schlägt fehl



  • WSADATA wsa;
      SOCKADDR_IN addr;
      if( WSAStartup(MAKEWORD(2,0),&wsa) != 0 )
        throw ((std::string)"Winsock start failed");
      Sock = socket(AF_INET,SOCK_DGRAM,0);
      if(Sock==INVALID_SOCKET)
        throw ((std::string)"Socket couldn't be created");
      addr.sin_family=AF_INET;
      addr.sin_port=htons(Port);
      addr.sin_addr.s_addr=ADDR_ANY; // def in winsock2.h   #define ADDR_ANY                INADDR_ANY
      if(bind(Sock,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
        throw ((std::string)"Couldn't bind socket, programm may already be running");
    

    so wird der socket erstmal erstellt, soll UDP werden.
    Funktioniert auch.

    Packet Pac;
      std::fill(reinterpret_cast < char* >(&Pac), reinterpret_cast < char* >(&Pac) + sizeof(Packet), 0);
      Client nClient;
      std::fill(reinterpret_cast < char* >(&nClient), reinterpret_cast < char* >(&nClient) + sizeof(Client), 0);
      while ( true ){
        SOCKADDR_IN *saClient = new SOCKADDR_IN;
        if ( recvfrom( Object->Sock, reinterpret_cast < char* >(&Pac), sizeof(Packet), 0, (SOCKADDR*)saClient, NULL) == SOCKET_ERROR )
          throw ((std::string)"recvfrom failed");
    

    aber hier schlägt es dann sofort nach dem aufruf fehl.
    Socket stimmt... 😞

    wäre nett wenn ihr da ne idee hättet



  • unter windows gibt es da die nette funktion WSAGetLastError
    außerdem fällt mir auf das der letzte parameter der funktion 0 ist. der gibt
    aber die größe der struktur an. versuch da mal "sizeof(saClient)".



  • Hab mal int saSize = sizeof(SOCKADDR_IN); und in den letzten parameter &saSize,

    geht...

    der letzte sollte aber eigentlich optional sein, nach msdn..

    aber anscheinend doch benötigt. danke



  • ist optional aber nur wenn der zeiger auf die auszufüllende struktur auch 0 ist.
    wie soll die funktion einen bereich ausfüllen wenn sie nicht weiß wie groß dieser
    ist 😉



  • macht sinn...


Anmelden zum Antworten