0

チャット プログラムを作成していますが、サーバーに対してデータを送信するときに、send() 関数がデータを送信するのに時間がかかることがありますか?

ここに私の問題があります: 私は Linux 2.6 を epoll で使用しています。サーバーはシングルスレッドです send() がブロックされると、サーバー上の他のすべてのアクティビティが停止します。たとえば、tcp パケットに対して ACK 応答を長時間送信しない非常に遅いクライアントがある場合、送信機能はすぐに移動するか、クライアントを長時間待機します。私が望んでいないのは、単一または少数の遅いクライアントがチャット サーバーで遅延を引き起こすことです。

私が欲しいのは、 send() を非ブロックにして、非常に迅速に返すことです。すべてのデータが送信されない場合は、送信された量が返されるだけで、それをバッファから削除し、すべてのデータが送信されるまで次回のサービスで送信を続けます。基本的に、低速または応答のないクライアントで長時間送信をブロックしたくありません。

4

1 に答える 1

3

ソケットを非ブロック モードに設定すると、送信はブロックされません。問題は、部分的な書き込みが発生したという事実を管理し、書き込みファイル記述子が再びアクティブになったときに残りのデータを送信する必要があることです。

一般に、send と recv の両方をノンブロッキング モードで実行すると、プログラムが複雑になりますが、うまく機能することがわかりました。

次のようなものを使用します。

    if (-1 == (flags = fcntl(fd, F_GETFL, 0)))
        flags = 0;
    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
于 2009-12-12T01:42:09.697 に答える