1

ソケット ライブラリ (SOCK_STREAM) を使用して、Python で小さなサーバーを開発しています。サーバーは、大量の小さなメッセージ (25 ~ 40 バイト) を受信し、それらを処理して、できるだけ高速に転送する必要があります。

Linux と OSX では完全に動作し、socket の recv 関数はデータが到着するとすぐにデータを返します。残念ながら Windows (8 Pro) では、recv 関数から返す前にデータを蓄積するようです。

recv 関数を使用して読み取るデータの最大量を制限しようとしましたが、あまり役に立ちませんでした。内部にデータが蓄積されているようです。

サーバー (Python) またはクライアント (Java のソケット) で設定する必要のある特定のソケット オプションはありますか?

編集

私の同僚の 1 人が、各メッセージをダミー データで埋めて 1KB に切り上げるよう提案しました。これは、@PeterLawrey が指す内部バッファーを回避するのに役立つ場合があります。

試す機会がありませんでした。それが有効で広く採用されているテクニックだと思いますか?

4

1 に答える 1

-1

Java プログラムでソケット用に保持されるカーネル メモリの量を操作する方法は、SO_RCVBUF を設定することです (setsockoptこれを行うために使用する C/C++ プログラムで)。

ここでは大量のコードを再現するのではなく、参照するためのヒントをいくつか示します。

SocketOptions の
ドキュメント SO_RCVBUFのドキュメント

これらを使用して、カーネルが何かを返す前にバッファする量を削減できます。

とはいえ、アプリケーションに SOCK_STREAM がある場合、利用可能なデータがすぐに返されない理由はわかりません。他の何かが問題である可能性が高いと思います。

于 2013-08-22T16:42:49.277 に答える