Problem mit WinSock2
-
Hallo erstmal... bin mir nicht sicher, ob das hier wirklich in dieses Forum gehört.
Ich habe folgendes Problem: Ich habe eine DLL geschrieben, die mehrere Klassen bereitstellt, die mit WinSock2 arbeiten. Beim Testen erhalte ich eine Fehlermeldung, mit der ich wenig anfangen kann. Ich schreibe die für mein Problem relevanten Klassendeklaritionen (bzw. Ausschnitte dieser) hier rein:
class __declspec(dllexport) [b]C_SMCTCP_Abstract_WS2_Socket[/b] { protected: static void initWS2(); static void shutdownWS2(); static int num_sockets; SOCKET sock; };
class __declspec(dllexport) [b]C_SMCTCP_Socket[/b] : public C_SMCTCP_Abstract]_WS2_Socket { public: virtual ~C_SMCTCP_Socket (); // [...] protected: // [...] private: friend class C_SMCTCP_ClientSocket; C_SMCTCP_Socket (); void init (); };
class __declspec(dllexport) [b]C_SMCTCP_ClientSocket[/b] : public C_SMCTCP_Socket { public: C_SMCTCP_ClientSocket(const char* host, const unsigned int port); };
Für mein Problem relevant sind die folgenden zwei Funktionen, derer Implementierungen ich jetzt zusätzlich poste:
void C_SMCTCP_Abstract_WS2_Socket::[b]initWS2()[/b] { if (num_sockets == 0) { WSADATA info; WORD word = MAKEWORD(2,0); if (WSAStartup(word, &info)) { throw "Could not start WSA"; } } num_sockets++; }
C_SMCTCP_ClientSocket::[b]C_SMCTCP_ClientSocket[/b](const char* host, const unsigned int port) { initWS2(); hostent *he; if ((he = gethostbyname(host)) == 0) { throw strerror(errno); } sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr = *((in_addr *)he->h_addr); memset(&(addr.sin_zero), 0, 8); if (::connect(sock, (sockaddr *) &addr, sizeof(sockaddr))) { throw strerror(WSAGetLastError()); } init(); }
Beim Aufruf des nächsten Schritts nach ::connect in Zeile 15, in dem Fall bei init(), gibt der Debugger einen Fehler aus: char an Speicherposition 0x... Der Fehler ist von init() unabhängig, ich könnte in Zeile 18 std::cout << std::endl; schreiben, der Fehler würde in Zeile 18 angezeigt werden. Der Fehler hat also etwas mit dem ::connect-Aufruf zu tun, allerdings kann ich nicht entdecken, was. Per Debugger habe ich überprüft, ob die Parameter vernünftige Werte haben, und konnte keine Null-Pointer entdecken.
Für den Fall, dass es jemandem hilft, schreibe ich die Werte, die der Debugger für die relevanten Variablen (Parameter von ::connect) geliefert hat, hier rein:
sock = 3452816845 addr sin_family = 2 sin_port = 53764 sin_addr = {S_un={...}} sin_zero [0] = 0 [1] = 0 [2] = 0 [3] = 0 [4] = 0 [5] = 0 [6] = 0 [7] = 0
Bin für jeden Hinweis dankbar
-
kannste mal den ganzen code hochladen?
-
Ja, gerne, hier: http://rapidshare.com/files/33129705/smctcp-src.zip.html
-
Lässt sich leider nicht kompilieren. Hab Visual C++ 2005 Pro. Die Fehler und Warnungen brauche ich dir ja jetzt glaub ich nicht zu nennen, du müsstest die ja auch bekommen?!
-
Doch, müsstest du tun, denn ich bekome keine Fehler oder Warnungen
Hab MS Visual C++ 2005 Express Edition.
-
Jetzt nur mal für smctcp-1.0 Debug Version: http://rafb.net/p/BXyfq083.html
-
Oh gott, hab grad mal ein Rebuild gemacht, jetzt bekomme auch ich ein paar Fehler... Sonst meinte der immer, alles wär aktuell, und keine Fehler
Ich melde mich nochmal, wenn ich die Fehler ausgemertzt habe. Danke schonmal^^
-
ich glaube es liegt an throw strerror(WSAGetLastError()); wenn ich das rausmache stürzt es nicht mehr ab.