2015-10-31 3 views
0

Я хочу создать сервер, который может получать данные async с помощью boost::asio с помощью программного обеспечения, такого как PacketSender, но когда я пытаюсь, как ниже, он сбой.Как интегрировать Boost Asio Server в DLL

Это как мой код выглядит следующим образом:

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(), но не удалось.

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 сервер класса { общественности: сервер (повышение :: 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(); 
} 

Где я делаю неправильно, есть ли способ, чтобы заставить ее работать.

Edit: Любые предложения, пожалуйста ...

+0

Вам нужно приложение, которое загружает DLL и инстанцирует сервер. Поскольку ваш вопрос в настоящее время написан (слишком мало деталей), я очень сомневаюсь, что вы получите удовлетворительный ответ здесь. –

+0

Добавлен код для ясности, любое предложение будет очень полезно – Jithendra

ответ

0

Я гугл так много, чтобы решить мою выше поставленную задачу, но никто не ответил, так что я попытался так много проб и ошибок условий, и один из них работает отлично.

Вот что я сделал

  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 или в Static Library или ехе, ваш сервер работает в отдельном потоке, Eventhough, если он бросает исключение не будет влиять на приложение, в котором оно было вызвано, так что оно также является потокобезопасным.

Ну, это решение может помочь кому-то.

С уважением,

Jithendrakumar К.

Смежные вопросы