Je suis en train de créer une application serveur en C++11 en utilisant Boost.Asio. J'ai créé une classe, Server
qui se charge d'accepter les nouvelles connexions. En gros, c'est juste :
void Server::Accept() {
socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
acceptor_.async_accept(*socket_,
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}
void Server::HandleAccept(const boost::system::error_code& error) {
if (!error) {
// TODO
} else {
TRACE_ERROR("Server::HandleAccept: Error!");
}
Accept();
}
J'ai trouvé deux façons (je suis sûr qu'il y en a d'autres) de "réparer" le problème de l'utilisation de l'eau. TODO
c'est à dire déplacer la socket là où elle doit aller. Dans mon cas, je veux juste qu'il revienne à l'instance de la classe qui possède le fichier Server
(qui l'englobe ensuite dans une instance Connection
et l'insère dans une liste).
-
Server
a un paramètre dans son constructeur :std::function<void(socket)> OnAccept
qui est appelé dansHandleAccept
. - Je crée une classe abstraite,
IServerHandler
ou autre, qui possède une méthode virtuelleOnAccept
.Server
prendIServerHandler
comme paramètre dans son constructeur et l'instance de la classe possédant l'instance du serveur étendIServerHandler
et construitServer
con*this
comme paramètre.
Quels sont les avantages et les inconvénients de l'option 1 par rapport à l'option 2 ? Existe-t-il de meilleures options ? J'ai le même problème dans mon Connection
classe ( OnConnectionClosed
). De plus, en fonction de la façon dont je décide de concevoir le système, il pourrait avoir besoin d'une OnPacketReceived
y OnPacketSent
le rappel.