【发布时间】:2017-07-20 20:23:48
【问题描述】:
我在使用 boost asio 进行套接字编程时遇到问题。
我的程序流程如下:
客户端使用 async_write 向服务器发送数据,然后它会使用 async_read 从服务器接收数据。所有异步操作的handler都是use_future,timeout = 2秒。
问题是:
服务器的处理时间约为 10 毫秒。服务器和客户端都在同一台计算机上,因此客户端应该在服务器发送数据时接收数据。但是,我测量了 async_read 的延迟,发现其中一些约为 10 毫秒,而另一些约为 30 ~ 40 毫秒。通常,它们是交错的。
我如何衡量:
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();
我尝试了两种解决方案:
- 为 boost::asio::streambuf 分配更大的空间。我分配了 4096 字节,我的数据大小从未超过 1500 字节,但它不起作用。
- 使用
socket_.set_option(ip::tcp::no_delay(true));关闭Nagle 的算法和延迟确认。此外,它无法正常工作。
我不知道这个问题。任何人都可以帮助我吗?请...
更新:这是我的部分源代码
下面是向服务器发送请求的代码:
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);
【问题讨论】:
-
如果您提供更多代码会有所帮助
-
...甚至是一个完整的(简短的!)示例
-
感谢您的回复。我将尝试发布源代码。
-
每一个询问为什么某些东西不起作用的好问题都包含一个 MCVE。 MCVE 应该是一个 cpp 文件,其中包含
main()函数,这会显示问题。我们可以简单地剪切并粘贴到 ide 中进行检查。
标签: c++ sockets boost latency asio