I wanna make multi client Server using boost::asio and boost::thread_group.
I tried this
//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);
};
and this is Listener.cpp file
//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();
}
but session->_iocontext.post(boost::bind(&Session::StartSession,this)); // error '->': Cannot convert from'T' to'Session *'.
The main statement of Server is as follows.
//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;
}
I wanna make multithread Server [ one io_context Listener(include accept), multiple io_context Session( for client)]
In other words I want to change the structure in which session threads are created for each client. I don't know if the code I created is correct.
N:1 communication is possible, but session processing works synchronously. So I want to make a thread a session and handle it asynchronously.