【问题标题】:is it possible to pause/resume part of a full-duplex connection? [closed]是否可以暂停/恢复部分全双工连接? [关闭]
【发布时间】:2012-11-04 22:45:54
【问题描述】:

是的,不是吗?

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

在客户端

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

【问题讨论】:

  • 请解释您认为pause_rd 和resume_rd 应该做什么。对我来说,它们看起来像是无操作。
  • @Celada 对不起,pause_rd 与 C 语言中的 shutdown(sock, SHUT_RD); 相似,而 resume_rd 则完全相反。
  • 如果您停止阅读,数据流将停止,并在您停止阅读时恢复。当所有中间缓冲区填满时,发送方将阻塞。但你不应该做这种事情。我无法理解“通过不让服务器在未定义的时间间隔内写入套接字来保护数据的完整性”。这听起来对我来说不是问题,或者是解决实际问题的完全错误的方法。

标签: c ruby sockets select


【解决方案1】:

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

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

【讨论】:

  • 您的权利。但是有一点细节,我不知道传入数据的长度,所以套接字在我不阅读时充满了数据(这是一个问题)。我想在不阅读时停止数据流。我也不想创建另一个连接。也许setsockopt() 是关键。
  • 我会更新问题,但setsockopt(SO_RCBUF, size); 方法需要一个size 参数,我无法提供它,因为我不知道它。
  • @Kira 再次,这就是它应该做的。您说“这是个问题”,但它导致的问题是什么?
  • @Kira 不,您需要减少解析代码的损坏。
  • @Kira,你不需要填充任何东西或使用setsockopt(SO_RCVBUF)。无论如何,它可能会也可能不会做你想做的事,因为可能涉及更多的缓冲区,而不仅仅是 TCP over-the-wire 窗口。您只需要准备好读取服务器发送给您的所有数据,这些数据在客户端不读取的时间间隔内堆积起来。
猜你喜欢
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多