- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我很难在文档中找到明确的答案。
我想知道取消异步读取或写入操作然后重新启动操作是否会导致数据流损坏?
详细阅读:如果 async_read_some 操作正在运行:
我能确定当我开始一个新的 async_read_some 操作时,没有数据丢失吗? IE。当处理程序返回 operation_aborted 错误时,没有数据被读取?
同样适用于 async_write_some 操作。当我取消操作时,等待处理程序完成,处理结果(我再次知道返回不需要operation_aborted),然后开始写入剩余数据,流是否可能重复数据? IE。 cancel会不会导致恢复写入时数据重复写入?
最佳答案
cancel()
本身不会导致流中的数据丢失或重复。如果应用程序满足以下条件,数据丢失或重复只会发生在应用程序协议(protocol)中:
正确处理传递给完成处理程序的 error_code
和 bytes_transferred
将防止这种形式的数据丢失或重复。如果 bytes_transferred
大于 0
,则数据已从套接字读入缓冲区或从缓冲区写入套接字。请注意,如果某个操作已被调用或在不久的将来排队等待调用,则该操作将不再可取消。考虑以下场景,其中 socket
有 42
字节可供读取:
assert(socket.available() == 42);
std::array<char, 32> buffer;
socket.async_read_some(boost::asio::buffer(buffer), ...); // op 1
socket.cancel();
socket.async_read_some(boost::asio::buffer(buffer), ...); // op 2
io_service.run();
如果 op 1
成功并将 32
字节读入 buffer
,则 10
字节仍可用于从 socket
读取。 op 1
的完成处理程序将排队等待将来调用,error_code
为成功,bytes_transferred
为 32
。此时,socket.cancel()
对op 1
没有影响。启动 op 2
后,10
剩余字节准备好进入 buffer
,覆盖 op 1 中的一些未处理数据
。 op 2
的完成处理程序将排队等待将来调用,error_code
为成功,bytes_transferred
为 10
.
对于非组合操作,例如socket.async_read_some()
:
error_code
不会是boost::system::errc::success
和bytes_transferred
永远是 0
error_code
将是 boost::system::errc::success
而 bytes_transferred
将更大小于或等于 0
此行为记录在 StreamSocketService 中的 async_receive()
和 async_send()
函数:
If the operation completes successfully, the [handler] is invoked with the number of bytes transferred. Otherwise it is invoked with
0
.
另一方面,使用组合操作,例如 boost::asio::async_read()
,可以使用非成功的 error_code
和非零的 bytes_transferred
调用处理程序。例如,如果启动 async_read()
操作并设置为在完成之前读取 1024 个字节,则它可能会多次调用 async_read_some()
。如果收到 256 个字节然后连接关闭,async_read()
处理程序将有一个非零的 error_code
并且 bytes_transferred
将指示缓冲区的 256 个字节是有效的。
关于c++ - asio : is it safe to restart a async_read_some/async_write_some after cancel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36334161/
在 Boost::ASIO 中有没有办法知道 async_read_some 是否不会在特定时间段内返回以在不关闭套接字的情况下调用函数?如果没有更多数据要传输到缓冲区,通常 async_read_s
我的程序总是使用依赖于平台的同步接收,它会阻塞执行直到超时或接收事件,例如: recv(buf, size, timeout); 现在我想用 boost 替换这段代码,使其跨平台。我找到了解决方案,但
我正在使用非 boost asio 编写一个简单的异步服务器。我遇到了一个巨大的模板错误,坦率地说,我什至无法想象这意味着什么。 作为引用,我的代码看起来很像 http://think-async.c
这是我的服务器代码: socket_.async_read_some(boost::asio::buffer(data_read.data(), Message::header_length),
所以我在练习 boost 库时遇到了一些问题。我的应用程序使用 asio::serial_port,我决定添加一些日志功能。问题来了。 当我为 asio::io_service 创建线程时 boost
我在实现一个简单的 TCP 服务器时遇到了困难。以下代码摘自boost::asio examples ,准确地说是“Http 服务器 1”。 void connection::start() {
如何将 sock.async_read_some 的 read_handler 调用同步到特定频率,同时读取 812 字节的流(以 125 Hz 的频率流式传输)。 我有一个与从机器人读取流相关的问题
我尝试使用以下代码读取套接字中的可用字节数(在服务器端),变量 packet_bytes 没有做任何事情。我期望将数据包使用的字节数读入 packet_bytes 但这似乎不起作用。 std::siz
我正在使用 TCP echo 示例(1.62 是目前在主要 Ubuntu 软件包中提供的版本)。 https://www.boost.org/doc/libs/1_62_0/doc/html/boos
我正在为基于 HTTP Server 3 的 Mac OS X 开发一个 Boost asio 网络程序例子。它使用 async_read_some 从 TCP 套接字异步读取数据。 问题是我的处理程
我有一个使用 boost::asio 进行读/写操作的 C++ 服务器 - 写出消息工作正常 - 但由于某种原因我无法读取工作 我从客户端发送给它的消息是 15 16 位无符号短裤 - 我的测试消息是
假设在 boost::asio 中的套接字上启用了 async_read_some 服务,如果在同一套接字上调用阻塞读取会发生什么情况? 一段伪代码如下: using boost::asio::loc
我使用带有超时的 async_read_some 来使用这段代码 readdata=0; port_->async_read_some(boost::asio::buf
我试图在我的 C++ 程序中通过 http 接收一个包。我为此目的使用 Boost.Asio。 在我的 handleAccept 方法中,我有这个代码来读取包: // m_buffer is
我正在使用以下方法: boost::asio::streambuf io_bufstream; boost::asio::async_read_until(socket_, io_bufstream,
我的代码适用于 read_some,但不适用于 async_read_some。我正在读取的数据长度为 5 个字符,而 MAX_RESPONSE_SIZE 256。打开端口后,我从 main 中调用了
假设我有一个 Boos.Asio TCP 客户端,它可以发送一个字符串,如下所示: client.sendStr("1111"); 我还有一个异步的 Boost.Asio TCP 服务器,它将处理传入
上下文:我正致力于在与 Boost ASIO 集成的 RDMA 包装器库之上实现一个简单的流适配器。 我遇到的问题是,客户端代码调用的 boost::asio::async_read 聚合器挂起,即使
我有一个服务器使用来自 boost 的异步套接字和“接受”函数,如下所示(“用户”几乎等同于 this 示例中的“ session ”): accept() { this->_acce
为了理解 boost asio 库,我实现了一个异步回显服务器。我要求 tcp::socket 为少量数据执行 async_read_some,即 9 个字节(选择用于测试的小数字),即 socket
我是一名优秀的程序员,十分优秀!