Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/05/2010, à 19:12

tom05

Client serveur C++

Bonjour à tous,

Je suis actuellement sur la conception d'un client/serveur en c++, dans le cadre d'un projet.
J'ai déja créer une base serveur dont voici le code:

//Compilation : g++ -Wall sockserv.cpp -o serveur



#include <iostream>



#include <cstdlib>

#include <unistd.h>

#include <cstring>



//pour les sockets

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>



//pour les threads

#include <pthread.h>



//pour les fonctions mathematiques

#include <cmath>



#define BACKLOG 2

#define MAXDATASIZE 100



using namespace std;

class serveur {

	private:

		int fd;

		struct sockaddr_in sockserver;

	public:

		serveur(int);

		~serveur(void);

		int attente(void);

		int emission(const int, const char *);

		int reception(const int, char * _buf);

		void deconnexion(const int);

};



serveur::serveur(int _p=3550) {

	sockserver.sin_family = AF_INET;

	sockserver.sin_port = htons(_p);

	sockserver.sin_addr.s_addr = INADDR_ANY;

	bzero(&(sockserver.sin_zero),8);

	

	//Creation d'un socket

	if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {

		cerr << "Serveur : erreur creation socket()" << endl;

		exit(-1);

	}



	//liaison (bind) avec le serveur

	if(bind(fd,(struct sockaddr*)&sockserver,sizeof(struct sockaddr)) == -1) {

		cerr << "Serveur : erreur bind()" << endl;

		exit(-1);

	}



	//mise sur écoute

	if(listen(fd,BACKLOG) == -1) {

		cerr << "Serveur : erreur listen()" << endl;

		exit(-1);

	}

	

}



int serveur::reception(const int _fd, char * _buf) {

int numbytes;



	if ((numbytes = recv(_fd,_buf,MAXDATASIZE,0)) == -1) {

		cerr << "Serveur : erreur recv()" << endl;

		exit(-1);

		}

	_buf[numbytes] = '\0';

	cout << "Client : message du serveur : " << _buf << endl;

return numbytes;

}



int serveur::attente(void) {

socklen_t sin_size;

int  fd_temp;

struct sockaddr_in client;





sin_size = sizeof(struct sockaddr_in);



	if ((fd_temp = accept(fd,(struct sockaddr *)&client,&sin_size)) == -1){

		cerr << "Serveur : erreur accept()" << endl;

		exit(-1);

	}

	cout << "Serveur : connexion de " << inet_ntoa(client.sin_addr) << endl;

return fd_temp;

}



void serveur::deconnexion(const int _fd) {

	close(_fd);

}



int serveur::emission(const int _fd, const char* _s) {

int r;

	

	r = send(_fd, (void *) _s, (size_t) strlen(_s), 0);

	return r;

}



serveur::~serveur(void) {

	close(fd);

}


int main(void)

{

	
char buffer[200];
	serveur monserveur;


        int fd_client;
        int fd_client2;
			

		fd_client = monserveur.attente();

		monserveur.emission(fd_client, "Bonjour et bievenue sur le serveur");

		monserveur.emission(fd_client, "En attente d'autres joueurs");



		fd_client2 = monserveur.attente();

		monserveur.emission(fd_client2, "Bonjour et bienvenue sur le serveur");




		monserveur.reception(fd_client, buffer);

		monserveur.deconnexion(fd_client);*/



	return EXIT_SUCCESS;

}

Ce code permet la connexion entre un server et deux clients.
Mais maintenant je bloque sur un point : j'aimerais créer un thread à chaque connexion de client(un thread par client).
Comment faire ?

Merci de votre aide,
Thomas

Hors ligne

#2 Le 31/05/2010, à 20:29

TatrefThekiller

Re : Client serveur C++

Indice : faire un tableau (ou une liste) de thread.
À chaque connexion d'un client, tu créé un nouveau thread que tu ajoute à la liste.

Hors ligne

#3 Le 31/05/2010, à 21:36

omc

Re : Client serveur C++

Bonjour,
Désolé, je vais faire le casse c... mais boost::asio est "ton ami" pour les applis client/serveur.
C'est une librairie d'un peu plus haut niveau et surtout c'est multi-plateforme.
La doc : http://www.boost.org/doc/libs/1_43_0/do … _asio.html
Un tuto en français : http://gwenael-dunand.developpez.com/tu … oost/asio/

Hors ligne

#4 Le 01/06/2010, à 18:01

tom05

Re : Client serveur C++

Merci de vos réponses donc j'aimerais adopter la méthode de TatrefThekiller (DSL omc mais ta méthode me parrait  bien trop compliqué pour moi :s)

Cependant je ne vois pas comment faire : il faut un premier thread qui écoute, dés qu'il y a une connexion le serveur cré un nouveau thread attaché au client....

Pouvez-vous m'aiguiller de ce côté la,
Merci,
Thomas

Hors ligne

#5 Le 02/06/2010, à 13:07

tom05

Re : Client serveur C++

Personne ne peut me donner un petit tuto ou un exemple ?

Hors ligne