SedNL : Simple Event Driven Network Library

SedNL est une bibliothĂšque rĂ©seau Ă©crite en C++11, principalement destinĂ©e Ă  la rĂ©alisation d’applications rĂ©seau dont le protocole est basĂ© sur la notion d’évĂšnements : Les clients et le serveur communiquent via des Ă©vĂšnements, de la forme : "login" { username : "raccoon", password : "leaf" }.

SedNL est sous licence ZLib, ce qui autorise une utilisation commerciale / closed source, sans obligation de redistribution de la licence avec les binaires. Elle autorise aussi la modification de la bibliothĂšque pour l’intĂ©grer Ă  vos projets, sans obligation de publier vos modifications. Il n’y a pas non plus de comportement viral comme celui de la GPL : la licence est donc compatible avec la plupart des autres licences.

De nombreux jeux utilisent un systĂšme d’évĂšnements pour leur mode rĂ©seau. Par exemple, voici la documentation d’un SDK de Valve qui fournit un mĂ©canisme d’évĂšnements.

L’API de SedNL a Ă©tĂ© conçue pour ĂȘtre simple, concise, et rapide Ă  apprendre (moins d’un quart d’heure pour un dĂ©veloppeur expĂ©rimentĂ©). Elle convient parfaitement tant Ă  des projets d’envergure moyenne que des projets de taille plus consĂ©quente.

Un court exemple d’utilisation du mĂ©canisme d’évĂšnement cotĂ© serveur :

#include <SEDNL/sednl.hpp>

using namespace SedNL;

void on_disconnect(Connection&);
void on_connect(Connection&);
void on_event(Connection&, const Event&);

TCPServer server(SocketAddress(4242));
EventListener listener(server);
listener.on_connect().set_function(on_connect);

EventConsumer consumer(listener);
consumer.on_disconnect().set_function(on_disconnect);
consumer.bind("login").set_function(on_login);

listener.run();
consumer.run();

DĂ©terminer la bibliothĂšque la plus adaptĂ©e Ă  votre projet est une Ă©tape critique : un mauvais choix se rĂ©percutera plusieurs mois plus tard par un coĂ»t important, nĂ©cessitant souvent le rĂ©-usinage(refactoring) d’une quantitĂ© importante de code, et donc une Ă©norme perte de temps (sans compter que c’est l’occasion rĂȘvĂ©e pour de nombreux bugs qui voudraient Ă©lire domicile dans votre code). C’est pourquoi la documentation vous met tout de suite en face de l’architecture type assumĂ©e par SedNL : Une communication via des Ă©vĂšnements, procĂ©dĂ©s de maniĂšre asynchrone, avec la garantie que l’évĂšnement connected sera le premier exĂ©cutĂ© Ă  la connexion d’un client. À partir de cet instant, aucun ordre dans l’appel de vos callback pour les Ă©vĂšnements provenant d’un mĂȘme utilisateur ne peut ĂȘtre supposĂ©. En contrepartie, vous pouvez contrĂŽler quels threads vous allouez Ă  quels Ă©vĂšnements.

SedNL fournis aussi des outils légers pour sérialiser et envoyer de façon fiable les instances de vos classes.

Philosophie particuliĂšre de cette bibliothĂšque : la rĂšgle est que mĂȘme dans des conditions difficiles (plus de mĂ©moire disponible, limite de connections ouvertes, exceptions levĂ©es par vos callback, dysfonctionnement du systĂšme dans la gestion des threads, 
) la bibliothĂšque doit faire tout ce qui est possible pour conserver un comportement normal. Toutes les exceptions “std::bad_alloc” sont interceptĂ©es et traitĂ©es intelligemment afin de prĂ©venir un malencontreux crash. En cas de file d’évĂšnements pleine ou d’un manque de mĂ©moire, les Ă©vĂšnements sont temporairement ignorĂ©s. Cela vous permet de ne pas perdre les donnĂ©es de vos utilisateurs encore en mĂ©moire, et de construire des applications serveur fiables Ă  uptime Ă©levĂ©. C’est, selon moi, ce que l’on doit attendre de toute vraie bibliothĂšque rĂ©seau.

Il est possible que suite Ă  certaines contraintes techniques SedNL ne soit pas la bibliothĂšque la plus adaptĂ©e Ă  votre projet. Une lecture rapide de la documentation devrait vous permettre de savoir si SedNL est adaptĂ© Ă  votre projet, ou si vous devez prĂ©fĂ©rer une autre bibliothĂšque. Par exemple, SedNL n’est pas du tout adapter Ă  de la RCP. MĂȘme si le mĂ©canisme d’évĂšnement est ce que vous recherchez, d’autres alternative C basĂ© aussi sur un mĂ©canisme d’évĂšnement comme libev / libevent offrent un contrĂŽle plus fin, au coĂ»t d’une API plus complexe et moins intuitive. Gardez aussi Ă  l’esprit que le design encouragĂ© par SedNL devrait s’adapter Ă  de nombreuses bibliothĂšques fournissant un mĂ©canisme d’évĂšnement, et que la licence autorise diverses modifications pour des besoins spĂ©cifiques.