CAsyncSocket - Pakete kommen nicht an



  • Hi,

    ich verschicke Daten übers Netzwerk vom Server zum Client und umgekehrt.

    Das klappt bis zu einem unbestimmten Zeitpunkt super. Aber aus irgendeinem Grund tritt dann ein Fehler auf. Wenn ich dann Daten verschicke, sendet der Server zwar n den Socket (CAsyncSocket() gibt TRUE zurück - also kein Fehler) aber beim Client kommt dann nichts mehr an.

    ich weis nicht wo ich da suchen sollte, bin mir auch nicht ganz sicher obs am programm liegt. ich habe zum testen WireShark mal gesnifft was überhaupt ankommt beim Client ... Die Daten kommen an, aber die Checksum ist nicht korrekt. Kann sich da jemand was erklären?

    Mfg,
    Marco



  • Evtl. die Packetlänge zu lang?
    Bei UDP gibt es eine Grenze...



  • Es gibt im Buch Visual c++ in 21 Tagen ein Bsp. das funktioniert.
    Schau dir das an und vergleiche mit deinem Programm denn ohne zu wissen wie du das machst kann man hier nichts sagen.



  • Das Ganze ist vom Beispiel von 21 Tagen abgeleitet. Nur halt noch erweiter ..

    An der Länge kann es aber auch nicht liegen. Das ist fast nichts was da gesendet wird. Und es funktioniert ja auch ne Weile lang. Nur irgendwann leider nicht mehr -.-



  • Ich hatte mal nen billiges Schiffe versenken gebastelt (erste Anwendung mit CAsyncSocket). Auf jeden Fall ging das ohne Probleme und war ganz genau so gemacht wie im Beispiel von C++ in 21 Tagen.

    Ich hab mir nochmal mit Wireshark angeschaut was in dem Programm gesendet und empfangen wird: Auch da kommen Pakete mit falscher Checksum an. Ich weis bald wirklich nicht mehr wonach ich suchen soll ^^ !?!?

    Mir wurde dieser Fehlertext angezeigt:

    Checksum: 0x8180 [incorrect, should be 0xf07c (maybe caused by "TCP checksum offload"?)]
    


  • Hab das Problem jetzt lösen können.

    Innerhalb von OnReceive() habe ich eine while-schleife. Die wird solange 'dCount' größer 0 ist nicht beendet:

    DWORD dCount;
    'CAsyncSocket::IOCtl(FIONREAD, &dCount)'
    

    Pro Durchlauf lese ich dann den Socket mit Receive() aus.

    Ich habe im Internet jetzt schon so oft gelesen dass Receive() innerhalb von OnReceive() so oft aufgerufen werden darf wie man möchte. Wenn keine Daten auf dem Socket vorhanden sind liefert Receive() halt 0 zurück.

    Klingt zwar logisch, aber so bekomme ich es nicht hin. Jetzt rufe Receive() jetzt nur auf, solange der Puffer nicht leer ist (Der ist defaultmässig auf 8192 Bytes eingestellt - reicht also in den meisten Fällen).

    Gruß,
    Marco


Log in to reply