Boost ASIO async_read_some
Boost ASIO async_read_some
我在实现一个简单的TCP服务器时遇到了困难。以下代码取自boost::asio示例,确切地说是"HttpServer1"。
void connection::start() {
socket_.async_read_some(
boost::asio::buffer(buffer_),
boost::bind(
&connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
void connection::handle_read(const boost::system::error_code& e, std::size_t bytes_transferred) {
if (!e && bytes_transferred) {
std::cout << " " << bytes_transferred <<"b" << std::endl;
data_.append(buffer_.data(), buffer_.data()+bytes_transferred);
//(1) what here?
socket_.async_read_some(
boost::asio::buffer(buffer_),
boost::bind(
&connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
}
else// if (e != boost::asio::error::operation_aborted)
{
std::cout << data_ << std::endl;
connection_manager_.stop(shared_from_this());
}
}
在原始代码中,buffer_
足够大,可以保留整个请求。这不是我需要的。我已将大小更改为32字节。
服务器在localhost的80端口进行编译和侦听,所以我尝试通过web浏览器连接到它。
现在,如果语句(1)被注释掉,那么只读取请求的前32个字节,并且连接挂起。Web浏览器一直在等待响应,而服务器却在等待。。我不知道是什么。
如果(1)被取消注释,那么整个请求将被读取(并被调用到data_
),但它永远不会停止——我必须在浏览器中取消请求,然后才运行else { }
部分——我在stdout上看到我的请求。
问题1:我应该如何处理大型请求
问题2:我应该如何缓存请求(当前我将缓冲区附加到字符串中)
问题3:如何判断请求已结束?在HTTP中,总是会有响应,所以我的web浏览器一直在等待它,并没有关闭连接,但我的服务器怎么能知道请求已经结束(也许会关闭它或回复一些"200 OK")?
假设浏览器向您发送1360字节的数据,您说asio
将一些数据读取到您的缓冲区中,您说它只有32字节。然后第一次调用它时,您的处理程序将以32字节的数据开头被调用。如果你在这里评论(1),那么浏览器会尝试发送它的其余数据(实际上浏览器已经发送了它,它在操作系统缓冲区中等待你从那里查看),你可能会因为奇迹而被阻止在io_service::run
后面!!
如果在循环开始时取消注释(1),则读取第一个块,然后读取下一个和另一个,然后。。。直到浏览器发送的数据完成,但在那之后,当你说asio
读取更多数据时,它将等待更多从未来自浏览器的数据(因为浏览器已经发送了信息,正在等待你的回答),当你取消浏览器的请求时,它将关闭其套接字,然后您的处理程序将被调用,并显示一个错误,说明由于连接已关闭,我无法读取更多数据。!!
但你应该做的是:你应该学习HTTP
格式,从而知道你的浏览器发送给你的数据是什么,并为它提供一个好的答案,然后你与客户端的通信就会继续。在这种情况下,缓冲区的末尾是rnrn
,当您看到它时,您不应该再读取任何数据,您应该处理到目前为止读取的内容,然后向浏览器发送响应。
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- write() 和 read() 中几乎没有混淆
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 对同一文件使用 .read 的次数是否有限制?
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- QDataStream read to QVector
- asio::read() 需要很长时间,使用 asio::write 没有问题
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- 如何将 (serverClients[i].read() 传递给 ESP8266 上的字节数组
- 将 Lora.read() 转储到数组
- 无法通过 FUSE 文件系统"read"任何内容
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 封送指向结构异常"cannot Read or Write protected memory"的指针数组的指针数组
- 为什么以下代码块提供输出"ZZZ(some garbage value)"而不是"ZZ(some garbage value)"
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- C++HTTP客户端在GET请求后挂起read()调用