- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 boost::asio
进行客户端和服务器应用程序之间的 TCP
通信,这两者都是我编写的。我最初是通过使用 boost::asio::read
的同步数据读取来编写此代码的。 sync_read
工作正常,只是我无法在读取操作期间执行 socket.cancel
。这已经成为一个很大的限制,因此我现在正在尝试将我的同步读取转换为执行async_read
机制。
以下是我的同步读取机制,非常好。我读了 2 遍。首先获取数据包头然后获取数据包数据,效果很好 ->
size_t Read_Data_Sync(std::vector<unsigned char> & msg_body) {
//fetch the header
MyMessageHeader msg_header;
boost::system::error_code err_code;
size_t bytes_received = boost::asio::read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), err_code);
if (bytes_received <= 0 || err_code)
return 0;
err_code.clear();
msg_body.resize(msg_header.size);
//fetch the body
bytes_received = boost::asio::read(socket, boost::asio::buffer(msg_body), err_code);
if (bytes_received <= 0 || error_code)
return 0;
return bytes_received;
}
以上函数用于从客户端的线程
连续调用,我将其称为读取器线程like so
->
auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Sync();
}
}};
以下是我如何更改它以使读取机制 async
->
读取器线程保持不变,除了它现在调用另一个读取函数,我已经编码该函数以异步
方式读取数据
auto data_reader_thread = std::thread {[this] {
while(run_thread) {
Read_Data_Async();
}
}};
我已将 msg_body
和 msg_header
作为我类中的成员变量。更新的逻辑是 Read_Data_Async
被线程函数连续调用。 Read_Data_Async
调用 boost::asio::async_read
绑定(bind)Handle_Read_Header
的地址作为回调,它又再次执行 boost::asio::async_read
以读取消息正文,传递处理程序回调以接收 message_body
void Read_Data_Async()
{
//firstly read message header
MyMessageHeader msg_header;
boost::asio::async_read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), boost::bind(&TCPSession::Handle_Read_Header, this,
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void Handle_Read_Header(const boost::system::error_code & error, std::size_t bytes_transferred)
{
//now read the message body
if (!error && bytes_transferred > 0) {
boost::asio::async_read(socket, boost::asio::buffer(msg_body), boost::bind(&TCPSession::Handle_Read_Body, this,
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
else {
cout << "Error: " << error << "\n";
}
}
void Handle_Read_Body(const boost::system::error_code & error, std::size_t bytes_transferred)
{
if (!error && bytes_transferred > 0) {
// msg_body has the data read from socket
}
else if (error != boost::asio::error::eof) {
cout << "Error: " << error << "\n";
}
}
我现在面临的问题是回调 Handle_Read_Header
永远不会被回调!!我在做什么有什么问题吗?我浏览了很多相关的帖子,比如 this one试图解决我的问题,但该链接再次建议调用 io.run
因为它是关于 boost::asio::async_read_until
而不是 boost::asio::async_read
。
对于 boost::asio::async_read
我的上述逻辑是否正确?我应该得到什么 asio
来回调我的处理函数?
最佳答案
你必须在某处运行 io_service::run()
¹
实际上,执行异步 IO 的整个想法是您不需要需要单独的线程来读取/写入:在单个线程上完全双工是完全可能的。
¹ 或使用 run_one、poll 或 poll_one 的更复杂的循环
关于c++ - boost::asio::async_read 不回调我的处理函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533313/
我一直在努力理解 boost 的 http server 3 example 中的逻辑.此示例中的请求在 connection.cpp 中的 start() 方法中读取,该方法调用: socket_.
我搜索了其他帖子,但没有找到任何相关内容。现在,我有一个由 header 和正文组成的协议(protocol)。协议(protocol)是这样的:Z24,91009802,123456789ABCDE
我正在尝试创建一个 TCP 服务器,其中 Start() 方法会阻塞,直到连接被接受,然后开始一系列异步读取。我有以下代码,当我使用 telnet 连接时,我得到以下输出: Waiting for a
简介 我正在学习c++ 和boost/asio 来实现分布式系统,所以我需要创建一个异步tcp 服务器。服务器像回声服务器一样工作,但您需要先发出请求(例如,通过套接字发送文本),服务器只响应 pi
我对 boost::async_read() 有疑问。 在网上,我发现有一个函数read_at_least(n)。但我正在寻找类似 read_max() 的函数,它可以读取最大字节数。 问题是我有不同
我有以下代码: void GnutellaApp::HandleRead (boost::asio::ip::tcp::socket& socket) { char buf[128];
我目前正在带宽非常低的环境中测试我的网络应用程序。我目前有代码试图通过确保我仍在接收信息来确保连接良好。 传统上,我通过在我的 ReadHandler 函数中记录时间戳来完成此操作,这样每次它被调用时
我正在使用 Boost/ASIO 编写通过 TCP/IP 通信的 C++ 服务器和随附的客户端应用程序。我看到连续接收之间的延迟导致服务器和客户端之间的吞吐量低于预期。两边的代码大致看起来像 clas
在 Windows 上,我观察到如果 async_read 操作在串行端口上成功完成,我会立即启动另一个 async_read 操作来读取 n 字节,第二个 async_read 操作立即意外完成并成
我对一个简单的 boost asio TCP 对话有点疯狂。 我有一个服务器和一个客户端。我使用长度前缀的消息。客户端发送“一”,服务器响应“二”。所以这就是我看到的情况: 客户端发送,服务器接收,0
我不是很熟悉 boost::asio 的基础知识。我正在处理连接到 Web 服务器并读取响应的任务。响应在随机时间段抛出,即在生成响应时。 为此,我使用了 boost::beast 库,它包含在 bo
我正在测试我的一些协议(protocol)设计,但无法让连续的 async_read 工作。我的想法是创建一个通用的读取处理程序来输出接收到的数据(测试),然后检查它以执行协议(protocol)定义
我有以下代码,它是从我的真实代码中简化而来的,我试图在连接到子进程的 async_pipe 上执行 async_read。在子进程中,我调用“ls”。作为一个测试,我希望我的异步读取能够得到结果。它返
这是我当前的服务器代码。我使用 telnet 连接到服务器。 #include #include #include #include using boost::asio::ip::tcp; c
所以, 我一直在研究 Boost asio 函数和套接字(特别是异步读/写)。现在,我认为 boost::asio::async_read 只在网络连接传入新缓冲区时才调用处理程序...但是它不会停止
我正在尝试使用 Boost::asio 和 async_read 在使用串行端口的协议(protocol)中实现超时。 我已经使用同步读取完成了一个测试实现,它只适用于查找,但我的超时实现不起作用。
我有一个使用 Asio 与远程系统对话的项目。我已将所有 Asio 代码封装在一个类中,该类在构造函数中打开一个同步连接,然后提供一个公共(public)方法,以便该类的用户可以通过套接字进行写入。这
我正在使用 boost::asio 进行客户端和服务器应用程序之间的 TCP 通信,这两者都是我编写的。我最初是通过使用 boost::asio::read 的同步数据读取来编写此代码的。 sync_
我正在尝试编写基于 IO_Service 的异步 TCP 客户端,其中 Async_write 工作正常但 async_read 在无限循环中运行。在我尝试纠正这个问题的过程中,我发现在所有其他情况下
我正在尝试实现一个带有异步套接字的 ssl 客户端,它从服务器发送和接收 protobuf 消息。消息的格式是前 4 个字节表示消息的大小,后面是 (X),其余是具有 X 字节的响应消息。 问题是我不
我是一名优秀的程序员,十分优秀!