0

TCP ソケットを介してデータを送信するアプリケーションがあります。これには 8 つの TCP 接続を使用します。ソケットの送受信は、バックグラウンド スレッドで呼び出されます。ソケットの配列を繰り返し処理して、すべてのソケットを介してデータを送信する (順次) スレッドは 1 つだけです。

送信者スレッドのコードは次のようなものです。

for(i = 0; i < 8; i++) {

    nBytesWrriten = send (tcpsock[i], data2, nleft, 0))
    //error handling and process more data

}

受信スレッドは次のようになります。

for(i = 0; i < 8; i++) {

    sz[i] = recv (tcpsock[i], data, MAX_UDT_SIZE, 0);
    //process data
}

すべてが正常に機能し、データが転送されますが、時間がかかりすぎることがあります。ログを確認したところ、ほとんどの場合、送信者スレッドは正常に動作することがわかりましたが、「send」呼び出しの前後でタイムスタンプに大きな遅延 (場合によっては 1 秒以上) が発生することがあります。

送受信アクションはすべてワーカー スレッドで行われます。送信呼び出しの直前/送信時のスレッドのプリエンプションと関係がありますか? 送信呼び出しの直前にスレッドのプリエンプションを回避できますか? それとも、受信スレッドがソケットでデータを受信して​​いないのに、より多くのデータを準備して送信しているため、遅延が発生しているのでしょうか?

データの送信に時間がかかりすぎるため、これを最適化するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

送信にはノンブロッキング ソケットを使用する必要があります。発生している可能性があるのは、1 つ (または複数) がすぐに送信できないため、データを送信できるようになるまで待機することです。おそらく、バッファーがいっぱいになるか何かです。

ノンブロッキング ソケットを使用しても停止しませんが、データが一部のソケットに送信されていないことを確認し、後で再試行する必要があります。

于 2012-11-12T13:07:22.773 に答える
0

送信の前に各ソケットでaselectを実行して、ブロックせずに書き込みできるかどうかを確認します。そうでない場合は、他のソケットでの送信をブロックします。読み取り側でも同じことを行う必要があります。そうしないと、読み取り可能性の欠如により、他の読み取りがブロックされる可能性があります。

于 2012-11-12T13:31:54.903 に答える