CAsyncSocket in Konsolenanwendung
-
Hallo zusammen,
ich bin gerade dabei einen kleinen TCP Server zu schreiben an dem sich ein paar Clients anmelden können. Für den Server benötige ich keine schöne Oberfläche, deshalb sollte eine Konsolenanwendung reichen. Aus früheren Anwendungen habe ich gute Erfahrungen mit der Klasse CAsyncSocket gemacht. Allerdings scheint es nicht so einfach zu sein mit CAsyncSocket in einer Konsolenanwendung zu arbeiten.
Vielleicht kurz etwas Code:
class CListenSocket : public CAsyncSocket { public: CListenSocket(); virtual ~CListenSocket(); virtual void OnAccept(int nErrorCode); virtual void OnClose(int nErrorCode); virtual void OnConnect(int nErrorCode); private: };
main:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { ... CListenSocket* listenSocket = new CListenSocket(); int socketRetVal; if(!AfxSocketInit()) { cout << "Failed to Initialize Sockets" << endl << "> "; } socketRetVal = listenSocket->Create(TCP_PORT, SOCK_STREAM, FD_ACCEPT | FD_CONNECT | FD_CLOSE); if (!socketRetVal) { cout << "ERROR Create: " << GetLastError() << endl << "> "; } socketRetVal = listenSocket->Listen(5); if (!socketRetVal) { cout << "ERROR Listen: " << GetLastError() << endl << "> "; } ... while (quit) { ... cin >> input; ... } ... }
OnAccept(...) wird leider nie aufgerufen wenn sich ein Client verbinden will. Somit bekomme ich überhaupt nicht mit dass ein Client sich verbinden will. Somit kann ich auch nicht Accept dem Client antworten.
Hat jemand schon einmal versucht CAsyncSocket in einer Konsolenanwendung zu benutzen? Oder habe ich gerade einen groben Fehler in meinem Code den ich nicht finde. Bei einer Dialoganwendung habe CAsyncSocket immer im View erstellt. Dort hatte ich keine Probleme.
Natürlich könnte ich alles mit den normalen Sockets programmieren, aber irgendwie läst mir das keine Ruhe. Oder geht das grundsätzlich nicht?Schönen Abend!
-
Du brauchst eine Nachrichtenschleife!
Dazu müsstest du wohl einen neuen Thread erstellen, der Hauptthread muss ja auf die Eingabe warten!
-
Vielen Dank für deine Antwort!
Ich habe es gerade ausprobiert, funktioniert einbandfrei.Kurz noch für alle die auch mal über das Problem stolpern sollten:
CListenSocket läuft jetzt in einem getrennten Thread. Für jeden Client erzeuge ich noch mal einen extra Thread. Alle Threads sind von CWinThread abgeleitet um eine extra Nachrichtenschleife pro Thread zu besitzen.
Ein Stolperstein ist dabei noch das übergeben eines Sockets nach einen Accept in den neuen Thread. Hier ist folgender Link hilfreich:
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q175/6/68.asp&NoWebContent=1Schönen Abend noch ...
-
Du brauchst doch nicht für jeden Client einen seperaten Thread, wenn du CAsyncSocket verwendest!