全二重接続の一部を一時停止/再開することはできますか? [閉まっている]
概要
はい・いいえ?
どうすればこのようなことを実現できますか:
クライアント側で
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) を使用できます。