BOOST ASYNC_READ延迟(本地套接字)

boost asio async_read delay (local socket)

本文关键字:套接字 延迟 ASYNC READ BOOST      更新时间:2023-10-16

我在插座编程中有问题。

我的程序的流量如下:

客户端使用async_write将数据发送到服务器,然后它将使用async_read从服务器接收数据。ASYNC操作的所有处理程序都是use_future,超时= 2秒。

问题是:

服务器的处理时间约为10 ms。服务器和客户端都在同一台计算机中,因此客户端应在服务器发送它们时接收数据。但是,我测量了Async_read的延迟,发现其中一些大约是10毫秒,而另一些则约为30〜40 ms。通常,它们交错。

我如何测量:

auto start_time = std::chrono::steady_clock::now();
auto read_result = async_read(..., use_future);
auto read_future_status = read_result.wait_for(timeout);
auto end_time = std::chrono::steady_clock::now();

我尝试了2种解决方案:

  1. 将更大的空间分配给boost :: asio :: streambuf。我分配了4096个字节,我的数据大小不超过1500个字节,但它不起作用。
  2. 使用socket_.set_option(ip::tcp::no_delay(true));关闭Nagle的算法并延迟ACK。另外,它无法正常工作。

我不知道这个问题。谁能帮我吗?请...

更新:这是我的源代码的一部分

以下是发送请求的代码:

auto send_result = async_write(input_socket, out_buffer, use_future);
auto send_status = send_result.wait_for(std::chrono::seconds(timeout));
if(send_status == std::future_status::timeout)
{
    LOG4CPLUS_ERROR_FMT(logger_, "send %s future error : (%d).", action, send_status);
}
out_buffer.consume(request.length());

以下是从服务器接收数据的代码。

auto read_buffer_result = async_read(output_socket, in_buffer, transfer_exactly(sizeof(Header)), use_future);
auto read_status = read_buffer_result.wait_for(std::chrono::seconds(timeout));
if(read_status == std::future_status::timeout)
{
    LOG4CPLUS_ERROR_FMT(logger_, "read %s header future error : (%d).", action, read_status);
}
size_t byte_transferred = read_buffer_result.get();
in_buffer.consume(byte_transferred);

感谢您的帮助。我找到了答案---我使用调试版本运行...但是仍然有些奇怪。

首先,我以调试模式开发。完成开发后,我切换到发布模式并使用"构建解决方案"来构建我的DLL。我认为DLL现在是发行版本,所以我开始评估性能。但是今天早上,我无意使用"干净解决方案",然后就"构建解决方案"。建筑物后,我再次评估了性能,发现现在几乎所有延迟都是10毫秒。我猜今天早上之前的评估是由DLL和调试版本进行的。

我仍然不知道"从调试到发布和构建解决方案"answers"从调试到释放和清洁解决方案然后构建解决方案的切换之间的区别。"

我会尝试找出差异。

真的很感谢您的帮助。

我的第一个猜测是,您是导致ASIO阻止全部I/O完成。这引入了延迟。

对于延迟敏感代码,您应该始终使用async_read_some()async_write_some()。这些将尽快返回任何部分I/O,以便您完成操作系统可以做的尽快完成。当然,您需要重构代码以处理部分I/O,基本上可以处理每个处理程序调用尽可能多的处理,并围绕任何未排水的部分发送或接收到的缓冲序列下次进行重试,直到花费为止。<<。/p>

我的第二个猜测是您可能正在使用链。这些引入延迟。请参阅ASIO-USERS邮件列表。