asio boost 异步错误处理_c – boost :: asio,异步读错误

博客讨论了在使用 Boost.Asio 库进行异步 TCP 服务器编程时遇到的访问冲突问题。错误发生在 `basic_stream_socket.hpp` 的第 275 行,可能是由于未初始化的对象导致。作者展示了服务器和连接类的部分代码,并在错误发生时输出详细信息。在处理读取操作时,服务器崩溃并收到 'I/O operation has been aborted' 错误。博客旨在找出并解决这个问题。
摘要由CSDN通过智能技术生成

由于某种原因,这会导致访问冲突,但是没有任何详细的文档/帮助,我不知道我在哪里做错了.由于我在boost站点上看到的这应该是正确的,并将每个asio :: write调用的内容从客户端打印到新行.客户似乎工作正常.虽然服务器崩溃,但它还没有发送任何东西.

访问冲突发生在第275行的basic_stream_socket.hpp中.原因似乎是对象(boost :: asio :: stream_socket_service)没有初始化(this指针的值是0xfeeefeee),但我不明白为什么事实并非如此.

程序输出:

Start server

Server::startAccept()

Server::handleAccept()

Connection accepted

Connection::startRead()

Server::startAccept()

Connection::handleRead()

READ ERROR: The I/O operation has been aborted because either a thread exited or an application request

Connection::startRead()

代码

#include "precompiled.h"

#include "db.h"

class Connection

: public boost::enable_shared_from_this

{

public:

typedef boost::shared_ptr 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 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,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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值