begin process at 2012 05 27 14:11:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > CANEVA DE SERVEUR MULTITHREAD UTILISANT CSOCKET

CANEVA DE SERVEUR MULTITHREAD UTILISANT CSOCKET


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :csocket, socket, multithread, serveur, mutex Niveau :Débutant Date de création :05/07/2006 Date de mise à jour :26/09/2009 11:56:58 Vu :11 570

Auteur : djmoa

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

 Description

Base simple et efficasse pour un serveur multithread utilisant la CSocket ( socket MFC ). L'avantage de faire du multithreading est de pouvoir accueillir plusieurs clients en meme temps sur le serveur, et ainsi de ne plus etre blocant.
Le principe est simple, et deja vu, mais ce n'est qu'apres un moment de recherches que j'ai compri le principe du attach et detach. Sans ces fonctions, on peut passer un pointeur sur la socket de travail, mais la fermeture de cette derniere se fera mal (message d'erreur)...
En esperant qu'il vous serve!

Fonctionne sous visual 6, mode console application intégrant les MFC, peut evidement être utilisé en graphique

Je me suis servi de ce morceau de code pour commencer un petit serveur de pages web, et aussi pour faire un peu de tunneling http ...

Il doit aussi y avoir possibilité de faire dériver une classe de CThread et CSocket pour avoir un resultat similaire

Merci pour toute remarque

Source

  • #include "afxsock.h"
  • #include "afxmt.h"
  • #define PORT 80
  • CMutex mutex; //declaration du mutex
  • UINT travail(LPVOID sock);
  • void main(){ //thread principal (écoute)
  • AfxSocketInit(); //initialisation des sockets
  • CSocket *Lsocket=new CSocket; //socket d'ecoute
  • CSocket *Wsocket=new CSocket; //socket de travail
  • SOCKET handle; //handle de socket, pour le passage a l'autre thread
  • Lsocket->Create(PORT,SOCK_STREAM); //creation de a socket TCP (pour UDP: SOCK_DGRAM)
  • Lsocket->Listen(); //mise de la socket en mode écoute (pas mode réception)
  • while(1){
  • mutex.Lock(); //prend le mutex
  • Lsocket->Accept(*Wsocket); //Redirige la connection entrante sur la socket de travail
  • handle=Wsocket->Detach(); //recupere les parametres de la socket de travail
  • AfxBeginThread(travail,(LPVOID)&handle);//lance la fonction travail comme nouveau thread, avec parametre de socket
  • }
  • }
  • UINT travail(LPVOID sock){ //thread de travail
  • CSocket *Wsocket=new CSocket; //socket de travail
  • Wsocket->Attach(*(SOCKET*)sock); //parametrage de la nouvelle socket de travail
  • mutex.Unlock(); //rend le mutex, permet de recevoir la connection suivante
  • //ici vous mettez votre code pour chaque connection ...
  • // Wsocket->Receive( ...... );
  • Wsocket->Close();
  • delete Wsocket;
  • return 1;
  • }
#include "afxsock.h"
#include "afxmt.h"
#define PORT 80
CMutex mutex;		//declaration du mutex


UINT travail(LPVOID sock);
void main(){			//thread principal (écoute)
	AfxSocketInit();			//initialisation des sockets
	CSocket *Lsocket=new CSocket;		//socket d'ecoute
	CSocket *Wsocket=new CSocket;		//socket de travail
	SOCKET handle;				//handle de socket, pour le passage a l'autre thread
	Lsocket->Create(PORT,SOCK_STREAM);	//creation de a socket TCP	(pour UDP: SOCK_DGRAM)
	Lsocket->Listen();			//mise de la socket en mode écoute (pas mode réception)
	
	while(1){
        mutex.Lock();					//prend le mutex
		Lsocket->Accept(*Wsocket);		//Redirige la connection entrante sur la socket de travail
 		handle=Wsocket->Detach();		//recupere les parametres de la socket de travail
		AfxBeginThread(travail,(LPVOID)&handle);//lance la fonction travail comme nouveau thread, avec parametre de socket
	}
}
UINT travail(LPVOID sock){		//thread de travail
	CSocket *Wsocket=new CSocket;		//socket de travail
	Wsocket->Attach(*(SOCKET*)sock);	//parametrage de la nouvelle socket de travail
        mutex.Unlock();				//rend le mutex, permet de recevoir la connection suivante
//ici vous mettez votre code pour  chaque connection ...
//	Wsocket->Receive( ......  );
	Wsocket->Close();			
	delete Wsocket;
	return 1;
}

 Conclusion

essayez de faire une écriture sur la socket de "HTTP/1.1 200 OK\r\nContent-length: 32\r\nConnection: close\r\n\r\n<html><body>coucou</body></html>", et vous aurez un mini serveur web vraiment tres statique ;-)



 Historique

