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:操作系统:Linux

4

1 回答 1

1

如果你什么都不做,它就已经是这样了。“做工作”需要一些时间,所以客户端read在完成之前不会再次调用。服务器将继续发送数据一段时间,直到客户端的接收缓冲区(系统 TCP 实现的一部分)填满;那么服务器将被限制并且select不会将该客户端返回为可写的。总体效果是,对于长期连接,服务器只会以客户端可以处理的速度发送数据。

如果您需要对客户端接收缓冲区的大小进行细粒度控制,可以使用setsockopt ( SO_RCVBUF, size )。

于 2012-11-04T23:17:47.820 回答