Pages : 1
#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
Pages : 1