05 octobre 2007 09:54:18 :
J ai rajouté en commentaire la ou il faut mettre le mutex. il faut que j ecrive le code exact a l occasion. Si vous laissez le code tel quel, ca fonctionne mais si vous aveez des connections massives simultanées, ca fini par planter (en mode bourin ca buggait au bout de 100 a 1000 connections )
14 novembre 2007 17:48:47 :
Ajout du mutex, car lorsce que les demandes de connections étaient trop rapides, une des socket de travail était écrasée, 2 thread essayaient de travailller sur la meme connection
01 avril 2008 15:21:02 :
changement léger de descritpion
26 septembre 2009 11:56:58 :
mise à jour de la réponse pour un serveur web (conclusion)

 Sources du même auteur

Source avec Zip ECRAN LCD 16*4 CHARACTERES (COMPATIBLE 20*4,16*2, ETC...)

 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 SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

 Sources en rapport avec celle ci

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip MINICHAT MULTI-CLIENT par wisar
Source avec Zip Source avec une capture CLIENT/SERVEUR UTILISANT LES IOCP RÉALISÉ AVEC BORLAND BUILD... par goodboy21
Source avec Zip SERVEUR/CLIENT LINUX par ghost4

Commentaires et avis

Commentaire de katsankat le 08/07/2006 17:56:54

Salut :)
Est-ce que la limite est de 64 clients par thread?
Tout ce qui est sur le port 80 n'est pas forcément 'web'.

Commentaire de djmoa le 10/07/2006 10:04:39

Le programme crée 1 thread par client. donc, normalement il ne noit pas y avoir de limite au noveau du nombre de thread instanciés. Je suis bien au courant que le numéro d'un port n'oblige en rien sur le type de programme qui ecoute derriere;..
Cet exemple fonctionne pour tout type de serveur, tu peut t'en servire de base pour FTP, messagerie, HTTP ... enfin tu sais deja ca !
l exemple avec le serveur web est celui le plus facil a tester car tout le monde a un navigateur...

pour le testm faites char var[]="HTTP/1.1 200 OK\r\n\r\n<html><body>coucou</body></html>";
Wsocket->write(var,sizeof(var));

Commentaire de bouba75 le 05/04/2007 16:47:51

Salut j'ai le même probléme que t'avais,
moi je développe dans un environnement C# et je ne peux pas déclarer de pointeur
sur un socket car il est de type managé( aprés compilation).
Je comprends bien ta méthode et je cherche un équivalent en C#
Merci

Commentaire de djmoa le 06/04/2007 17:34:20

Salut. Désolé, mais pour le C#, c'est as encore mon outil de travail ;)
Au fait, il y a une petite erreure dans le source... il fonctionne bien mais ... il manque un mutex:

le rajouter un variable globale,
le prendre apres le "detach", et le rendre apres le attach...
Je modifierai la source un de ces 4 ...

pour le C#, tu pourrais pas mettre ce code dans une DLL et l'implémenter depuis ton prog ?

Commentaire de bouba75 le 10/04/2007 10:00:03

Merci je vais regarder ça!!!

Commentaire de djmoa le 01/04/2008 13:41:35

j'avais oublié de signaler, mais depuis mi novembre 2007 le mutex qui manquait est rajouté.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Serveur Vc++6 pb dans recv [ par alfred ] Salut a tousJ'ai un probleme dans mon serveur et je ne sais pas comment le resoudre. Le client se connecte bien et envoie le bon nombre de caracteres encore mon serveur [ par skysee ] bonjour,je suis toujours avec mon serveur en c sous visual c++ sous windows(sis eulement j'avais linux).Le problème est que je n'ai pas d'erreur de co Réception de données sur socket. [ par julien20vt ] Bonjour,J'ai un doute concernant l'utilisation de sockets.Si coté serveur j'utilise un buffer de taille X pour lire sur ma socket, ce serveur reste en sockets: méthode accept() [ par julien20vt ] Voila,je viens de coder le serveur de ma socket et ce qui me parait etrange c'est que la méthode accept() n'est pas bloquante, je pensais que le serve MFC CSocket et simple SOCKET, quelle différence ? [ par julien20vt ] Voila mon problème,J'ai remarqué que lorsque j'utilise la classe CSocket, l'envoi d'un paquet est limité en taille (environ 17 Ko) alors que lorsque j Problème d'envoie par socket [ par CyberP ] J'ai fait un programme qui se connecte à un serveur ftp (le serveur ftp est aussi sur mon ordi). Je me connecte avec la fonction connect() et je recoi socket et fichiers textes : HELP !! [ par ben01n ] Salut tout le monde !je prog actuellement un client serveur en udp multicast sous linux (voir source sur ce site) et j'aimerais que mon serveur envoi Tutorial - Socket, serveur, client BCPP + GUI [ par NyxArm ] Bonjours tout le monde, je suis présentement en période d'appretissage du language CPP sur Borland(v.6). Maintenant que j'ai acquis quelque conna pb connetion reseau multiutilisateurs [ par JRB ] lorsque l'on veut creer une connection reseau ou plusieurs clients peuvent se connecter sur le meme serveur, est ce que le serveur doit creer un socke Evènement sur un socket client [ par darsh99 ] J'aimerais savoir si la méthode utilisée par BlackGoddess pour son serveur (http://www.cppfrance.com/article.aspx?ID=1287) est récupérable pour gérer


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,827 sec (4)

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