gpt4 book ai didi

c++ - boost asio 什么时候调用 async_read_some 回调?

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:32 26 4
gpt4 key购买 nike

为了理解 boost asio 库,我实现了一个异步回显服务器。我要求 tcp::socket 为少量数据执行 async_read_some,即 9 个字节(选择用于测试的小数字),即 socket_.async_read_some(boost::asio::buffer(buf, 9), 回调)。然后我向服务器提供少量数据,并且读取命令似乎只有在它有完整的 9 个字节要读取时才会回调,而不是像我预期的那样在写入后立即回调,比如 4 个字节。什么决定了回调何时发生以及为什么不在套接字上有某些数据可用时立即发生?

最佳答案

socket.async_read_some()操作与其同步操作具有相同的完成条件,socket.read_some()手术。在以下任一情况下,操作被视为完成:

  • 一个或多个字节的数据已成功接收
  • 发生错误,导致无法接收数据

操作完成后(成功或失败),ReadHandler将发布到 io_service 以进行延迟调用。此时,ReadHandler 可以由服务于 io_service 的任何线程调用。


当少量数据被写入套接字时,例如在问题描述中,人们通常会观察到数据不被发送的行为,直到后续数据被写入套接字,因为 Nagle's algorithm .简而言之,许多系统将尝试通过将小的出站消息连接成一条消息然后发送来缓解 IP/TCP 拥塞。要在每个套接字的基础上明确禁用此行为,请设置 boost::asio::ip::tcp::no_delay选项:

boost::asio::ip::tcp::socket socket(io_service);
// ...
boost::asio::ip::tcp::no_delay option(true);
socket.set_option(option);

如有疑问,请在发送方和接收方上使用数据包分析器(例如 Wireshark 或 tcpdump)监控有线流量。人们通常可以使用这些工具来快速确定问题是出在发送方还是接收方。在确定有问题的一方后,通常必须深入研究内核、驱动程序或硬件文档,以确定可能是问题根源的配置。

关于c++ - boost asio 什么时候调用 async_read_some 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com