我想创建一个可以使用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();
}
我做错了,有没有办法让它运行。
修改 任何建议请...
答案 0 :(得分:0)
我已经google了很多来解决我上面提到的问题,但是没有人回复所以我尝试了很多试错条件,其中一个完美无缺。
这就是我做的事情
我已经创建了一个静态函数,如下所示
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。