Techioz Blog

全二重接続の一部を一時停止/再開することはできますか? [閉まっている]

概要

はい・いいえ?

どうすればこのようなことを実現できますか:

クライアント側で

loop do
    socket.read(MAX_LEN)
    socket.pause_read   # the client is busy, do not send any more data, similar to: C system call shutdown(sock, SHUT_RD)
    # ... working

    socket.resume_read  # the client is ready to work again. 
end

サーバー側で

loop do
    rd, wr, _ = select(rdsockets, wrsockets)
    # wr is an array fill of clients ready to work
    wr.each {}
end

PS: ヘルプは C または Ruby で提供できます。 よろしくお願いします。

編集: 受信データには事前定義された形式があり、受信データの長さは異なります。

編集2: OS: Linux

解決策

何もしなくてもすでにそうなっているのです。 「作業を行う」には時間がかかるため、クライアントはそれが完了するまで read を再度呼び出しません。サーバーは、クライアントの受信バッファ (システム TCP 実装の一部) がいっぱいになるまで、しばらくデータを送信し続けます。その場合、サーバーはスロットルされ、select はそのクライアントを書き込み可能として返さなくなります。全体的な影響として、接続の存続期間が長い場合、サーバーはクライアントが処理できる速度でのみデータを送信します。

クライアント上の受信バッファのサイズをきめ細かく制御する必要がある場合は、setsockopt(SO_RCVBUF, size) を使用できます。