奇妙な珍しいアウトオブオーダデータは、インディ使用して受信しました

StackOverflow https://stackoverflow.com/questions/2440926

質問

私たちは、他の使用してTCP次々に送り出す二つの大きな文字列(数百文字ずつ)が妙に絡み合っ他端に登場しているIndy10との奇妙な問題を抱えています。これは非常にまれにしか起こります。

各文字列はLFで終了し、完全なXMLメッセージであり、一般にREADプロセスは、LFを見たときに戻って、全体のXMLメッセージを読み込みます。

実際にメッセージを送信するための呼び出しがIOHandlerののwritelnメソッドの呼び出しの周りのクリティカルセクションによって保護され、2つのスレッドが同時に送信するためにそれは可能ではありません。 (私たちは、クリティカルセクションが正常に動作し/実装されている特定のです)。この問題は非常にまれにしか起こりません。私たちは、文字列を送信するときの症状は、我々はもう一方の端(私たちは、障害を持っているまれに)で受信したものを、文字列Bに続いて自身で文字列Aの末尾の部分(のすなわち、文字列Aの主要部分と単一のLFが続く文字列全体のB、続いてその端部でLF)があります。我々はコンテンツを返し、すべての読み取り後に、そのプロパティを記録 - 私たちは、プロパティは、部分的リード後に事実ではない「タイムアウトした」ことを確認しました。また、我々は、明示的にLFを追加し、それを送信する前に、スペースで文字列内のすべての英数字以外の文字を置き換えるよう、文字列に埋め込まれたLFの文字が含まれていない知っています。

私たちは、送信と受信側の両方に重要なセクション内のログメカニズムを持っているので、私たちは「ワイヤ」で、この動作を見ることができます。

私たちは完全に困惑していると、この問題が発生する場合がありますいくつかの低レベルインディ問題、の例の、間違った順序で送信されているバッファがあるかもしれないかどうか(最低可能性は常にあるが)不思議。 ...非常にこれは問題になる可能性が信じるのは難しいが、我々はストローで把握しています。

誰もが任意の明るいアイデアを持っていますか?

役に立ちましたか?

解決

あなたは受信側で同時に同じソケットからの読み取り、複数のスレッドを持っていますか?だけでも、接続された()のステータスを照会するには、発生するの読み込みが発生します。それはあなたの複数のスレッドがインバウンド・データを読み、あなたが注意されていない場合、ランダムな順序でIOHandler.InputBufferにそれを格納する可能性があります。

他のヒント

あなたは Wiresharkののデータがtranferredされる方法を見つけることを試みることができます。この方法は、あなたの問題は、サーバーまたはクライアントであるかどうかを調べることができます。また、右側には、有効なデータを「保証」を取得するためにTCPを使用することを覚えています。

あなたは、TCPやUDPを使用していますか?あなたはUDPを使用している場合、それは彼らが原因ネットワーク経由でルーティングに送信されたよりも、UDPパケットは異なる順序で受信できる可能性が(と予想される)です。このような場合は、受信機がパケットを適切に注文することができるように、各UDPパケットにパケットIDのいくつかの並べ替えを追加する必要があります。

あなたはIOHandlerのネーグルの設定を確認しましたか?我々はfalseにUseNagleを設定することにより、固定同様の問題がありました。我々の場合には送信側と受信側のバーストで大量のデータを合体によるネーグルに遅かったので、それはあなたの状況と全く同じではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top