CAsyncSocket
-
Hi
Ich hab ein Problem mit der CAsyncSocket Klasse. Aus irgend einem Grund kann ich damit keine Verbindung aufbauen bzw. bekomme ich von der Connect Funktion immer FALSE returned.
// FUNKTIONIERT NICHT CAsyncSocket* ASock = new CAsyncSocket(); ASock->Create(); if(!ASock->Connect("localhost", 2000)) AfxMessageBox("CONNECTION FAILED"); else{ CString str = "TEST"; ASock->Send(str, str.GetLength()); } ASock->Close(); delete ASock;// FUNKTIONIERT JEDOCH PROBLEMLOS CSocket* Sock = new CSocket(); Sock->Create(); if(!Sock->Connect("localhost", 2000)) AfxMessageBox("CONNECTION FAILED"); else{ CString str = "TEST"; Sock->Send(str, str.GetLength()); } Sock->Close(); delete Sock;Wo liegt das Problem?
-
aerou schrieb:
Wo liegt das Problem?
Das Problem ist, dass dir anscheinend nicht klar ist, was das "Async" in CAsyncSocket bedeutet, und dass du ihn wie CSocket benutzt.
Wenn es mit CSocket klappt, dann benutzt das doch.
-
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError.So steht es zumindest in der MSDN zu "CAsyncSocket::Connect".
http://msdn2.microsoft.com/fr-fr/library/dxt965kz.aspxDaher habe ich angenommen, dass Connect dem zufolge dann auch true zurück liefern sollte wenn die Verbindung aufgebaut werden konnte.
-
Hast du eventuell nehme ich an die Winsock Geschichte nicht initzialisiert ? Da gibts son Befehl damit da überhaupt was geht. Wenn du mit dem Assistenten das von Anfang an angibts das Winsock benuttz wird ist das mit drin aber sonst musste manuell machen.
-
Ja, die Sockets sollten eigentlich initialisiert sein.
Deswegen funktioniert es ja auch mit dem CSocket. Aber ich versteh momentan nicht, warum es mit CAsyncSocket nicht geht?
-
aerou schrieb:
So steht es zumindest in der MSDN zu "CAsyncSocket::Connect".
Lies doch bitte mal genau an der Stelle, die du da zitiert hast, den nächsten Satz.
-
Return Value
Nonzero if the function is successful; otherwise 0, and a specific error code can be retrieved by calling GetLastError. If this indicates an error code of WSAEWOULDBLOCK, and your application is using the overridable callbacks, your application will receive an OnConnect message when the connect operation is complete. The following errors apply to this member function: [...]Trotzdem sollte die Connect Funktion doch true returnen, wenn sie erfolgreich war, oder lieg ich da falsch? Die Error Codes kommen ja nur ins Spiel, wenn eben nicht connected werden konnte, also praktisch wenn false returned wird.
-
Die entscheidende Eigenschaft von asynchronen Funktionen ist, dass sie bisweilen zurückkommen, bevor der dadurch angestoßene Vorgang beendet ist. Es kann also sein, dass CAsyncSocket::Connect zurückkommt, bevor der Verbindungsvorgang abgeschlossen ist.
In so einem Fall passiert genau das, was in der MSDN Library beschrieben ist: Connect liefert FALSE, GetLastError liefert WSAEWOULDBLOCK, und OnConnect wird aufgerufen, wenn das Ganze beendet ist, sei es erfolgreich oder nicht.
Das musst du natürlich auch dementsprechend behandeln.
-
Aha ok. Vielen Dank für die Informationen.
