【问题标题】:TCP buffer in play while using boost::asio::async_write?使用 boost::asio::async_write 时 TCP 缓冲区在起作用吗?
【发布时间】:2020-05-29 11:45:43
【问题描述】:

我从这个讨论中了解到boost::asio::async_write 只将数据写入内核缓冲区。这并不意味着对等方已收到数据。但是,如果我要发送大数据包,假设每个数据包 200000 字节,然后我拉动网线以突然终止连接。它是否还会继续报告每个async_write 写入内核缓冲区的 200000 字节?我的测试表明它没有。它放弃了像 200000 字节这样的大缓冲区,并且不报告所有发送的字节。但如果它是一个像 30-40 字节这样的小缓冲区,它会继续报告好吗?

问题:
提出这个问题的主要目的是: 是否有一个底层缓冲区大小在某一时刻被async_write 填满那现在它不能再写了,因为早先的计划数据还没有出去?如果是,那么这个底层缓冲区的大小是多少?可以通过boost::asio::ip::tcp::socket查询吗?

【问题讨论】:

  • 它会传输到缓冲区直到它填满,然后它会停止直到空间可用,这只有在电缆恢复并且接收器再次开始接收时才会发生。

标签: tcp buffer boost-asio


【解决方案1】:

您可以使用send_buffer_size 套接字选项查询/更改底层系统套接字缓冲区大小。

操作系统虽然可以dynamically adjust 套接字缓冲区大小和limit 其最大大小:

  tcp_wmem (since Linux 2.4)
          This is a vector of 3 integers: [min, default, max].  These
          parameters are used by TCP to regulate send buffer sizes.  TCP
          dynamically adjusts the size of the send buffer from the
          default values listed below, in the range of these values,
          depending on memory available.

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 2023-03-25
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2016-09-19
    相关资源
    最近更新 更多