Caneva de serveur multithread utilisant csocket

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 219 fois - Téléchargée 25 fois

Contenu du snippet

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 / Exemple :


#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 ;-)

A voir également

Ajouter un commentaire

Commentaires

djmoa
Messages postés
39
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
27 mai 2009
-
j'avais oublié de signaler, mais depuis mi novembre 2007 le mutex qui manquait est rajouté.
cs_bouba75
Messages postés
2
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
10 avril 2007
-
Merci je vais regarder ça!!!
djmoa
Messages postés
39
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
27 mai 2009
-
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 ?
cs_bouba75
Messages postés
2
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
10 avril 2007
-
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
djmoa
Messages postés
39
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
27 mai 2009
-
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>coucou</html>";
Wsocket->write(var,sizeof(var));

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.