Probleme mit Shared Library / Sockets



  • Hi,

    ich habe hier ein haariges Problem in einem recht komplexen Softwaresystem, für das ich mal ein paar Denkanstöße benötigen würde (Code kann ich leider keinen liefern, der wäre viel zu groß).

    Es gibt drei Applikationen, zwei Clients C und D sowie einen Server S, welche per Socket miteinander kommunizieren. Alle Applikationen nutzen eine gemeinsame Bibliothek, welche das Protokollgedöns beinhaltet (die Bibliothek wird nicht per LoadLibrary() oder ähnlichem geladen sondern beim Start dynamisch gelinkt).

    Der Ablauf ist jetzt folgender:

    C und D verbinden sich mit S

    C sendet ein Datenpaket an S

    S leitet dieses Datenpaket weiter an D

    D bearbeitet es und sendet es an S

    S leitet es weiter an C.

    Und im letzten Schritt passiert es: das Datenpaket ist in S noch OK und es ist innerhalb der Bibliotheksfunktion, welche S aufruft ebenfalls noch OK. Innerhalb der Empfangsfunktion von C (welche sich in einem Thread innerhalb der Bibliothek befindet) kommt dann aber Müll an, d.h. die Daten sind für mich nach einem nicht nachvollziehbaren Muster verstümmelt. Es kommt alles an, aber der Inhalt passt nicht mehr.

    Was könnte da schief gegangen sein? Wilde Spekulationen sind ausdrücklich erlaubt!

    🙂



  • Zunächst würde ich erstmal folgendes Probieren:

    1. Dummypaket von S nach C schicken. Also ein Paket, welches direkt in S generiert wird und bekannten Inhalt enthält. Das sollte dann schonmal richtig übertragen werden (wenn nicht, haste schon einen Fehler, ohne D zu nutzen).

    2. Dummypaket von C nach S schicken, und S schickt dieses Paket sofort zurück. Beim Empfang in S könnte ja auch ein Fehler sein, der sich erst später bemerkbar macht.



  • Maxi schrieb:

    1. Dummypaket von S nach C schicken. Also ein Paket, welches direkt in S generiert wird und bekannten Inhalt enthält. Das sollte dann schonmal richtig übertragen werden (wenn nicht, haste schon einen Fehler, ohne D zu nutzen).

    Das klappt ein paar hundert mal bevor der Fehler auftritt.

    Ganz lustig: Beim weg von S nach D wird exakt die gleiche Bibliotheksfunktion verwendet ohne das irgend was schief geht.



  • Jetz habe ich doch noch was gesehen:

    Ich sende die Daten immer in zwei Blöcken: einem Head und einem Body, der Head beschreibt dabei, was der Body enthält, wie lang er ist etc.

    Wenn das Problem auftritt, hat sich der Body verdoppelt, d.h. vor dem eigentlichen Head empfange ich jetzt noch mal einen Body - allerdings kann ich nicht sehen, dass mal ein Body doppelt geschicht wurde oder einer nicht empfangen wurde.

    Die Sockets sind alle nicht-blockierend um einen Timeout beim Empfang zu ermöglichen. Kann ich mir auf dem Weg irgend was komisches eingehandelt haben?



  • Überfordere dieses Schmalspurforum doch nicht mit solchen Fragen!

    Die DLL/Shared Lib sollte kein Problem darstellen, da die für jede Applikation ihren eigenen, geschützten Adressbereich hat.

    Möglich wäre irgend ein doofes Laufzeitproblem, z.B. zwei Threads, die auf dem gleichen Socket senden/empfangen ohne dass man das in den Logfiles sofort sieht. So kann dir z.B. mal ein Head in einem Thread verloren gehen oder einer sendet zur Unzeit einen scheinbar zusätzlichen Body...


Anmelden zum Antworten