作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试实现一个 AsyncReadStream 流以从 std::cin 中读取,目前为止有以下代码:
template <class MutableBufferSequence, class ReadHandler>
void async_read_some(const MutableBufferSequence &buf, ReadHandler handler) {
char c[1024] = {};
std::streamsize num = std::cin.readsome(c, 1023);
c[num] = 0;
boost::asio::streambuf buff(1023);
std::ostream os(&buff);
os << c;
// How do I get the buff into the buf???? I've tried below:
//boost::asio::buffered_stream<boost::asio::streambuf> buff_stream(buff);
//boost::asio::read(buff_stream, buf);
handler(boost::system::error_code(), boost::asio::buffer_size(buf));
}
我知道上面的一些代码是阻塞的,虽然它不应该是阻塞的,但这不是我这里的问题(我认为)。我已经检查了 MutableBufferSequence http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio/reference/MutableBufferSequence.html 的文档而且似乎没有任何明显的方法可以做到这一点。显然我完全误解了一些东西。
最佳答案
我会跳过 streambuf(为什么要复制它两次?)。
template <class MutableBufferSequence, class ReadHandler>
void my_read_some(MutableBufferSequence buf, ReadHandler handler) {
char tmp[1024] = {};
std::cin.read(tmp, sizeof(tmp));
std::streamsize num = std::cin.gcount();
if(std::cin || num) {
ba::buffer_copy(buf, ba::buffer(tmp, num));
handler({}, num);
} else {
handler(ba::error::eof, num);
}
}
(其中 ba::
是 boost::asio::
的缩写)。
另请注意,read_some
可能不是您想要的 (std::cin.readsome always reading 0 bytes)。
使用方法:
int main() {
std::array<char, 512> block1{}, block2{};
std::vector<ba::mutable_buffers_1> blocks { ba::buffer(block1), ba::buffer(block2) };
auto handler = [&blocks](boost::system::error_code ec, size_t transferred) {
if (ec)
std::cout << "Error " << ec.message() << "\n";
else {
std::cout << "Received " << transferred << " bytes\n-------\n";
std::copy_n(ba::buffers_begin(blocks), transferred, std::ostreambuf_iterator<char>(std::cout));
std::cout << "\n-------\n";
}
};
my_read_some(blocks, handler);
}
关于c++ - 如何将数据写入 MutableBufferSequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46467064/
我正在尝试实现一个 AsyncReadStream 流以从 std::cin 中读取,目前为止有以下代码: template void async_read_some(const Mutab
我是一名优秀的程序员,十分优秀!