CAsyncSocket Problem
-
Hallo zusammen,
ich benutze für eine Socketverbindung die MFC Klasse CAsyncSocket.
Das Problem ist das jeweils nur ein connected sein darf.Kommt aber während einer connection ein zweite Anfrage von einem Client
schmiert mir die Server Anwendung ab :(.Ich vermute den Fehler in meiner OnSocketAccept Funktion.
Leider weiss ich nicht wie ich den zweiten Client abweisen kann
ohne das der andere verbundene Client in mitleidenschaft gezogen wird.Hat einer von euch Profs eine Idee wie das lösen kann?
void CSesamServerDlg::OnSocketAccept( WPARAM wParam, LPARAM lParam ) { // Accept connection only if no other client is connected if ( !this->m_bClientIsConnected ) { this->m_bClientIsConnected = true; if ( m_cSocket.Accept(m_cSocketConnected) != 0 ) { this->m_bClientIsConnected = true; } } else { // Hier muss denke ich noch was bestimmtes eingebaut werden ?!? this->WriteLogFile("Incoming request denied. Server is occupied"); } }
-
Versuchs mal obs funtkioniert wenn du den Listen Socket nach dem Accept schließt.
-
Wie wäre es wenn du für jeden Clienten einen neuen CAsyncSocket kreieren würdest?
In der MSDN ist ein Sample davon...
Ciao
-
Hi,
Versuch mal folgendes.1. Wenn du einer Socket-Klasse mit App Wizard erstellst, solltest du sagen, dass du vom CAsyncSocket ableitest. Nicht manuell erstellen.
2. Dann mit <Str>+<w> kannst du denn Klassen Assistenten aufrufen
Hier gehst du auf Member Funktionen und wählst alle On... Funktionen die du brauchst (MSDN: "Overridable Notification Functions").
Du brauchst z.b.: OnAccept OnClose und evt. OnConnect, ich hatte alle ausser OnOutOfBandData überschrieben. (War schon lange her) einfach markieren und auf "Hinzufügen" gehen. Jetzt hast du sie in Header und Cpp files.
3. Jetzt gehst du zu OnAccept(). Wichtig ist, dass du den "Eltern" Aufruf an der ersten Stelle lässt. Also so was wie CAsyncSocket::OnAccept(); solte als erstes stehen.
4. Erstelle die in der Header z.b. sowas:#define MAX_CLIENTS 1 CAsyncSocket* m_pClientSocket[MAX_CLIENTS]; // Dann kannst du noch ein Array gebrauchen, z.b.: bool m_bConnected[MAX_CLIENTS];Irgendwo in der cpp muss du noch new machen oder halt auf dem Stack ClientSockets erzeugen.
5. In deiner OnAccept muss Du nachdem CAsyncSocket::OnAccept(nErrorCode) Aufruf nach den Fehlern prüfen und wenn alles OK war, das hier machen (Pseudocode):for (int i = 0; i < MAX_CLIENTS; i++ ) { if (m_bConnected[i] == false) { Accept(*m_pClientSocket[i]); // Wenn connected, m_bConnected[i] auf true setzten } // evt. wenn alle schon connected sind Exception werfen }Jetzt kannst du über m_pClientSocket[i] die Daten hin und her schicken und wenn du mit ihm fertig bist, muss du noch m_pClientSocket[i]->Detach() und m_pClientSocket[i]->Close() machen, dann ist dein Client Socket wieder frei und du kannst ihn bei der nächsten Anfrage wieder benutzen.
Wenn es dir nicht weiter hilft geh auf programmierer-board.de und suche nach "CAsyncSocket", Autor muss "jdot" sein, da gibt es ordentlich Zeug dazu.
Versuche das hier erst mal. Und viel Spaß!
