1

selectTCPソケットを介してクライアントからデータを取得するために使用するTCPサーバーがあります。サーバーはデータの消費が遅く、クライアントははるかに高速です。クライアントは 8 バイトのデータを送信し、そのたびに -新しい接続を開く -データを書き込む -切断する このため (サーバー ソケットは多くの接続を受け入れる必要があります)、バックロック値listenを 500 に増やしました。

pthreadこの設定にもかかわらず、ある時点で、呼び出された関数でクライアントがブロックされ__connect_nocancel、これが何度も発生することがわかります。-しばらくすると、サーバーが注文からデータを受信し始めます。めちゃくちゃになった最初のデータは、クライアントがブロックするデータです (その後に other が続きます)。

バックログを増やすとこれが解決する可能性があると思いましたが、この問題はそうではありません。

手伝って頂けますか?私はLinux 2.6.32にいます

乾杯

AFG

4

2 に答える 2

1

のバックログ パラメータlisten(2)は、通常、OS ネットワーク スタック内の値に制限されています。Linux では、デフォルトは 128 です。

しかし、本当の問題は、@EJP が言っているように、TCP を完全に誤用していることです。

于 2012-09-08T02:52:24.063 に答える
0

順序付けが重要な場合、クライアントは単一の接続を開いたままにして、その単一の接続を介してすべてを書き込む必要があります。これには2つの方法はありません。TCPは、ストリームでのバイト順序を保証します。個別の接続のサーバー側処理の順序を保証するものはありません。

また、かなり効率的です。現在、8バイトごとに約8パケットを交換しています。これは、最大160バイトのオーバーヘッドを意味します。

于 2012-09-08T01:06:00.520 に答える