大佬教程收集整理的这篇文章主要介绍了c – boost :: asio,异步读错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
访问冲突发生在第275行的basic_stream_socket.hpp中.原因似乎是对象(boost :: asio :: stream_socket_servicE)没有初始化(this指针的值是0xfeeefeeE),但我不明白为什么事实并非如此.
程序输出:
#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,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); }
void startRead() { std::cout << "Connection::startRead()" << std::endl; socket.async_read_some(boost::asio::buffer(readBuffer),_2)); }
至:
void startRead() { std::cout << "Connection::startRead()" << std::endl; socket.async_read_some(boost::asio::buffer(readBuffer),this->shared_from_this(),_2)); }
请注意,我将共享指针传递给bind.这将保持Connection实例,直到@L_874_1@处理程序.否则,在Server :: startAccept中使用计数变为零,并删除该对象.然后,当@L_874_1@处理程序时,内存无效,您会遇到可怕的“未定义行为”.
以上是大佬教程为你收集整理的c – boost :: asio,异步读错误全部内容,希望文章能够帮你解决c – boost :: asio,异步读错误所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。