如何在DLL

时间:2015-10-31 06:25:51

标签: c++ boost boost-asio

我想创建一个可以使用boost::asio从PacketSender等软件接收数据异步的服务器,但是当我尝试如下时它会崩溃。

这就是我的代码的样子:

IoServiceWork.h - 这是一个单独的类link

#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>

class IoServiceWork
{
 public:
  IoServiceWork()
    : m_ioService(new boost::asio::io_service()),
    m_ioServiceWork(new boost::asio::io_service::work(*m_ioService)),
    m_ioWorkThread(new boost::thread(boost::bind(&boost::asio::io_service::run, m_ioService)))
{

}
~IoServiceWork()
{
    delete m_ioServiceWork;
    m_ioWorkThread->join();
    delete m_ioWorkThread;
    delete m_ioService;

}

boost::asio::io_service& ioService()
{
    return *m_ioService;
}

boost::asio::io_service* m_ioService;
boost::asio::io_service::work* m_ioServiceWork;
boost::thread* m_ioWorkThread;
};

CustomIOService.h - 此类为io_service创建一个单独的线程,以便不执行其余的代码执行。

#include <boost/asio.hpp>

boost::asio::io_service& IOService();

CustomIOService.cpp

#include "CustomIOService.h"
#include "IoServiceWork.h"

boost::asio::io_service& IOService()
{
    static IoServiceWork ioServiceWork;
    return ioServiceWork.ioService();
}

以下是我在DLL中调用它的方法

server ser(IOService(), 7777);

当我的DLL中的程序执行达到这一点时,它会抛出Mutex锁定错误,我无法调试但是当应用程序崩溃时我可以附加。

我试图为io_service()创建一个sperate work 线程,但没有成功。

boost::asio::io_service io_service;
auto_ptr<boost::asio::io_service::work> work(new     boost::asio::io_service::work(io_service));
server ser(work->io_service(), 7777);

这是我的服务器类看起来像

server.h     班级服务器     {      上市:      server(boost :: asio :: io_service&amp; io_service,short port);

 private:
   void start_accept();

void handle_accept(session* new_session, const boost::system::error_code& error);

boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
};

server.cpp

server::server(boost::asio::io_service& io_service, short port) :     io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
{
start_accept();
}


void server::start_accept()
{
session* new_session = new session(io_service_);
acceptor_.async_accept(new_session->socket(),    boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error));
}

void server::handle_accept(session* new_session, const boost::system::error_code& error)
{
if (!error)
{
    new_session->start();
}
else
{
    delete new_session;
}

start_accept();
}

我做错了,有没有办法让它运行。

修改 任何建议请...

1 个答案:

答案 0 :(得分:0)

我已经google了很多来解决我上面提到的问题,但是没有人回复所以我尝试了很多试错条件,其中一个完美无缺。

这就是我做的事情

  1. 我已经创建了一个静态函数,如下所示

    static void startServer()
    {
        boost::asio::io_service ioservice;
        server ser(ioservice, 7777);
        ioservice.run()
    }
    
  2. 无论我在哪里启动服务器,只需按以下方式调用,服务器就会启动。

    boost::Thread t(&startServer);//Make sure that no brackets while calling.
    
  3. 现在可以在 DLL 静态库 exe 中使用,您的服务器在单独的线程中运行,尽管它会抛出它不会影响调用它的应用程序,因此它也是线程安全的。

    那么这个解决方案可能会对某人有所帮助。

    此致

    Jithendrakumar K。