2011-10-21 14 views
2

私はTwistedに基づいてサーバー側のクライアント/サーバーソリューションを実装しています。クライアント側のAndroid携帯電話などがあります。 Andoirdエミュレータは1500b(またはそれ以下)より大きなTCPパケットを受け取らないので、サーバー側でパケットをチャンクできる必要があります。各 "transport.write"の後でソケットをフラッシュすることなく、Twistedは送信データをバッファリングして、何らかのマニュアルまたは自動フラッシュ/ maxpacketsize機能なしにチャンクが役に立たないようにします。 Twistedでこれをどうやってやるの? 私は "reactor.doSelect(1)"関数に精通していますが、スケーラビリティとパフォーマンス上の理由からEPollリアクタを使用しているため、doSelectは使用できません。 Twisted内の特定の接続のmaxPacketValueを変更することは可能ですか?Twisted Python:最大パケットサイズ?ソケットをフラッシュしますか?

+1

これはあまりにも奇妙です。問題はちょうど魔法のように解決されました。クライアントに届かなかった大きなテストパケットは、今再び働きます、なぜ私は考えていません...今のところ私は、 ! – Dirk

+1

決してdoSelectを呼び出すべきではありません。あなたが思うことはしません。 –

+0

問題は魔法のようにそれ自体を解決しませんでした。あなたのネットワークの条件が変わったので、今は動作します。しかし、それは元に戻って、再び壊れるでしょう。実際のコードを修正する方法を説明する私の答えを見てください。 – Glyph

答えて

1

TCPパケットが自動的にOSによってチャンクされている...誰かが私に光を示すことができることを期待して、行うことができますすべてのアプリケーションは、いつフラッシュするためにヒントを与えるです。それとは別に、アプリケーションは単にストリームを読み書きできます。

通信中の2つのピアのOSは、リンク上のMTUに基づいて最大パケットサイズを自動的に設定します(Path MTU discovery)。それが動作するようにICMPパケットをブロックしないようにしてください。

MTUが間違っている(とにかく1500以下のMTUが設定されることが多い)可能性は非常に低いので、たとえばwiresharkなどのパケットトレーサを使用して問題を再診断する必要があります。

2

TCPはストリーム指向のプロトコルであり、パケット指向のプロトコルではありません。 transport.writeに電話すると、そのデータはTCPストリームに追加され、任意の数のパケットで送信されます。それは、壊れているか、またはwriteへの次回または前回の呼び出しと一緒に接着されている可能性があります。これはかなりfrequently asked question about Twistedですが、それを聞いた人は少し尋ねます。

AMPのようなプロトコル構成キット、または基本的にLineReceiverを使用して、パケット境界のランダムな性質に依存するのではなく、プロトコル内のメッセージを区切りたいとします。

関連する問題