C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – boost :: asio,异步读错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
由于某种原因,这会导致访问冲突,但是没有任何详细的文档/帮助,我不知道我在哪里做错了.由于我在boost站点上看到的这应该是正确的,并将每个asio :: write@L_874_1@的内容从客户端打印到新行.客户似乎工作正常.然服务器崩溃,但它还没有发送任何东西.

访问冲突发生在第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,请注明来意。