CAsyncSocket Fragen
-
Hallo!
Ich muß in einer Konsolenanwendung ein simples Client/Server System mit Hilfe der Klasse CAsyncSocket realisieren. Grundsätzlich bekomme ich es hin, mit Send/Receive z.B. Strings hin und her zusenden. Aber ich hab noch ein paar Fragen.
Zuerstmal habe ich gesehen, daß die meisten Leute eine eigene Klasse von CAsyncSocket ableiten, um die OnAccept, On... Methoden zu überschreiben. Dazu meine ersten Fragen:
1. Habe ich es richtig verstanden, daß die On... Methoden automatisch aufgerufen werden? Ist das auch noch der Fall, wenn ich sie für meine abgeleitete Klasse überschreibe?
2. Wenn ich z.B. OnReceive so überschreibe, daß in ihr die Receive Methode aufgerufen wird, läuft dann das receiven automatisch ab, sobald jemand etwas sendet?
3. Wenn meine Annahmen richtig sind, wofür ist die OnSend Methode dann gut? Ich will doch selbst bestimmen, zu welchem Zeitpunkt ich was senden möchte.
Jetzt soll ich noch mit blockierenden Sockets arbeiten. Reicht Frolgendes, um in den blockierenden Modus zu wechseln?
DWORD block; CMySocket.IOCtl(FIONBIO, &block);
Meine letzte Frage:
Wie kann ich ohne eine Endlosschleife à la while(1){...} dafür sorgen, daß z.B. Send solange ausgeführt wird, bis wirklich etwas gesendet wurde? Geht das überhaupt?
Ich hatte nämlich das Problem, daß, wenn ich nicht mit so einer Endlosschleife getrickst habe mein Serverprogramm schon durgerattert war, bevor überhaupt ein Client die Chance hatte sich anzumelden.Würde mich freuen, wenn mir ein bißchen geholfen werden kann. Schonmal danke.
-
Schau dir daw Beispiel in VC++ 6 in 21 Tagen an.
Zu 1. JA
Zu 2. In der abgeleiteten Klasse Werden die Funktion von CasyncSocket bei einem Ereignis aufgerufen.
Auf diese musst du aber dann reagieren und etwas damit machen. z.B. das Empfangene Verarbeiten.Zu 3. Das bestimmst du ja selbst. Es gibt eben das OnSend um zu wissen das gesendet wurde. Was wenn das Senden nicht funktioniert!
Für blockierende Sockets reicht wenn die die Klasse CSocket verwendest.
Blockierende Sockets machen aber IMHO keine Sinn.
-
Danke.!
Ich hatte mir das Beispiel in VC++ 6 in 21 Tagen schon angesehen. Da wird ja auch alles gut erklärt mit dem Ableiten der Klasse und dem Überschreiben der Methoden. Jedoch muß ich eine Konsolenanwendung machen und bei VC++ 6 in 21 Tagen benutzen die Dialogklassen etc.. Ich hab bisher nur Konsolenanwendungen programmiert und arbeite jetzt auch zum erstenmal mit MFC Unterstützung und hab daher von Dialogbasierten Sachen keine Ahnung. Wie schnell kann man sich denn da einarbeiten??P.s.: Hat noch jemand eine Ahnung, wie ich eine Endlosschleife umgehen kann???
-
Hat noch jemand eine Ahnung, wie ich eine Endlosschleife umgehen kann???
Abbruchbedingung einbauen?
Was machst du damit? Du brauchst doch einfach nur Send(...) machen und dann die Rückgabe auswerten (siehe MSDN) in onSend rufst du die Methode der übergeordneten Klasse auf..
CAsyncSocket::OnSend(nErrorCode);
Oder wozu brauchst du die Schleife? Senden tut der auch so, bei mir zumindest
-
Es geht mir nicht darum, ob die Schleife endlos ist oder eine Abbruchbedingung hat. Es geht mir allgemein darum eine Schleife zu umgehen.
Ich versuch nochmal zu erklären, was ich meine:
Also, das ist ja wie gesagt eine Konsolenanwendung. Ich will jetzt einfach nur mal einen Server öffnen, ein Client soll sich verbinden und ich will sagen wir mal "Hallo" hin und her senden. Ist ja eigentlich kein Problem, nur, daß die Serveranwendung, da Konsolenanwendung, natürlich schon durchgelaufen ist ("Press any key..."), bevor überhaupt ein Client versuchen kann, sich anzumelden.
Deswegen habe ich anfangs eine Endlosschleife eingebaut, in der Accept(...) aufgerufen wurde. Jetzt habe ich die Schleife so verändert, daß sie beendet wird, wenn ein Client erfolgreich akzeptiert wurde.
Ich wollte halt nur wissen, ob es eine Möglichkeit ohne Schleife gibt, zu warten, bis wirklich ein Client verbunden ist.Sorry, bin