【发布时间】:2023-04-04 02:29:01
【问题描述】:
我想使用 boost::asio 和 boost::thread_group 创建多客户端服务器。
我试过了
//Listener.h
#pragma once
#include <boost/asio/ip/tcp.hpp>
#include <boost/bind.hpp>
#include <memory>
#include <boost/asio/io_context.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/thread/thread.hpp>
#include "Session.h"
#define PORT_NUMBER 12880
class Listener
{
public:
Listener(boost::asio::io_context& iosvc, boost::asio::ip::tcp::endpoint& ep);
void Start_accept();
private:
boost::asio::io_context &_iosvc;
boost::asio::ip::tcp::acceptor _acceptor;
boost::thread_group threadPool;
void OnAcceptComplete(const boost::system::error_code& error, Session* session);
};
这是 Listener.cpp 文件
//Listener.cpp
#pragma once
#include <iostream>
#include "Listener.h"
#include "SessionManager.h"
Listener::Listener(boost::asio::io_context& iosvc, boost::asio::ip::tcp::endpoint& ep) :
_acceptor(iosvc, ep), _iosvc(iosvc) {}
void Listener::Start_accept()
{
//Create Client Session
Session* new_session = clientsession::SessionManager::GetInstance()->GenerateSession(_iosvc);
std::cout << "Listener thread ID : " << std::this_thread::get_id << '\n';
std::cout << "Listening....." << "\n\n";
_acceptor.async_accept(*(new_session->Socket()),
boost::bind(&Listener::OnAcceptComplete, this, boost::asio::placeholders::error, new_session));
}
void Listener::OnAcceptComplete(const boost::system::error_code& error, Session* session)
{
if (!error)
{
std::cout << "accept completed" << '\n';
threadPool.create_thread(boost::bind(&boost::asio::io_context::run, &(session->_iocontext)));
session->_iocontext.post(boost::bind(&Session::StartSession,this)); // error '->*': Cannot convert from'T*' to'Session *'.
threadPool.join_all();
}
else
{
std::cout << error.message() << '\n';
}
Start_accept();
}
但是 session->_iocontext.post(boost::bind(&Session::StartSession,this)); // 错误'->': 无法从'T' 转换为'Session *'。
Server的主要语句如下。
//Server.cpp
#include <iostream>
#include <boost/thread/thread.hpp>
#include "Listener.h"
#include "SessionManager.h"
using namespace boost::asio;
using namespace clientsession;
SessionManager* _sessionManager;
int main()
{
try
{
boost::asio::io_context iocontext;
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), PORT_NUMBER); //ipv4, 포트번호
Listener* _listener = new Listener(iocontext, ep);
_listener->Start_accept();
iocontext.run();
}
catch (std::exception& e)
{
std::cout << e.what() << '\n';
}
while (true)
{
}
return 0;
}
我想做多线程服务器[一个 io_context 监听器(包括接受),多个 io_context 会话(用于客户端)]
换句话说 我想更改为每个客户端创建会话线程的结构。 我不知道我创建的代码是否正确。
可以进行 N:1 通信,但会话处理是同步进行的。所以我想让一个线程成为一个会话并异步处理它。
【问题讨论】:
标签: c++ multithreading boost