是否可以暂停/恢复部分全双工连接?

时间:2012-11-04 22:45:55

标签: c ruby sockets select

是的,没有?

我怎样才能实现这样的目标:

在客户端

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

1 个答案:

答案 0 :(得分:1)

如果你什么都不做的话,它是如何运作的。 "做工作"需要一些时间,因此客户不会再次致电read,直到完成为止。服务器将继续发送数据一段时间,直到客户端的接收缓冲区(系统TCP实现的一部分)填满;然后服务器将受到限制,select不再将该客户端返回为可写状态。总体效果是,对于长期连接,服务器只会以客户端可以处理的速度发送数据。

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