POSIX ソケットをフラッシュする方法はありますか?

TCP_NODELAY を設定してリセットするのはどうでしょうか?おそらく、重要なデータを送信する直前、またはメッセージの送信が完了したときに行うことができます.

send(sock, "notimportant", ...);
send(sock, "notimportant", ...);
send(sock, "notimportant", ...);
int flag = 1; 
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
send(sock, "important data or end of the current message", ...);
flag = 0; 
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));

Linux のマニュアル ページにあるように

したがって、おそらくメッセージの後に設定する方がよいでしょうが、他のシステムでどのように機能するかはわかりません


Unix ドメイン ソケットの場合は、fflush() を使用できます。 、しかし、おそらくネットワークソケットを意味していると思います。それらをフラッシュするという概念は実際にはありません。最も近いものは次のとおりです:

<オール> <リ>

セッションの最後に shutdown(sock, SHUT_WR) を呼び出します ソケットへの書き込みを終了します。

<リ>

TCP ソケットで、sockopt TCP_NODELAY を使用して Nagle アルゴリズムを無効にする 、これは一般的に、最初の調査でそれを処理しているように見えても、あなたが望むことを確実に実行しない恐ろしい考えです.

ユーザー プロトコル レベルで「フラッシュ」を必要とする問題を処理することが正しいことになる可能性が非常に高いです。


RFC 1122 では、探しているものの名​​前は「PUSH」です。ただし、「PUSH」を実装する関連する TCP API 実装はないようです。ああ、運が悪かった。

いくつかの回答とコメントは、Nagle アルゴリズムを扱っています。それらのほとんどは、Nagle アルゴリズムがそれぞれおよび すべて を遅延させると想定しているようです。 send.この仮定は正しくありません。 Nagle は、前のパケットの少なくとも 1 つがまだ確認されていない場合にのみ送信を遅らせます (http://www.unixguide.net/network/socketfaq/2.11.shtml).

別の言い方をすれば、TCP は 最初 を送信します。 パケット (パケットの行の) すぐに .接続が遅く、コンピューターがタイムリーに確認を取得しない場合にのみ、Nagle は後続のデータの送信を遅らせます。 いずれか(最初に発生した方)まで

  • タイムアウトに達した、または
  • 未確認の最後のパケットが確認される、または
  • 送信バッファがいっぱいか
  • ネーグルを無効にするか
  • 接続の送信方向をシャットダウンしました

適切な軽減策は、後続のデータのビジネスを回避することです 可能な限り。これは次のことを意味します:アプリケーションが send() を呼び出す場合 単一の複合リクエストを複数回送信する場合は、アプリケーションを書き直してみてください。ユーザー空間で複合リクエストを組み立て、send() を呼び出します .一度。これにより、コンテキストの切り替えも節約できます (ほとんどのユーザー空間操作よりもはるかにコストがかかります)。

さらに、送信バッファにネットワーク パケットの最大サイズを満たすのに十分なデータが含まれている場合、Nagle も遅延しません。これは、送信した最後のパケットが送信バッファを埋めるのに十分な大きさである場合、TCP は何があってもできるだけ早くデータを送信することを意味します。

要約すると、Nagle はパケット フラグメンテーションを削減するための強引なアプローチではありません。それどころか、私には、優れた応答時間と、ユーザー データとヘッダー データの適切な比率の両方を維持することは、有用で動的かつ効果的なアプローチのように思えます。そうは言っても、効率的に処理する方法を知っておく必要があります。