11

socket()+ POLLIN poll() + recv()+を使用して小さな TCP サーバーを作成しましたが、いつPOLLOUTポーリングを使用するか、書き込み可能なイベントでポーリングするように選択するsend()かがわかりません。writefds

POLLOUTの実際の使用例を教えてもらえますか?

4

3 に答える 3

22

poll()通常のパターンは、次のようにノンブロッキング ファイル記述子を使用することです。

  • の準備をするときpoll()
    • ソケットの反対側から送信されたものを常に読み取ることに関心があるため、常に設定POLLINしてください。
      • ただし、大量の受信データのバックログがあり、さらに送信する前に相手側を意図的に待機させたい場合は除きます。
    • POLLOUT相手側に送信する未処理のデータがある場合にのみ設定します。
  • から戻ったときにpoll()、データが読み取り可能であることが示されている場合は、
    • それを読んで何かをする
  • から戻ったときにpoll()、ソケットが書き込み可能であることを示している場合は、
    • 未処理のデータを送信してみてください。
      • なんとか全部書き込めたら、POLLOUT次はループで設定しません
      • 一部しか送信できなかった場合 (またはまったく送信できなかった場合) は、残りを後で保管しておいてください。POLLOUT次回はループで設定します。
  • 送信する新しいデータがある場合 (読み取ったデータへの応答または外部イベントへの応答のいずれか)、次の 2 つの選択肢があります。
    • 熱心にそれのいくつかをすぐに送信してみてください。何も送信しない場合もあれば、一部を送信する場合も、すべてを送信する場合もあります。前のケースと同様に、次回のために書き込まれなかったデータの部分を保持し、データがPOLLOUT残っている場合にのみループを介して次回に設定する予定です。
    • データを保持しPOLLOUT、ループを介して次回の設定を計画してください。(この選択は、多くの場合、ループ内の 1 か所でデータの書き込みを処理するだけでよいため、プログラミングが簡単ですが、その一方で、次回のループまでデータの書き込みを遅らせます。)
于 2012-08-29T03:51:31.913 に答える
0

nginx ソースから、次のことがわかりました。

送信するデータがある場合、nginx はシステムコール (おそらく writev) で送信しようとします。ただし、nginx が一度に合計データを送信できない場合、pollfd で POLLOUT を設定し、poll イベントを使用している場合は、書き込み可能なイベントを待機します。書き込み可能なイベントを取得すると、nginx は左のデータを送信します。

nginx が大きな静的ファイルに応答しようとすると、このケースを簡単に再現できます。

于 2014-02-21T03:56:44.527 に答える