Eventhandler wird nicht ausgeführt.
-
Hupps, hast du wohl recht

Versuchs trotzdem mal mit CAsyncSocket...
-
Hallo,
ein Blick in die MSDN verrät:
Remarks:
In CSocket, the OnConnect notification function is never called. For connections, you simply call Connect, which will return when the connection is completed (either successfully or in error). How connection notifications are handled is an MFC implementation detail.
-
Ahh ok...
Doch.
1. Warum nicht?
2. Was ist wenn ich beispielsweise Funktionen aus der Klasse CSync brauche und den Eventhandler OnConnect()?A-jage
-
ad 2.: Pech. Um was für ne Funktion gehts denn?
-
Naja, ich brauch ja jetz nicht wirklich unbedingt eine Funktion aus CSocket(), aber was wenn...? Zum Beispiel OnMessagePending()? Da is doch ein Denkfehler bei den Entwicklern oda nicht...?
Und was is mit erstens..? :):)
A-jage
-
OnMessagePending braucht man nur weil CSocket blockierende IO Calls verwendet. Da CAsyncSocket nicht-blockierende IO Calls verwendet braucht man auch kein OnMessagePending

Zu 1 - keine Ahnung, hat vielleicht technische Gründe. Oder dass MS angenommen hat dass man sowieso entweder alles blocking oder alles non-blocking macht.
In anderen Libraries gibt es sehrwohl Klassen mit denen man beides machen kann.
Anders gesagt: "MS hat es eben so gemacht, warum auch immer"
-
OnMessagePending braucht man nur weil CSocket blockierende IO Calls verwendet. Da CAsyncSocket nicht-blockierende IO Calls verwendet braucht man auch kein OnMessagePending
Ok, Frage anders gestellt: Ich möchte eine synchrone Verbindung mit CSocket aufbauen und im Nachhinein die Funktion OnMessagePending() verwenden. Unmittelbar nach dem Verbindungsaufbau möchte ich aber überprüfen, ob beim Verbindungsaufbau Fehler aufgetreten sind. Wenn ja, dann soll es beispielsweise eine Fehlermeldung geben. Dazu bräuchte man dann doch OnConnect(), doch da diese Funktion in CSocket ja nicht aufgerufen wird, wie stelle ich das Ganze dann an..?
A-jage
-
Ich habe nun den Vorschlag ausprobiert und meine Klasse von CAsynckSocket abgeleitet.
Der Eventhandler wird aber nur ausgeführt, wenn der ErrorCode gleich Null ist, also nur der Else-Teil:
void CMessengerSocket::OnConnect(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(0 != nErrorCode) { m_ConnectionFailed.LoadString(IDS_CONNECTION_FAILED); AfxMessageBox(m_ConnectionFailed); } else { //Call NewFrame() to create new mainframe theApp.NewFrame(); } CAsyncSocket::OnConnect(nErrorCode); }Wenn ich z.B. den Verbindungsaufbau mit der Firewall verweigere, dann tut sich gar nichts...
Warum..? Langsam werd ich hier verrückt.. -.-A-jage
-
Hast du auch lange genug gewartet? Firewalls schicken oft kein "geht nicht" zurück wenn man die Verbindung "verbietet" sondern blocken einfach die ausgehenden "SYN". Das hat zur Folge dass das "connect" erst nach einem relativ langen Timeout fehlschlägt. Also warte mal 1-2 Minuten und guck ob dann immer noch nix kommt.
Oder nimm eine IP die sicher antwortet (z.B. 127.0.0.1) und einen Port der garantiert nicht existiert. Dann bekommst du sofort deinen Fehler.
-
Zur Methode 1: Ich habe 5 Minuten lang gewartet, ohne dass sich was getan hat.
Zur Methode 2: 127.0.0.1 und 3999999, hat geklappt, doch habe ich dadurch die Gewissheit, dass es bei einem "Ernstfall" klappen wird?
A-jage