Paralleler Server
-
Moin moin
Ich möchte einen einfachen parallelen server basteln. Dazu erzeuge ich in meinen Dialog ein Object der Klasse CCommandSocket und starte davon die Memberfunktion listen
void CVisualDlg::StartListening() { StopListening(); m_comSocket = new CCommandSocket(this); SetDlgItemText(IDC_STATIC1,"StartListening"); if (m_comSocket) { if (m_comSocket->Create(COMPORT,SOCK_STREAM,FD_ACCEPT)) { m_comSocket->Listen(); SetDlgItemText(IDC_STATIC1,"Server is Listening"); } } }void CCommandSocket::OnAccept(int nErrorCode) { BOOL succ = FALSE; do { pRequest = new CRequestSocket(_pdlg); AfxMessageBox("Message receive",MB_OK); if ( succ = Accept( *pRequest )) { pRequest->AsyncSelect(FD_READ | FD_CLOSE); } } while(succ); pRequest->Close(); CAsyncSocket::OnAccept(nErrorCode); }Sobald das CComandSocket-Objekt eine Anforderung akzeptiert, wird eine Instanz der Klasse CRequestSocket erzeugt und die Benachrichtigung für Read- und Close-Nachrichten aktiviert.
CRequestSocket ist ebenfalls von CAsyncSocket abgeleitet und ist für das receiven und senden von Nachrichten zuständig.
void CRequestSocket::OnReceive(int nErrorCode) { int nBytes; unsigned char buffer[r_BufSize]; nBytes = Receive(buffer,r_BufSize); editBuffer(nBytes,buffer); if (nBytes == SOCKET_ERROR) { ASSERT(GetLastError() == WSAEWOULDBLOCK); return; } AsyncSelect(FD_WRITE ); CAsyncSocket::OnReceive(nErrorCode); }Aber der Server soll nur erst mal Daten empfangen.
Kann mir mal jemand ne'kleine Erklärung geben, wie der Server mehrere Anfragen behandelt. Also so lange der Dialog existiert müssen Anfragen behandelt werden.
Natürlich hab ich vorher in der Anwendungsklasse die Windows-Sockets initialisiert.
Danke schon mal im voraus.Beste Grüsse
gyros
-
Ich möcht quasi einfach zwischen einem Client und meinem Server die Verbindung aufrecht erhalten und das ständig zwischen den beiden Daten hin und her verschickt werden können. Aber die Verbindung darf zwischen durch nicht abbrechen. Weil bei mir nur ein Paar Daten vom Client an den Server geschickt werden und der Server sie dann auch empfängt, dannach aber der Server keine Daten mehr bekommt, obwohl der Client sendet.
Hat irgendjemand ne'Idee?Danke
-
Kann mir wirklich keiner helfen???? Es ist wirklich dringend...
gruss
gyros
-
Moin
Sorry... Vieleicht hab ich mich unverständlich oder etwas wirr ausgedrückt.
Ich möchte das sich der Client an meinen Server anmeldet und der Server die Verbindung akzeptiert. Es soll dann die Verbindung zwischen Server und Client aufrecht erhalten bleiben, so dass ständig Daten versendet werden können zwischen Client und Server. Es müssen nicht immer Daten versendet werden, die Verbindung soll aber bestehend bleiben. In meinem Programm oben bekommt der Server 2 Datenpakete und dann empfängt er nichts mehr, obwohl der Client sendet.
Kann mir da jemand einen Tip geben wie ich mein Problem lösen kann.
Danke schon mal im voraus.Beste Grüsse
gyros
-
Schließt du vieleicht irgendwo ausversehen deinen Socket?
-
Danke Chris++ für deine Antwort. Das Problem ist das die Verbindung nicht geschlossen wird sondern das der Server keine Daten mehr empfängt bzw. keine Benachrichtigung für Read mehr bekommt.
gruss
gyros
-
Bastel doch mal ein kleines Kompilierbares Beispiel wo der gleiche Fehler auftritt. Mit dem Code kann ich leider nicht viel anfangen (und mit zu viel Code auch nicht
).
-
Moin Chris
Ich habs jetzt endlich hinbekommen. Wie kann man nur so'ne Plinse sein wie ich.
Ich hab einfach nur vergessen die Benachrichtigung bei ->AsyncSelect auch für READ
zu aktivieren(In der Klasse RequestSocket).void CRequestSocket::OnReceive(int nErrorCode) { int nBytes; unsigned char buffer[r_BufSize]; nBytes = Receive(buffer,r_BufSize); editBuffer(nBytes,buffer); if (nBytes == SOCKET_ERROR) { ASSERT(GetLastError() == WSAEWOULDBLOCK); return; } AsyncSelect(FD_WRITE | FD_READ ); <---------- DA IST DIESER BEKACKTE FEHLER GEWESEN CAsyncSocket::OnReceive(nErrorCode); }Da versucht man tagelang irgendwas hinzubekommen mit Threads oder anderen abenteuerlichen Methoden, weil man schon an MFC und dieser ganzen Socket-Kacke zweifelt und dann merkt man das MFC doch gar nicht so schlecht ist wie alle immer sagen!!!
Trotzdem... Danke für deine Hilfe
gruss
gyros
-
warum rufst du überhaupt AsyncSelect in OnReceive auf? einmal nach dem akzeptieren der verbindung reicht doch.
-
Ich hab mich schon gefragt warum du nicht postest
Aber gut das du den Fehler gefunden hast.