Winsock : Connect schlägt fehl unbekannter Fehlercode
-
Hallo,
und zwar wagte ich mich gestern an die Socket Programmierung.
Schrieb auch ein kleines Programm:#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <winsock2.h> #define MAX 50 /* struct sockaddr_in { sa_family sin_family; // Adressfamilie AF_XXX unsigned short int sin_port; // Portnummer struct in_addr sin_addr; // IP-Adresse unsigned char pad[8]; // Auffüllbytes für sockaddr }; */ int main() { SOCKET s; WSADATA wsa; SOCKADDR_IN addr; struct hostent *host; char ip[MAX]; printf ("Zu welcher IP soll verbunden werden: "); scanf("%s",&ip); printf ("%s\n",ip); if(WSAStartup(MAKEWORD(2,0),&wsa) != 0) { printf ("Winsock 2.0 konnte nicht gestartet werden\nFehlercode: %d\n",WSAGetLastError); return EXIT_FAILURE; } else printf ("Winsock 2.0 erfolgreich gestartet\n"); if(s = socket(AF_INET,SOCK_STREAM,0) != -1) printf ("Socket erfolgreich gestartet\n"); else { printf("Socket konnte nicht erstellt werden.\nFehlercode: %d\n",WSAGetLastError); return EXIT_FAILURE; } memset(&addr,0,sizeof(SOCKADDR_IN)); if((host = gethostbyname(ip)) == NULL) { printf ("Konnte hostent Struktur nicht fuellen.\nFehlercode: %d\n",WSAGetLastError); return EXIT_FAILURE; } addr.sin_port = htons(80); addr.sin_family = AF_INET; addr.sin_addr = *(struct in_addr *)host->h_addr; if(connect(s,(struct SOCKADDR *)&addr,sizeof(SOCKADDR_IN)) != -1) printf ("Erfolgreich verbunden :)\n"); else { printf("Konnte nicht zum Server verbinden\nFehlercode: %d\n",WSAGetLastError); } return EXIT_SUCCESS; }Doch leider scheitert die Verbindung immer.
Fehlercode: 4199536
Weiß jemand was dort falsch ist in dem Code?
-
printf("Konnte nicht zum Server verbinden\nFehlercode: %d\n",WSAGetLastError);Aha.
Du gibst die Adresse von "WSAGetLastError" aus. Bringt nu' nicht gerade viel, gell?
Tip: häng an "WSAGetLastError" mal einfach "()" an, dann bekommst du den Error-Code ausgedruckt und nicht eine Hausnummer.

EDIT: falls du von VB her kommst: in C++ muss man immer Klammern schreiben wenn man eine Funktion aufrufen will, auch wenn diese keine Parameter hat. Sonst wird die Funktion nämlich NICHT aufgerufen, und man bekommt die Adresse der Funktion stattdessen.
-
hustbaer schrieb:
EDIT: falls du von VB her kommst: in C++ muss man immer Klammern schreiben wenn man eine Funktion aufrufen will, auch wenn diese keine Parameter hat. Sonst wird die Funktion nämlich NICHT aufgerufen, und man bekommt die Adresse der Funktion stattdessen.
Ja komme wirklich von VB.

Fehlercode:
WSAENOTSOCK 10038 Socket operation on nonsocket. An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.Aber ich erhalte einen "gültigen" Socket zurück.
-
Ich würde die Zuweisung hier drin
if(s = socket(AF_INET,SOCK_STREAM,0) != -1)nochmal klammern. Sonst sehe ich nix.