Eventhandler wird nicht ausgeführt.



  • Hallo ich habe eine Klasse "CMessengerSocket" erstellt, die von "CSocket" abgeleitet ist.

    Die Verbindungsherstellung erfolgt über den folgenden Code:

    void CDesktopChatMessengerApp::ConnectServer()
    {
    	//Initialization
    	m_NotificationServer = "messenger.hotmail.com";
    	m_NotificationServerPort = 1863;
    
    	//Create connection
    	CMessengerSocket* pMessengerSocket = new CMessengerSocket;
    	m_pMessengerSocket = pMessengerSocket;
    	m_pMessengerSocket->Create();
    	m_pMessengerSocket->Connect(m_NotificationServer, m_NotificationServerPort);
    
    }
    

    Der Verbingunsaufbau verläuft erfolgreich. (Mit netstat kann man die Verbindung sehen.)
    Nun sollte eigentlich der Aufruf des Eventhandlers CMessengerSocket::OnConnect() erfolgen.
    Die Deklaration:

    public:
    	virtual void OnConnect(int nErrorCode);
    

    Die überschriebene Funktion:

    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();
    	}
    
    	CSocket::OnConnect(nErrorCode);
    }
    

    Doch irgendwie wird der Eventhandler einfach nicht ausgeführt, und ich finde einfach nicht die Ursache. Keine Errors beim Kompilieren.

    J!M!



  • Wenn du OnConnect verwenden willst musst du schon von CAsyncSocket ableiten und nicht von CSocket.
    CSocket kennt kein OnConnect.



  • Doch. Tut es eigentlich schon... Ich gehe zumindest davon aus, denn der Code

    void CMessengerSocket::OnConnect(int nErrorCode)
    {
        // TODO: Add your specialized code here and/or call the base class
    
        CSocket::OnConnect(nErrorCode);
    }
    

    wurde vom Assisten automatisch hinzugefuegt, nachdem ich im Eigenschaftsfenster/Button "Overriden" der Klasse CMessengerSocket beim Event "OnConnect" auf "add OnConnect()" geklickt habe.

    Und ausserdem ist doch CSocket eine abgeleitete Klasse von CAsyncSocket, also muesste es ja den Eventhandler geerbt haben..?

    A-jage



  • 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


Anmelden zum Antworten