Я хочу создать сервер, который может получать данные 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: Любые предложения, пожалуйста ...
Вам нужно приложение, которое загружает DLL и инстанцирует сервер. Поскольку ваш вопрос в настоящее время написан (слишком мало деталей), я очень сомневаюсь, что вы получите удовлетворительный ответ здесь. –
Добавлен код для ясности, любое предложение будет очень полезно – Jithendra