【问题标题】:Buffer management for socket application best practice套接字应用程序最佳实践的缓冲区管理
【发布时间】:2010-06-13 00:07:14
【问题描述】:

拥有一个 Windows IOCP 应用............

我了解,对于异步 i/o 操作(在网络上),缓冲区必须在发送/读取操作期间保持有效。

因此,对于每个连接,我都有一个用于读取的缓冲区。
对于发送,我使用将要发送的数据复制到的缓冲区。发送操作完成后,我会释放缓冲区以便重复使用。

到目前为止还不错,不是什么大问题。

尚不清楚的是你们是如何做到这一点的?

另一件事是,即使以这种方式处理,我的意思是多缓冲区,接收方也可能会被数据淹没(根据经验)。
即使将 SO_RCVBUF 设置为 25MB 也对我的测试没有帮助。
所以我该怎么做?有待发送队列吗?

【问题讨论】:

  • SO_RCVBUF 以什么方式没有帮助?使用 UDP,这是一个令人头疼的问题,但使用 TCP - 有什么问题?发送队列也与被淹没的接收方正交。
  • “正交”?我的英语有限,呵呵.. 好吧,我认为“SO_RCVBUF”将允许接收比我的应用程序接收更多的数据,即如果我安排读取 100 字节到缓冲区,但发件人向我发送了 1MB,然后套接字的缓冲区(我用'SO_RCVBUF'设置大小)将被填满。
  • 正交 = 垂直 :)
  • TCP 提供 流控制 - (en.wikipedia.org/wiki/…) 如果接收方无法以足够快的速度读取数据以耗尽接收缓冲区,则会减慢快速发送方的速度。

标签: windows networking network-programming buffer


【解决方案1】:

我引用计数每个连接(套接字)和每个操作(缓冲区)结构。这非常有效,并且完美地处理了生命周期问题。每次发布重叠操作时,每个连接的引用计数都会增加,并从池中分配一个新缓冲区。操作完成后,我处理结果并释放套接字和缓冲区上的引用。如果这是最后一个引用,则结构会被清理(缓冲区返回池等)。

您可以在我的免费 IOCP 客户端/服务器框架中看到所有这些操作,该框架可从 here 下载。

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多