簡體   English   中英

如何將Boost Asio Server集成到DLL中

[英]how to integrate Boost Asio Server in DLL

我想創建一個服務器,該服務器可以使用boost::asio從PacketSender之類的軟件中異步接收數據,但是當我嘗試如下操作時,它崩潰了。

這是我的代碼的樣子:

IoServiceWork.h-根據此鏈接為單例類

#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()創建一個獨立的工作線程,但未成功。

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 {public:server(boost :: asio :: io_service&io_service,短端口);

 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. 我創建了一個靜態函數,如下所示

     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. 

現在,可以在DLL靜態庫exe中使用它,即使您的服務器拋出異常,也不會影響調用該應用程序的應用程序,因此它也是線程安全的。

好吧,此解決方案可能會對某人有所幫助。

問候,

Jithendrakumar K.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM