Frage

Wir haben ein bizarres Problem mit Indy10 wo zwei großen Strings (ein paar hundert Zeichen), dass wir einen nach dem anderen unter Verwendung von TCP am anderen Ende seltsam verschlungen erscheinen auszuzusenden. Dies geschieht sehr selten.

Jeder String ist eine XML-Nachricht mit einem LF beendet, und im Allgemeinen der Lesevorgang liest eine ganze XML-Nachricht, zurückkehrt, wenn es die LF sieht.

Der Aufruf tatsächlich die Nachricht senden ist durch einen kritischen Abschnitt um den Aufruf den writeln Methode des IOHandler geschützt und so ist es nicht möglich ist, für zwei Threads gleichzeitig zu senden. (Wir sind sicher, dass der kritische Abschnitt implementiert / einwandfreie Funktion). Dieses Problem tritt sehr selten auf. Die Symptome sind seltsam ... wenn wir Zeichenfolge A, gefolgt von String B senden, was wir am anderen Ende (bei den seltenen Gelegenheiten, bei denen wir Versagen) empfangen wird, der hintere Abschnitt der Zeichenfolge A selbst ( dh , gibt es einen LF am Ende des durch den vordersten Abschnitt der Zeichenfolge A und dann die B gefolgt gesamte Zeichenfolge) gefolgt von einem einzelnen LF. Wir haben festgestellt, dass die „timed out“ Eigenschaft ist nach der teilweisen Lese nicht wahr - log wir diese Eigenschaft nach jeder Lese, dass die Renditen Inhalt. Auch wissen wir, dass es keine LF-Zeichen in der Zeichenfolge eingebettet, als wir ausdrücklich alle nicht-alphanumerische Zeichen in der Zeichenfolge mit Leerzeichen ersetzen, bevor die LF anhängen und das Senden es.

Wir haben Protokollmechanismen innerhalb der kritischen Abschnitte sowohl auf der Sende- und Empfangsenden und so wir dieses Verhalten auf der „Draht“ sehen.

Wir sind völlig verwirrt und fragt sich (wenn auch immer die niedrigste Möglichkeit), ob es könnte einige Low-Level-Indy Probleme, die dieses Problem verursachen könnten, zB , Puffer in der falschen Reihenfolge gesendet werden. ... sehr schwer zu glauben, dass dies das Problem sein könnte, aber wir Strohhalme sind zu erfassen.

Hat jemand eine helle Ideen?

War es hilfreich?

Lösung

Haben Sie die gleichzeitig mehrere Threads haben auf der Empfängerseite aus dem gleichen Sockel zu lesen? Auch nur der Verbunde mit Abfrage () Status bewirkt, dass ein Auftreten lesen. Das könnte Ihr mehrere Threads verursachen die eingehenden Daten und speichern sie in die IOHandler.InputBuffer in zufälliger Reihenfolge zu lesen, wenn Sie nicht vorsichtig sind.

Andere Tipps

Sie könnten versuchen, Wireshark , um herauszufinden, wie die Daten tranferred wird. Auf diese Weise können Sie herausfinden, ob das Problem in dem Server oder auf dem Client ist. Denken Sie auch daran TCP verwenden, um bekommen „garantiert“ gültige Daten in der richtigen Reihenfolge.

Sind Sie mit TCP oder UDP? Wenn Sie UDP verwenden, ist es möglich (und erwartete), dass die UDP-Pakete in einer anderen Reihenfolge empfangen werden können, als sie über das Netzwerk aufgrund des Routing übertragen wurden. Wenn dies der Fall ist, müssen Sie irgendeine Art von Paket-ID zu jedem UDP-Paket hinzufügen, so dass der Empfänger richtig die Pakete bestellen kann.

Haben Sie die Nagle Einstellungen des IOHandler? Wir hatten ein ähnliches Problem, dass wir durch das Setzen UseNagle auf false festgelegt. In unserem Fall das Senden und Empfangen großer Datenmengen in Schüben war langsam aufgrund Nagle Koaleszierstruktur, so dass es die gleiche wie Ihre Situation nicht ganz ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top