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...