Hallo zusammen,
ich habe ein MFC-Projekt, in dem ich einen Socket zur 'Fernsteuerung'
der Applikation implementieren möchte. Das Ganze ist eine
Single-Threaded-Anwendung. Wenn also der Socket blockiert blockiert die
komplette Anwendung (das ist gewollt so).
Aus diesem Grund hatte ich folgende Idee:
1. Der Socket wird als nicht-blockierend konfiguriert und prüft
zyklisch, ob sich ein Client mit ihm verbinden möchte. Bei vorhandenem
Client wird die Verbindung aufgebaut.
2. Wird ein bestimmtes 'Telegram' über den Socket empfangen (erstes Byte
== 0), wird der Socket umkonfiguriert (blockierend) und es wird auf
weitere Daten von außen gewartet. Solange keine Daten kommen steht auch
die Applikation. Werden Daten von außen empfangen wird darauf reagiert
(bei bestimmten Objekten etwas geändert,...) und auf das nächste
Kommando gewartet
3. Wird ein anderes Telegram (erstes Byte == 1) empfangen wird der
Socket wieder umkonfiguriert (nicht-blockierend) und es geht bei Punkt 2
wieder von vorne los
Das funktioniert mit dem angehängten Code auch schon ganz gut.
Folgende Fragen/Probleme stellen sich allerdings:
1. Ich muss die Funktion AfxSocketInit() mehrmals aufrufen. Speziell der
Aufruf in der zyklischen Funktion (HandleTimerEvent()) stört mich. Habe
mir die Funktion mal angeschaut, dort werden - wenn Pointer auf NULL
zeigen - Objekte mit new erzeugt. In diese Fälle läuft er auch jedesmal
rein. Produziere ich dadurch irgendwo ein Speicherleck??? Wenn ich die
Funktion dort nicht rufe geht aber der Aufruf
1 | if (0 != m_ListenSocket.Accept(m_CommSocket))
|
schief (Debug-Assertion)
2. Neim Beenden der Applikation bekomme ich eine Debug-Assertion in der
Datei sockcore.cpp in der Funktion
1 | CAsyncSocket* PASCAL CAsyncSocket::LookupHandle(SOCKET hSocket, BOOL bDead)
|
Hier wird in der Zeile
1 | pSocket = (CAsyncSocket*)pState->m_pmapSocketHandle->GetValueAt((void*)hSocket);
|
auf einen Pointer zugegriffen, der an dieser Stelle NULL ist.
Kann mir bitte jemand erklären, warum der Pointer NULL ist? Und ob es
tatsächlich sinnvoll/nötig ist AfxSocketInit() so oft zu rufen.
Vielen Dank im voraus und viele Grüße