能暂停接受客户端的发送的数据吗?

41 views
Skip to first unread message

Zheng Ping

unread,
Aug 9, 2020, 1:13:01 PM8/9/20
to skynet...@googlegroups.com
各位大拿:
      我是第一次用C写skynet服务,我目前正在服务中处理socket类型的message。我有个问题想不通,比如客户端要往skynet发送500M的数据, 在我的skynet服务中我每读1M的socket buffer后就希望skynet的socket server能停止接收对应客户端发送的数据0.1秒钟, 0.1秒后继续接受客户端的发送的数据,思考良久一直没找到解决方案,请指教!

--
with kind regards

云风 Cloud Wu

unread,
Aug 9, 2020, 11:07:45 PM8/9/20
to skynet...@googlegroups.com
Zheng Ping <kyt...@gmail.com> 于2020年8月10日周一 上午1:13写道:
>
> 各位大拿:
> 我是第一次用C写skynet服务,我目前正在服务中处理socket类型的message。我有个问题想不通,比如客户端要往skynet发送500M的数据, 在我的skynet服务中我每读1M的socket buffer后就希望skynet的socket server能停止接收对应客户端发送的数据0.1秒钟, 0.1秒后继续接受客户端的发送的数据,思考良久一直没找到解决方案,请指教!

skynet 在设计之初,并没有考虑客户端大量上行数据的场合,所以采用的是简单粗暴的方式,有数据就读。通常可以通过在应用层设计协议,和客户端友好协商来解决。
另外,如果使用 lua api ,可以设置 socket.bufferlimit
来防止客户端无限上行数据而逻辑没有处理,导致内存暴增。目前的手段是超过 bufferlimit 就自动断开。

考虑到 skynet 应用场合的扩大,我觉得提供机制做限制也有必要。所以今天给 skynet 增加了 C api
skynet_socket_pause 可以用来暂停数据接收;借用过去的 skynet_socket_start 可以延续。
同时,lua api 也增加对应的 socket.core.pause 。

https://github.com/cloudwu/skynet/commit/a4dc6b909478a7397eb205f3ca5a2800e9391d65

实现原理是:通知 socket 线程,把对应 fd 从 epoll 中删除,直到下次调用 start 再重新加入。

不过这些暂时仅 C 库使用,尚未给已有 lua 库/服务增加对应机制。(没有修改 socket 库或 gate 服务)

我认为未来可以完善 gate 服务,用上这个特性。

--
http://blog.codingnow.com
Reply all
Reply to author
Forward
0 new messages