CSocket - OnReceive
-
Hallo,
Bin neu bei der ganzen Socket Sache und MFC und so und schreibe grad an einer Schnittstelle zwischen zwei Programmen, verwendet dazu CSocket.Und zwar werden Kommandos zwischen diesen beiden Programmen hin und her geschickt. Es funktioniert eigentlich alles bestens - nur bekomme ich Probleme wenn mir das andere Programm 2 Befehle direkt hintereinander schickt (z.B. ein OK und dann ein EXIT) - dann liest er nämlich in der OnReceive Funktion ab und zu bereits gleichzeitig das 2te Kommando obwohl das erste noch gar nicht fertig bearbeitet wurde.
Meine Frage ist nun ob es irgendwie möglich ist im OnReceive das zweite Kommando erst auszulesen wenn ich das erste bearbeitet habe? Also quasi ála FIFO, sodass er zuerst die erste Nachricht fertig bearbeited hat und dann erst die zweite liest.Hier die relevanten Code-Teile: (nur von einer Seite und gekürzt)
void mySocketClass::OnReceive(int nErrorCode) { CSocket::OnReceive(nErrorCode); CString msg; do // buffer may contain more than one message { (*m_read_archive) >> msg; // Hier wird mittels XML parser der Befehl verarbeitet } while (!m_read_archive->IsBufferEmpty()); }Der Gedanke dahinter sollte eigentlich sein dass er nur 1mal das OnReceive aufruft und dann anhand der do-while Schleife jegliche Nachrichten nacheinander ausliest und bearbeited... aber irgendwie ruft er (manchmal!) parallel nochmal die gesamte OnReceive Funktion auf während er noch mit dem parsen des ersten Kommandos beschäftigt ist.
Vielleicht könnt ihr mir helfen, bin schon echt am Verzweifeln xD
Vielen Dank im Voraus!
-
1. Möglichkeit: du synchronisiert die Kommunikation, dh du "beantwortest" jedes Kommando und bekommst erst nach der Antwort den nächsten Befehl.
2. Möglichkeit: du legst die Empfangenen Nachrichten in einer Datenstruktur ab, und überlässt die Verarbeitung einem anderen Thread, welcher das FIFO-artig macht. Zu beachten ist allerdings die Synchronisierung des Zugriffs auf die Daten.
-
Danke für die schnelle Antwort!
Sowas in der Art wie das 2te hab ich gesucht, nur hab ich vielleicht gehofft es gäbe etwas einfacheres, was einfach nur das OnReceive blockiert und danach ausführt - leider

Werds aber jetzt so machen, thxEine weitere Frage hätt ich noch, nämlich bekomm ich nachdem ich die beiden Programme geschlossen habe und wieder neu starte oftmals die Fehler meldung
00048 Adress already in useEigentlich sollte es ja daran liegen dass die socket connection noch nicht richtig beendet wurde. Aber obwohl ich schon die Sockets zumache bei beiden Programme und die zugehörigen Files und Archives lösche bekomm ich trotzdem noch immer diese Fehlermeldung. Vielleicht kann mir da jemand weiterhelfen ohne die ganze Leier mit dem REUSEADRESS zu meistern ^^
void mySocketClass::closeConnection() // Deletes Socket, Archives and File { if (m_file) { m_read_archive->Abort(); // avoid further Flush attempts m_write_archive->Abort(); // avoid further Flush attempts m_file->Close(); delete m_read_archive; delete m_write_archive; delete m_file; } Close(); // close socket }