Unerwarteter winsock crash
-
Hallo liebe Leute,
ich habe folgendes Problem: ich bin dabei ein Client/Server System zu schreiben, welches Daten über TCP/IP per Win-Sockets austauscht. Ich bin noch unerfahren auf dem Gebiet und habe deshalb mit Problemen zu kämpfen. Momentan initialisiere ich WSA, erstelle ein Socket und versuche zu connecten. Dabei connecte ich auf einen Host, den es nicht gibt. Das führt dazu, dass mein Programm vollständig abstürzt. Wenn die Operation fehlschlägt sollte ich doch eigentlich einen Fehlercode zurückbekommen, anstatt dass es vollständig stirbt. Hier mein Code:
SOCKET* CLIENT_SOCKET; int createClientSocket(SOCKET* s) { s = (SOCKET*)malloc(sizeof(SOCKET)); *s = socket(AF_INET, SOCK_STREAM, 0); int code = WSAGetLastError(); if(code != 0) { return code; } return 0; } SOCKADDR_IN* createIpAddress(char* ip, unsigned short port) { SOCKADDR_IN* addr = (SOCKADDR_IN*)malloc(sizeof(SOCKADDR_IN)); memset(addr, 0, sizeof(SOCKADDR_IN)); addr->sin_family = AF_INET; addr->sin_port = htons((u_short)port); addr->sin_addr.s_addr = inet_addr(ip); return addr; } ClientError connectToServer(char* ip, unsigned short port) { int code; SOCKADDR_IN* addr = createIpAddress(ip, port); code = createClientSocket(CLIENT_SOCKET); if(code != 0) { return CREATE_SOCKET_ERROR; } code = connect(*CLIENT_SOCKET, (SOCKADDR*)addr, sizeof(SOCKADDR)); // Genau in dieser Zeile stirbt das Programm if(code != 0) { return CONNECT_SOCKET_ERROR; } return CLIENT_OK; }
Mein Programm ruft connectToServer("127.0.0.1", 55555); auf. Dabei knallt es dann. Wie gesagt, ich würde eigentlich einen Fehlercode erwarten, der mir sagt, dass der Host nicht antwortet. Das stattdessen die gesamte Anwendung kommentarlos abstürzt hinterlässt mich etwas hilflos. Ich habe mich an das Tutorial unter http://www.c-worker.ch/tuts/wstut_op.php#datax gehalten und kann auch nach mehrmaligem Vergleichen keine Abweichung entdecken. Es wäre echt toll, wenn mir jemand weiterhelfen kann.
Vielen Dank
-
Du übergibst den Wert von
CLIENT_SOCKET
und deswegen wird es nie geändert. Lern erstmal, was Zeiger sind und spar dir solangemalloc
.code = createClientSocket(CLIENT_SOCKET);
Du weist der lokalen Variable
s
etwas zu. Das hat keine Auswirkungen aufCLIENT_SOCKET
, weils
eine Kopie ist.s = (SOCKET*)malloc(sizeof(SOCKET));
Andere Probleme:
- globale Variable
- schlechte Benennung (KONSTANTEN und MAKROS schreibt man eventuell groß)void *
muss man nicht casten, auch wenn Intellisense (für C++) das behauptetconst char *
heißt das, wenn man Strings zum Lesen übergibt
- der Rückgabewert vonsocket()
istINVALID_SOCKET
, wenns nicht funktioniertu_short
ist schonunsigned short
-
Vielen Dank für den Hinweis. Das hat letztendlich mein Problem gelöst. Ich bin mit den Zeigern durcheinandergekommen.
-
2 x malloc, 0 x free