0

はい・いいえ?

どうすればこのようなことを達成できますか?

クライアント側

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のいずれかで提供できます。前もって感謝します。

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

EDIT2:OS:Linux

4

1 に答える 1

1

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

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

于 2012-11-04T23:17:47.820 に答える