evtl. Fehler bei Sockets



  • Ich habe in meinem Programm ein Objekt vom Typ (abgeleitete Klasse) CAsyncSocket, das ein Serversocket darstellt. Von einem Dialog aus wird nun eine zweite Instanz des Programms auf einem anderen Rechner im Netzwerk aufgefordert, sich mit mir zu verbinden. Dies geschieht unabhängig vom obigen Socket über UDP.

    Falls diese zweite Instanz es ablehnt sich zu mir zu verbinden, rufe ich die selbe Funktion auf, wie wenn ein Timeout eintritt (das zweite Programm hat 10 Sekunden für eine Antwort, da eine Benutzereingabe erforderlich ist), nämlich die folgende:

    void CDlgConnection::ConnectionStop()
    {
    	mConTimeout = 0;
    	KillTimer(1);   // der Timeout-Timer
    	mConReqThread.SetParent(NULL);
    	mParent->SocketStop();   // hier kommt gleich der Fehler
    }
    

    mParent ist ein Zeiger auf mein CMyProcDoc, in dem sich das SocketObjekt befindet. Die Funktion SocketStop():

    void CMyProcDoc::SocketStop()
    {
    
    	mReceivingSocket.Close();   // FEHLER !!!
    	mSendingSocket.Close();   // (kein Fehler)
    	// ...
    }
    

    mReceivingSocket ist dabei das ServerSocket, und hier tritt der Fehler auf. Kommt es in dem oben beschriebenen Fall zum Timeout, passiert kein Fehler.
    Verweigert aber das zweite Programm die Verbindungsaufnahme (zur Erinnerung, es wid die selbe Funktion aufgerufen) passiert der folgende Fehler:

    Der Debugger stoppt die Ausführung mit folgender Meldung:
    "Unhandled exception at 0x00549e62 in MyProc.exe: 0xC0000005: Access violation reading location 0x00000004."
    Er zeigt dabei auf die Methode void GetValueAt(void* key) const* der Klasse CMapPtrToPtr. Damit kann ich überhaupt nichts anfangen.

    Mir scheint die Beschreibung auch etwas wage, also wer mehr Code sehen will, bitte danach fragen. Ich bin für jeden Hinweis und Denkanstoß dankbar.



  • Evolver schrieb:

    mParent ist ein Zeiger auf mein CMyProcDoc, in dem sich das SocketObjekt befindet.

    Bist du sicher, dass der Zeiger an dieser Stelle auch tatsächlich auf ein CMyProcDoc-Objekt zeigt? Die Fehlermeldung lässt vermuten, dass du da einen Nullzeiger hast.



  • Ja, ich bin sicher. Ich hatte zu Testzwecken eine MessageBox ausgeben lassen, deswegen weiß ich genau, dass der Fehler in der Zeile mReceivingSocket.Close(); passiert. Soweit konnte ich das eingrenzen.



  • Ich setzte jetzt als Ersatzlösung die TimeoutVariable auf 0, falls die Verbindung abgelehnt wird. Dann wird die Funktion ConnectionStop() beim nächsten TimerEvent (falls der Timer noch existiert) aufgerufen.


Anmelden zum Antworten