在使用C ++ 11标准替换最初在 boost 中的所有内容之后,我使用ASIO根据此server示例构建了一个演示应用程序。服务器可以显示只有在客户端连接后才调用类成员tcp_session::start()
,这表明服务器接受来自客户端的连接。
然而,当客户端发送大量数据时,我没有看到handle_read
收到任何内容。我在handle_read中得到了一些std :: cout并停止了。我现在将超时时间设为6秒,并发现:
在客户端连接后立即调用start
,然后没有任何内容表明调用handle_read
,但在6秒后调用stop()
,然后调用handle_read
由于超时而socket_.isOpen()
为假。
然后我发现,如果我将async_read
更改为async_read_until
最初由我评论,那么handle_read
将被调用,而socket_.isopen
是真的,所以我真的可以看到包。
分隔符在那里,但我不想要一个。如何在没有分隔符的情况下异步读取整个TCP字符串?为什么async_read不起作用?它应该像这样工作吗?我的代码有什么问题吗?
我正在使用VS2015并在localhost上进行测试。
TCP没有边界所以我决定使用特殊字符来表示每个数据包的结束。
以下是一些相关代码:
class tcp_session : public subscriber, public std::enable_shared_from_this<tcp_session> {
public:
void start() {
std::cout<<"started"<<std::endl;
channel_.join(shared_from_this());
start_read();
input_deadline_.async_wait(
std::bind(&tcp_session::check_deadline, shared_from_this(), &input_deadline_)
);
await_output();
output_deadline_.async_wait(
std::bind(&tcp_session::check_deadline, shared_from_this(), &output_deadline_)
);
}
private:
bool stopped() const {
return !socket_.is_open();// weird that it is still not open
}
void start_read() {
// Set a deadline for the read operation.
input_deadline_.expires_from_now(timeout_); //was std::chrono::seconds(30) in example
char a = 0x7F;
// Start an asynchronous operation to read a 0x7F-delimited message or read all
//asio::async_read_until(socket_, input_buffer_, a, std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));
asio::async_read(socket_, input_buffer_,
std::bind(&TCP_Session::handle_read, shared_from_this(), std::placeholders::_1));
}
void handle_read(const asio::error_code& ec) {
if (stopped()) // it thinks it stopped and returned without processing
return;