Eigene Socket-Klasse: Fehler bei connect()
-
Hallo!
ich möchte eine eigene Socket-Klasse ala Java Schreiben. Diese Klasse verwaltet das socket und stellt methoden zum verbinden, trennen und daten lesen/schreiben zur verfügung. aber immer wenn in der Connect() methode die funktion connect() aufgerufen wird stürzt das programm mit einer wenig sinnvollen fehlermeldung ab: "test.exe hat einen Fehler festgestellt und muß beendet werden." test.exe ist das programm mit der main() welches die Klasse nutzten soll.
hier der code:
#ifndef _CLIENTSOCKET_ #define _CLIENTSOCKET_ #include <string> #include <winsock2.h> namespace SocketKonstanten { const int PUFFERGROESSE=1024; } class Socket { private: bool wsainitialisiert; std::string wsafehler; std::string host; int port; sockaddr_in server_in; hostent *host_info; unsigned long addr; int sock; int bytezaehler; char puffer[SocketKonstanten::PUFFERGROESSE]; public: Socket() { /* Initialisiere TCP für Windows ("winsock") */ short wVersionRequested; WSADATA wsaData; wVersionRequested=MAKEWORD(1,1); if (WSAStartup(wVersionRequested,&wsaData)!=0) { wsainitialisiert=false; SetError("Konnte Winsock nicht initialisieren!"); WSACleanup(); } else wsainitialisiert=true; } ~Socket() { closesocket(sock); WSACleanup(); } bool Connect(std::string h, int p) { if (wsainitialisiert) { host=h; port=p; /* Erzeuge das Socket */ sock=socket(PF_INET,SOCK_STREAM,0); if (sock<0) { SetError("Konnte Socket nicht initialisieren!"); return false; } /* Erzeuge die Socketadresse des Servers Sie besteht aus Typ, IP-Adresse und Portnummer */ memset(&server_in,0,sizeof(server_in)); if ((addr=inet_addr(host.c_str()))!=INADDR_NONE) { // IP ist nummerisch memcpy((char *)&server_in.sin_addr,&addr,sizeof(addr)); } else { /* Wandle den Servernamen in eine IP-Adresse um */ host_info=gethostbyname(host.c_str()); if (NULL==host_info) { SetError("Host "+host+" ist unbekannt!"); return false; } memcpy((char *)&server_in.sin_addr,host_info->h_addr,host_info->h_length); } server_in.sin_family=AF_INET; server_in.sin_port=htons(port); // HIER KOMMT DER FEHLER /* Baue die Verbindung zum Server auf */ if (connect(sock,(struct sockaddr*)&server_in,sizeof(server_in))<0) { SetError("Konnte Host "+host+" nicht erreichen!"); return false; } // DER FEHLER IST: test.exe hat einen Fehler festgestellt und muß beendet werden. int rc; unsigned long blockaus=1; if ((rc=ioctlsocket(sock,FIONBIO,&blockaus))!=0) { SetError("Konnte Socket nicht auf non-blocking stellen!"); return false; } return true; } else return false; } void Close() { closesocket(sock); } std::string RecvString() { memset(&puffer,0,sizeof(puffer)); bytezaehler=recv(sock,puffer,sizeof(puffer),0); std::string s=""; s.append(puffer); return s; } void SendString(std::string s) { send(sock,s.c_str(),strlen(s.c_str()),0); } std::string GetError() { return wsafehler; } private: void SetError(std::string meldung) { char tmp[6]; itoa(WSAGetLastError(),tmp,10); wsafehler=meldung; wsafehler.append(" Fehlercode:"); wsafehler.append(tmp); } }; #endif // _CLIENTSOCKET_
was ist da falsch??
thx schon mal im voraus
-
habe ich irgendwie falsch gepostet? zuviel code? oder weiß einfach keiner die antwort??
-
Erstelle ein compilierbares, minimales Beispiel, am besten ohne Klasse.
-
ja. klar. nur das hab ich schon. der witz ist ja das es dann geht. ich habe auch eine klasse die die eine email veschickt. (ist selber geschrieben bevor hier irgengein geschreie losgeht). allerdings ist da das socket nicht vom benutzerprogramm getrennt.
-
dann würd ich etwas wegmachen, kompilieren, wegmachen, kompilieren usw. bis es wieder läuft, dann weißt du wo der fehler liegt und kannst genauer fragen
-
Benutze einen Debugger.
Bye, TGGC (Für echte Fans)
-
okay. ich habe den fehler gefunden. lag am benutzerprogramm (test.exe). der hat die ip falsch übergeben
.
private: std::string ip; std::string GeneriereIp() { // ... generieren printf("tempip: %s\n",ip.c_str()); // hier richtige IP return tempip; } public: testit() { ip=GeneriereIp(); // hier irgendein kauderwelsch übergeben. warum? }
warum funktioniert das nicht???
ich havs jetzt so gelöst, das ich nicht mehr einen string zutückgebe sondern void benutze und die variable ip von der methode GeneriereIp() direkt setzen lasse.
aber das muß doch auch so wie oben gehen?nja. auf jeden fall funzt es.
thx...
-
// HIER KOMMT DER FEHLER
/* Baue die Verbindung zum Server auf /
if (connect(sock,(struct sockaddr)&server_in,sizeof(server_in))<0) {
SetError("Konnte Host "+host+" nicht erreichen!");
return false;
}Da ist ein fehler bei SetError: du must \"+host+\" schreiben - oder sehe ich da was falsch?
-
Ja, Du hast Recht:
Du siehst da was falsch!
-
sn0b schrieb:
[cpp]
printf("tempip: %s\n",ip.c_str()); // hier richtige IP
return tempip;
[/cpp]
warum funktioniert das nicht???Ist das Absicht, dass der String, den du ausgibst, nicht derselbe ist wie der, den du zurückgibst?
-
MFK schrieb:
sn0b schrieb:
[cpp]
printf("tempip: %s\n",ip.c_str()); // hier richtige IP
return tempip;
[/cpp]
warum funktioniert das nicht???Ist das Absicht, dass der String, den du ausgibst, nicht derselbe ist wie der, den du zurückgibst?
ich glaube er sollte besser sprintf nehmen
-
nein.
aber ich gab trotzdem das ur-problem wieder das er bei connect() abschmiert.
und zwar dann, wenn er keine verbindung aufbauen kann: die verbindung z.b. zu heise.de geht, aber wenn ich irgendeine ip eintrage die nicht exisiert, also wo halt keine antwort kommt, dann schmiert er wie oben beschrieben ab.
-
Tja, dann wirst du dir wohl doch TGGCs Rat zu Herzen nehmen müssen und endlich den Debugger benutzen. Dann gibts auch eine ausführlichere Fehlermeldung.
-
okay. ich habs jetzt. ich habe TGGCs rat befolgt und wollte den debugger starten. dafür muß man bei dev-c++ nunmal ein projekt erzeugen und als ich das gemacht hatte und kompiliert habe, sagte der compiler mir auch gleich den fehler: habe printf nen std::string übergeben ohne diesen vorher in einen c-string umzuwandeln. diese ausgabe kam direct nach connect() wenn der host nicht erreicht werden konnte. dummer fehler, ich weiß. aber hab n ja dank eurer hilfe doch noch gefunden. war nämlich echt am verwzeifeln.
vielen dank nochma!
auf bald
-
sn0b schrieb:
aber hab n ja dank eurer hilfe doch noch gefunden.
Das jemand dies als Hilfe erkannt hat, erlebe ich selten. Glückwunsch.
Bye, TGGC (Der Held lebt!)