wxwidgets - Events auslassen?
-
Hallo,
ich habe mir eine Netzwerk-Client-Klasse geschrieben.
Diese sammelt alle meine Daten-Paket-Eingänge und wertet die dann Schritt für Schritt aus. Dabei werden die wxSOCKET-Events abgefangen und nur weiter gereicht, wenn es kein wxSOCKET_INPUT ist, denn dann lese ich die DAten ein und gebe das Event nur aus, wenn ein Daten-Eingang vollständig ist.Jetzt habe ich folgendes Problem. Ich lese derzeit immer bei wxSocketBase-Read() mit einem Buffer von 1024 ein. Ich habe festgestellt, wenn im SocketBuffer noch weitere Daten vorhanden sind, dann wird ein neues Event wxSOCKET_INPUT ausgelöst. Das ist auch super so.
Wenn jetzt mein Server mit 2000 Bytes Daten sendet und danach die Verbindung beendet, dann habe ich folgendes in den Events stehen (Vermutung!)
wxSOCKET_INPUT wxSOCKET_LOST
Nach meinem Einlesen von 1024 Bytes in den Buffer müsste dann folgendes stehen:
(wxSOCKET_INPUT - hab ich gerade abgearbeitet) wxSOCKET_LOST wxSOCKET_INPUT (neu, weil ja noch 976 Bytes im Socket-Buffer liegen)
Da ich jetzt natürlich bei wxSOCKET_LOST ganz brav Socket mit Destroy zerstöre kann ich die Daten danach nicht mehr lesen.
Ich vermute, dass es so ist, denn eine andere erklärung habe ich nicht dafür, dass immer beim wxSOCKET_LOST (also ich meine wenn der Server ABSICHTLICH beendet) meine Datenpakete unvollständig sind.
Sollte ich richtig liegen mit meiner Vermutung, wie könnt ich das Problem lösen?!?
Mein Ansatz war jetzt, so lange vor dem wxSOCKET_LOST zu lesen, bis nichts mehr ankommt. Allerdings klappt das nicht bzw. nur mit wxYield-Rekursion und meist folgt dann ein wxSOCKET_IOERR.
Also würde ich jetzt gerne einen Weg finden, der mir den wxSOCKET_LOST so lange nach hinten anstellt, bis alle wxSOCKET_INPUT abgearbeitet sind. Bzw. einen Weg finden um festzustellen, ob ein wxSOCKET_INPUT in der Event-Liste liegt. Aber ab Besten auch "nur" für meinen Socket, nicht für andere evtl. offenen Sockets. (Kann sein, dass ich später mal von 2 Servern gleichzeitig lesen muss. Derzeit muss ich es noch nicht.).
Ist der Weg den ich versuche zu gehen gut? Oder sollte ich das anders lösen.
In den Forenregeln steht man soll eine klare Frage definieren:
Wie kann ich vor dem wxSOCKET_LOST noch alle im Buffer befindlichen Daten auslesen oder prüfen ob noch Daten im Buffer liegen?Danke,
Stefan