我在使用 boost asio 进行套接字编程时遇到问题。
我的程序流程如下:
客户端使用 async_write 向服务器发送数据,然后它将使用 async_read 从服务器接收数据。所有异步操作的处理程序都是 use_future,超时 = 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();
我尝试了 2 个解决方案:
- 为 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);