是的,没有?
我怎样才能实现这样的目标:
在客户端
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
答案 0 :(得分:1)
如果你什么都不做的话,它是如何运作的。 "做工作"需要一些时间,因此客户不会再次致电read
,直到完成为止。服务器将继续发送数据一段时间,直到客户端的接收缓冲区(系统TCP实现的一部分)填满;然后服务器将受到限制,select
不再将该客户端返回为可写状态。总体效果是,对于长期连接,服务器只会以客户端可以处理的速度发送数据。
如果您需要对客户端上的接收缓冲区大小进行细粒度控制,可以使用setsockopt(SO_RCVBUF
, size )。