0

クライアントからデータを送信するためにTCPソケットを使用しています。データは事前​​に用意されているので、送信するデータは常に増えています。さらに、書き込みのサイズを変更することはできません。変更しないと、サーバーからエラーが発生します。私は次のことをします:

while (1) {
    poll(for POLLOUT condition);
    write(to TCP socket);
    if (no more data)
        break;
}

問題は、POLLに非常に長い時間がかかることです。これは、ソケットが実際に書き込まれている(または応答されている)時間だと思います。とにかく、投票に費やす時間を減らすことができますか?これは現在、大きなボトルネックです。

4

2 に答える 2

3

PollPOLLOUTさらにデータをエンキューするのに十分なバッファスペースがある場合にイベントを発生させます。(このリンクを見てください-男(7)ソケット

そうでない場合は、書き込みバッファがいっぱいであり、他のピアの読み取り機能よりも高速に書き込みを行っていることを意味します。または、単にネットワークが予想よりも遅いです。

于 2013-02-06T21:23:39.887 に答える
3

ソケットがビジーであると、poll()で遅延が発生します

もちろんそうです。それpoll()が目的です。ソケットが読み取り可能または書き込み可能になるまで遅延します。

あなたの作家はあなたの読者よりも速いです。読書の終わりに解決策を探してください。書き込み終了は正しく動作しています。

ただし、そのループの先頭で毎回呼び出すのは無意味です。ソケットが書き込み可能になったことを知る必要がある場合にのみ呼び出してください。ソケット送信バッファがいっぱいの場合を除いて、通常は常に書き込み可能であるため、毎回呼び出すのは時間の無駄です。

EAGAIN/EWOULDBLOCK. 次にpoll()、ソケット送信バッファにスペースがあることを通知するために、を呼び出す時間になるまで書き込みを続けます。その後、以前と同じようにもう一度書き込みを再開します。

于 2013-02-07T01:11:15.720 に答える