[英]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();
}
我做錯了什么,有什么辦法可以使其運行。
編輯:任何建議,請...
我已經用谷歌搜索了很多,以解決上述問題,但是沒有人回答,所以我嘗試了很多試驗和錯誤條件,其中之一工作得很好。
這就是我所做的
我創建了一個靜態函數,如下所示
static void startServer() { boost::asio::io_service ioservice; server ser(ioservice, 7777); ioservice.run() }
無論我在哪里啟動服務器,只需按如下所示進行調用,您的服務器就會啟動。
boost::Thread t(&startServer);//Make sure that no brackets while calling.
現在,可以在DLL或靜態庫或exe中使用它,即使您的服務器拋出異常,也不會影響調用該應用程序的應用程序,因此它也是線程安全的。
好吧,此解決方案可能會對某人有所幫助。
問候,
Jithendrakumar K.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.