سؤال

لسبب ما وهذا يؤدي إلى حدوث انتهاك وصول، ولكن عدم وجود أي وثائق مفصلة / مساعدة فى هذا لست متأكدا من أين أنا أفعل ذلك الخطأ. منذ يحدث من قبل ما رأيته على موقع دفعة ينبغي أن يكون هذا صحيحا، وطباعة محتويات كل مكالمة اسيو :: الكتابة من العميل إلى سطر جديد. ويبدو أن العميل للعمل بشكل جيد. على الرغم من عند نقطة تعطل الخادم، ولكنه لم يرسل شيئا إلى الآن.

وخرق وصول يحدث في basic_stream_socket.hpp على خط 275. السبب يبدو أن هذا الكائن (تعزيز :: :: اسيو stream_socket_service) لم يتم تهيئة (قيمة هذا المؤشر 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);
}
هل كانت مفيدة؟

المحلول

ويجب تغيير هذه التعليمات البرمجية المتكررة:

   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::cout << "Connection::startRead()" << std::endl;
     socket.async_read_some(boost::asio::buffer(readBuffer),
                boost::bind(&Connection::handleRead,this->shared_from_this(),_1,_2));
}

لاحظ أن مررت <م> مؤشر المشتركة إلى bind. هذا وسوف تبقي المثال Connection الخاص في جميع أنحاء حتى يتم استدعاء معالج. خلاف ذلك، فإن العد استخدام يذهب إلى الصفر في Server::startAccept ويتم حذف الكائن. بعد ذلك، عندما يتم استدعاء معالج، الذاكرة غير صالحة واجهت اللعين "سلوك غير معرف."

نصائح أخرى

وأعتقد تشغيل الخاص بك موجود لأنه لم يكن لديك أي عمل اليسار في قائمة انتظار العمل.

ويجب منع المدى من إنهاء وتدمير الكائن خدمتكم.

وإما حاول هذا:

<وأ href = "http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.stopping_the_io_service_from_running_out_of_work" يختلط = "نوفولو noreferrer" > دفعة :: :: اسيو io_service :: العمل

وأو لا مجرد

do { ioService.run( error ); } while( !error );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top