提升::asio async_read简单的文件上传
Boost::asio async_read simple file upload
我正在尝试使用boost::asio和ajax创建一个简单的文件上传。不知何故,即使我的缓冲区大小为 500MB,bytes_transferred也达到了 21845(或类似(的最大值。对于文本文件,std::cout 会显示一些内容,但对于二进制文件,它会在标头之后立即切断(仍然传输 21845 字节(。
我尝试使用不同的方法,如async_read_some和async_read_until,但它没有改变任何东西。还尝试了 socket.set_option(( 保持活动状态并更改套接字缓冲区大小。
class tcp_connection
{
public:
void start() {
boost::asio::async_read(socket, boost::asio::buffer(buf), boost::asio::transfer_at_least(1), boost::bind(&tcp_connection::handler, error, bytes_transferred));
}
private:
boost::array<unsigned char, 500000000> buf;
void handler(error, bytes) {
std::cout << buf.data() << std::endl;
boost::asio::async_write(socket, response_buffer, boost::bind(&tcp_connection, handler));
}
}
请查看 https://pastebin.com/dPvVGsjU 以获取完整的最小可重用示例
我没有收到错误消息,尽管我忽略了 eof 错误。
为什么你认为整个数据会在一次读取操作中被读取?您的完成条件是 transfer_at_least(1)
,因此读取操作可以读取 1、10、100 或 N 个字节并返回。您应该读取数据,直到收到整个内容。由于您不知道输入数据的长度,因此请继续读取,直到eof
发生。
所以传递给async_read
的处理程序的逻辑应该是:
void send_response2(const boost::system::error_code& err, const size_t& bytes)
{
if (err == boost::asio::error::eof)
{
// analyze your buf2 here if it is what you wanted to read
// here you can start sending data
}
else if (err)
{ /* problem */ }
else
{
// call again async_read with send_response like
boost::asio::async_read(socket, boost::asio::dynamic_buffer(buf2), boost::asio::transfer_at_least(1), boost::bind(&tcp_connection::send_response2, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
您可以使用动态缓冲区,而不是buffer::array
为具有固定大小的缓冲区。然后,通过添加新的读取字节来扩展缓冲区。
std::string buf2; // as data member
// then pass buffer by
boost::asio::dynamic_buffer(buf2)
相关文章:
- 一种在C++中读取TXT配置文件的简单方法
- 有没有办法简单地从 GPU 调用多个 cpp 输出文件?
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 简单的二分搜索对我不起作用。我正在尝试从文本文件中搜索单词
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 编译简单的多文件类程序时出现未定义的引用错误
- 为简单的src,include,libs文件夹项目编写Makefile
- 从 txt 文件中读取数据的最简单方法
- 简单加密和解密 TXT 文件 [C++]
- Centos6 gcc6:编译简单的 c++11 测试文件时,默认的 ABI 不拾取
- 在 Fedora 20 中查找简单设备驱动程序的头文件
- 使用 libcurl C++将文件下载到 Ubuntu,简单示例不起作用
- 简单的文本文件格式化在linux下崩溃,但在Windows中很好
- 算术编码FPAQ0(一个简单的订单-0算术文件压缩机)
- C++ 使用简单的代码同时写入文件和控制台输出
- 提升::asio async_read简单的文件上传
- 如何直接在安卓设备上作为可执行文件运行简单的 c++ 程序?