Caneva de serveur multithread utilisant csocket

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

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.