C++ boost::asio,异步读取错误
出于某种原因,这会导致访问冲突,但是没有任何详细的文档/帮助,我不确定我哪里做错了。根据我在boost站点上看到的内容,这应该是正确的,并将来自客户端的每个asio::write调用的内容打印到新行。客户似乎工作得很好。虽然当时服务器崩溃了,但它还没有发送任何信息 访问冲突发生在第275行的basic_stream_socket.hpp中。原因似乎是对象(boost::asio::stream\u socket\u服务)并没有初始化(这个指针的值是0xfeeefeee),但我不明白为什么它并没有初始化 程序输出: 启动服务器C++ boost::asio,异步读取错误,c++,boost,boost-asio,C++,Boost,Boost Asio,出于某种原因,这会导致访问冲突,但是没有任何详细的文档/帮助,我不确定我哪里做错了。根据我在boost站点上看到的内容,这应该是正确的,并将来自客户端的每个asio::write调用的内容打印到新行。客户似乎工作得很好。虽然当时服务器崩溃了,但它还没有发送任何信息 访问冲突发生在第275行的basic_stream_socket.hpp中。原因似乎是对象(boost::asio::stream\u socket\u服务)并没有初始化(这个指针的值是0xfeeefeee),但我不明白为什么它并没有
服务器::startAccept()
服务器::handleAccept()
已接受连接
连接::startRead()
服务器::startAccept()
连接::handleRead()
读取错误:由于线程退出或应用程序请求,I/O操作已中止
连接::startRead() 代码
#include "precompiled.h"
#include "db.h"
class Connection
: public boost::enable_shared_from_this<Connection>
{
public:
typedef boost::shared_ptr<Connection> Pointer;
static Pointer create(boost::asio::io_service& ioService)
{
return Pointer(new Connection(ioService));
}
ip::tcp::socket& getSocket()
{
return socket;
}
void startRead()
{
std::cout << "Connection::startRead()" << std::endl;
socket.async_read_some(boost::asio::buffer(readBuffer),
boost::bind(&Connection::handleRead,this,_1,_2));
}
private:
Connection(asio::io_service& ioService)
: socket(ioService)
{
}
void handleWrite(const boost::system::error_code&,size_t)
{
}
void handleRead(const boost::system::error_code&error,size_t len)
{
std::cout << "Connection::handleRead()" << std::endl;
if(error)
{
std::cout << "READ ERROR: ";
std::cout << boost::system::system_error(error).what();
std::cout << std::endl;
}
else
{
std::cout << "read: ";
std::cout.write(readBuffer.data(),len);
std::cout << std::endl;
}
startRead();
}
boost::array<char, 256> readBuffer;
ip::tcp::socket socket;
};
class Server
{
public:
Server(asio::io_service& ioService)
:acceptor(ioService, ip::tcp::endpoint(ip::tcp::v4(), getPort()))
{
startAccept();
}
private:
void startAccept()
{
std::cout << "RServer::startAccept()" << std::endl;
Connection::Pointer newConn =
Connection::create(acceptor.io_service());
acceptor.async_accept(newConn->getSocket(),
boost::bind(&Server::handleAccept, this, newConn,
asio::placeholders::error));
}
void handleAccept(Connection::Pointer newConn,
const boost::system::error_code& error)
{
std::cout << "Server::handleAccept()" << std::endl;
if(error)
{
std::cout << "CONNECTION ERROR: ";
std::cout << boost::system::system_error(error).what();
std::cout << std::endl;
}
else
{
std::cout << "Connection accepted" << std::endl;
startAccept();
newConn->startRead();
}
}
ip::tcp::acceptor acceptor;
};
int main()
{
std::cout << "Start server" << std::endl;
asio::io_service ioService;
RemoteAdminServer server(ioService);
boost::system::error_code error;
ioService.run(error);
}
#包括“precompiled.h”
#包括“db.h”
类连接
:public boost::从\u启用\u共享\u
{
公众:
typedef boost::共享_ptr指针;
静态指针创建(boost::asio::io_服务和ioService)
{
返回指针(新连接(ioService));
}
ip::tcp::socket和getSocket()
{
返回插座;
}
void startRead()
{
std::cout我认为您的跑步是存在的,因为您的工作队列中没有剩余的工作
必须防止运行退出并销毁服务对象
请尝试以下方法之一:
或者只是做一个
do { ioService.run( error ); } while( !error );
您应该更改此代码段:
void startRead()
{
std::cout << "Connection::startRead()" << std::endl;
socket.async_read_some(boost::asio::buffer(readBuffer),
boost::bind(&Connection::handleRead,this,_1,_2));
}
void startRead()
{
std::您不能在不重置io服务的情况下重新运行它吗。
void startRead()
{
std::cout << "Connection::startRead()" << std::endl;
socket.async_read_some(boost::asio::buffer(readBuffer),
boost::bind(&Connection::handleRead,this->shared_from_this(),_1,_2));
}