begin process at 2012 05 27 19:15:10
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SERVEUR MULTITHREAD [LINUX/WIN]

SERVEUR MULTITHREAD [LINUX/WIN]


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :server, multithread, policy, flash, socket Niveau :Débutant Date de création :31/10/2011 Date de mise à jour :02/11/2011 11:38:53 Vu / téléchargé :2 132 / 88

Auteur : nipepsinicolas

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Voici un "policy server" pour les applications flash, c'est un bon exemple pour montrer le fonctionnement de ma classe serveur.
Si vous avez des soucis / remarques / corrections n'hésitez pas a commenter :)

Source

  • /*
  • * Voici une doc rapide:
  • * Le constructeur du serveur:
  • */
  • Server<MaClass héritée de ServerClient>(); (on peut choisir le port et l'host dans le constructeur Server<X>(host, port))
  • bool setPort(int port);
  • bool setAddress(const char *addr); //setPort & setAddress sont a utiliser avant l'initialisation du serveur.
  • bool init(); //initialise le serveur, return true en cas de succès, false si erreur.
  • bool start(); //start le serveur
  • //J'ai pas encore dev le stop, donc les clients ne sont pas suppr du tableau de clients lorsqu'on l'appelle.
  • bool kickClient(unsigned int cid); //kick le client a l'id cid
  • /**
  • * Pour la classe ServerClient:
  • **/
  • virtual bool accept(SOCKADDR_IN sin); //retourner true si la connexion avec le client est acceptée. Cette fonction n'est pas executée dans le thread du client.
  • virtual bool startListening(); // Fonction executée dans le thread. lorsque cette fonction s&#8217;arrête le thread meurt et le client se déconnecte.
  • //propriétés:
  • unsigned int id; //id du client
  • Socket *sock; //classe du socket client
  • Server *pServer; //pointeur vers la classe du serveur
  • //Il faut aussi dev une meilleur gestion des id clients, puisque pour l'instant c'est vite fait a coup de +1, mais bon on a le temps avant de faire le tour de l'unsigned int.
  • /**
  • * Pour la classe Socket:
  • **/
  • int Recv(char * buff, int size, int flag = 0);
  • int Send(const char *txt, int size);
  • char *getIp();
/*
* Voici une doc rapide:
* Le constructeur du serveur:
*/
Server<MaClass héritée de ServerClient>(); (on peut choisir le port et l'host dans le constructeur Server<X>(host, port))

bool setPort(int port);
bool setAddress(const char *addr); //setPort & setAddress sont a utiliser avant l'initialisation du serveur.

bool init(); //initialise le serveur, return true en cas de succès, false si erreur.
bool start(); //start le serveur

//J'ai pas encore dev le stop, donc les clients ne sont pas suppr du tableau de clients lorsqu'on l'appelle.

bool kickClient(unsigned int cid); //kick le client a l'id cid

/**
* Pour la classe ServerClient:
**/
virtual bool accept(SOCKADDR_IN sin); //retourner true si la connexion avec le client est acceptée. Cette fonction n'est pas executée dans le thread du client.
virtual bool startListening(); // Fonction executée dans le thread. lorsque cette fonction s&#8217;arrête le thread meurt et le client se déconnecte.

//propriétés:
unsigned int id; //id du client
Socket *sock; //classe du socket client
Server *pServer; //pointeur vers la classe du serveur

//Il faut aussi dev une meilleur gestion des id clients, puisque pour l'instant c'est vite fait a coup de +1, mais bon on a le temps avant de faire le tour de l'unsigned int.

/**
* Pour la classe Socket:
**/
int Recv(char * buff, int size, int flag = 0);
int Send(const char *txt, int size);
char *getIp();




 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

31 octobre 2011 04:27:32 :
textes
02 novembre 2011 11:37:10 :
Ajout de l'exe
02 novembre 2011 11:38:53 :
Ajout de l'exe

 Sources du même auteur

Source avec Zip [C++][W IN]LIBRAIRIE HTTP
Source avec Zip CONVERTIR FLV 2 MP3

 Sources de la même categorie

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SOCKET CPP par baptchr55
Source avec Zip [MICROSOFT] SERVEUR TELNET SIMPLE par psyjc
CANEVA DE SERVEUR MULTITHREAD UTILISANT CSOCKET par djmoa

Commentaires et avis

Commentaire de MinisJeux le 31/10/2011 15:33:19

Bonjour,

Sa m'a l'air bien tout ça mais peut-tu mettre un fichier .exe, je n'ai pas pus tester pour le moment.

Commentaire de nipepsinicolas le 02/11/2011 11:40:33

Voila il faut renommer le .ex_ en .exe dans le dossier Release

Commentaire de lynxtyle le 02/11/2011 15:10:28

Bonjour,
J'ai quelques remarques que j'espère constructive malgré que j'avoue d'office que je n'ai pas regardé plus que le morceau de code présenté ci-dessus mais qui me fait remarquer certaines choses qui te bloque surement un peu :

tout d'abord pourquoi un init() avant le start() ? car normalement le start() doit aussi contenir beaucoup de contrôle donc faire une fonction qui teste le démarrage avant de démarrer c'est peut être un peu trop ? (risque de teste en doublon, problème d'héritage...)

ensuite pourquoi différenties tu tes connexions de tes thread ? la logique classic dans ce jors de cas est d'avoir (au moins) un thread en écoute qui va créer de suite un thread pour tout nouveau client... id client devient alors l'id du thread qui est géré par le système (donc plus de pb de gestion client hasardeuse)... puis après coup tu peux faire tout les traitements que tu veux sur ton nouveau client (traiter, kicker, mettre en attente, déconnecter, etc...). Ta limite devient alors le nombre max de thread que supporte ton système (et prévoir les déconnexion forcé par le client).

Comme indiqué je n'ai pas regardé la source et ne connais donc pas tes contraintes. J'espère donc ne pas être trop à coté de la plaque avec ces remarques que j'espère constructives.

Commentaire de MinisJeux le 04/11/2011 22:27:20

Bonsoir,

J'ai vus le code sa m'a l'air pas mal, j'ai aussi pus tester l'application mais pas avec le .exe que tu m'as donnés sa a bugger, le seul problème c'est que je n'ai pas pus modifier le Port, j'ai changer le port par défaut mais lorsque je lance l'application, j'obtiens toujours la même chose, le Port 863 je crois...

Commentaire de lynxtyle le 05/11/2011 00:13:29

Pour l'occasion j'ai survolé rapidement le code histoire de voir d'où pourrait venir le problème de MINISJEUX... @MINISJEUX qu'est-ce que tu appel "avoir la même chose" ?

Ensuite je reviens sur mon message précédent :
il y a bien un petit "défaut". Tu créé un client, tu le teste et enfin tu lui attribus un thread... tu te créé donc 2 "soucis". En fesant des traitements sur le client avant de l'avoir mis dans un thread tu garde en attente le thread principale d'écoute, le résultat est donc que ton serveur se retrouve surchargé très vite. Le second problème de créer aussi tard ton thread est que t'es obligé de créer une id client avant le thread (alors qui est beaucoup plus interessant d'utiliser l'id thread pour traiter tes clients).

Je te donne 2 conseils : le premier est déjà de créer ton écoute dans un thread (pourquoi? simplement pour pouvoir au démarrage de ton serveur avoir plusieurs écoutes pour pouvoir accueil un maximum de client en simultané... par exemple la configuration par défaut de apache est de 5 thread d'écoute).
le second est que dès qu'un client se connect tu le met directement dans un thread avant tout traitement... et par la suite par exemple pour kicker un client il te suffit alors de récuprér l'id de son thread en les listant (les threads clients s'appeleront tous par exemple ThreadClient, mais il suffit au passage de lister d'autres variables contenues dans ces threads comme les ip, port etc...).

Enfin je crois que lorsque tu kick tes clients tu ne le fait pas proprement : je ne crois pas avoir vu la fermeture du port avant la fermeture du thread... (pareil ça ne pose pas trop de problème sur un test... mais en cas d'utilisation plus professionnelle ça risque de poser plus de problème)

Voilà... donc encore une fois j'ai juste survolé et j'ai peut-être loupé des trucs... en tout cas c'est plutot bien codé, c'est juste des petits soucis de conception (ton serveur fonctionne mais ne sera pas assé robuste pour jouer son rôle de serveur en cas d'utilisation intensive).

Si t'as besoin de plus d'infos n'hésite pas ;)

Commentaire de MinisJeux le 05/11/2011 01:32:24

Bonsoir à toi LYNXTYLE,

Je parlais du Port, je ne parviens pas à le modifier.

Commentaire de lynxtyle le 05/11/2011 06:23:48

@MINISJEUX tu modifis bien les paramètres dans le policy.xml ?

Commentaire de nipepsinicolas le 05/11/2011 10:31:19

Salut LYNXTYLE, merci pour tes remarques, effectivement utiliser l'id du thread n'est pas idiot du tout!
Je ferais les modifs en suivant tes remarques quand j'en aurais le temps.

Sinon pour la fermeture du socket ca se passe dans le destructeur de ma classe Socket, donc ca se fait automatiquement si c'est proprement nettoyé.

@MinisJeux tu peux modifier le port dans le constructeur de FlashPolicy. Tu modifies mon new FlashPolicy<PolicyClient>("0.0.0.0") par new FlashPolicy<PolicyClient>("0.0.0.0", port)
Ou tu peux faire après un ->setPort(port) ou bien changer le DEFAULT_POLICY_PORT dans FlashPolicy.h :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

DEMANDE AIDE: aide sur socket, server proxy et spoof [ par retaks666 ] je voudrai savoir si en etudaint les sockets, je pourrai creer un serveur proxy ki renvoie une fausse ip, par exemple cela pourrai servir de spoofer s Socket et multithreading .. [ par MoDDiB ] Une ame charitable pourrait-elle faire une source ou le client tout comme le server puisse traiter des info normalment tout en pouvant en meme temps r client smtp probleme [ par lombredudragon ] Voila j'ai trouver un joli code sur le web. J'ai fait le menage et j'ai supprimer l'interface graphique.Donc mon but final c'est d'envoyer un fichier PB compilation de socket [ par dhylde ] Bonjour a tous, j'ai un petit souci de compilation (j'ai du manqu&#233; l'inclusion d'une Librairy). Bref je me prend la tete depuis ce matin. Je suis client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio socket [ par lilington ] j'ai fait une application ou 2 client se connect &#224; un server&nbsp;. j'ai&nbsp; 3 machine :la A server B et C sont clientles 2 clients se connecte mail avec pièce jointe [ par victorcoasne ] Voilà j'ai trouvé dans une source le code que j'ai un peu modifié pour dev-c++ et je voudrais savoir ce qu'il faut rajoutter pour une pièce jointe.#in Etat Socket Linux [ par cybermax62 ] Existe-t-il un moyen de conna&#238;tre sur un server (socket,C) l'&#233;tat d'un connection client (socket,C) utilisant le protocole SOCK_STREAM ? Act Pouvez-vous m'aider? [ par logant83 ] Bonsoir, voila j'aimerai savoir si il est possible grace au socket de C de faire une connexion vers un server (Faire un link) exemple avant quand jt s Problème de socket HELP ! [ par founiac ] salut a tous , je me presente , c moi le roi des newbs et je tente par tous les moyens de voir pourquoije choppe ca:E:WSARecv failed WSAENOTCONN (1005


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales