- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在实现一个简单的 TCP 服务器时遇到了困难。以下代码摘自boost::asio examples ,准确地说是“Http 服务器 1”。
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 字节。
服务器在本地主机的 80 端口编译和监听,所以我尝试通过我的网络浏览器连接到它。
现在如果语句 (1) 被注释掉,那么只有请求的前 32 个字节被读取并且连接挂起。 Web 浏览器一直在等待响应,服务器确实在等待......我不知道是什么。
如果 (1) 未注释,则读取整个请求(并附加到 data_
),但它永远不会停止 - 我必须在浏览器中取消请求,然后才执行 else { }
部分运行 - 我在 stdout 上看到了我的请求。
问题 1:我应该如何处理大请求?
问题2:我应该如何缓存请求(目前我将缓冲区附加到一个字符串)?
问题 3:如何判断请求已经结束?在 HTTP 中总是有一个响应,所以我的网络浏览器一直在等待它并且不关闭连接,但是我的服务器如何知道请求已经结束(并且可能关闭它或回复一些“200 OK”)?
最佳答案
假设浏览器向您发送 1360 字节的数据,您说 asio
将一些数据读入您的缓冲区,您说它只有 32 字节。那么你第一次调用它时,你的处理程序将以 32 字节的数据开头被调用。在这里如果你评论 (1) 然后浏览器尝试发送它的其余数据(实际上浏览器已经发送它并且它在操作系统缓冲区中等待你从那里偷看它)并且你可能被阻止在 io_service 后面: :run
创造奇迹!!
如果你在循环开始时取消注释 (1),你会读取第一个 block ,然后是下一个 block ,然后......直到浏览器发送的数据完成,但在那之后当你说 asio
要读取更多数据,它将等待更多数据,这些数据永远不会来自浏览器(因为浏览器已经发送了它的信息并正在等待您的回答)并且当您取消来自浏览器的请求时,它将关闭其套接字并那么你的处理程序将被调用,并显示一个错误,说我无法读取更多数据,因为连接已关闭。!!
但你应该在这里做的是让它工作:你应该学习 HTTP
格式,从而知道你的浏览器发送给你的数据是什么,并为它提供一个好的答案,然后你的与客户的沟通将继续进行。在这种情况下,缓冲区的末尾是 \r\n\r\n
并且当您看到它时,您不应该再读取任何数据,您应该处理到现在为止所读取的内容,然后将响应发送到浏览器。
关于c++ - boost ASIO async_read_some,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449611/
在 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
我是一名优秀的程序员,十分优秀!