BOOST ASYNC_READ延迟(本地套接字)
boost asio async_read delay (local socket)
我在插座编程中有问题。
我的程序的流量如下:
客户端使用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种解决方案:
- 将更大的空间分配给boost :: asio :: streambuf。我分配了4096个字节,我的数据大小不超过1500个字节,但它不起作用。
- 使用
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邮件列表。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- BOOST ASYNC_READ延迟(本地套接字)
- Boost Asio延迟写入tcp套接字
- C(++)套接字fd_*正在阻塞/延迟写入/发送
- 以最低的延迟从linux中的多播套接字接收数据