begin process at 2012 05 28 08:46:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Client/Serveur avec thread sous linux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Client/Serveur avec thread sous linux

dimanche 18 janvier 2004 à 17:08:56 | Client/Serveur avec thread sous linux

frater_sinister

J'ai un prblm avec ce programme. Avant tout le but de ce code: le client envoit un fichier au serveur, ce dernier renvoit le nombre de lignes/mots/lettres dans le fichier. Le prblm se situe au niveau des thread je pense. Dès la première connexion, le serveur créé un thread et effectue son calcul et des que le thread quitte, la fonction se termine alors qu elle devrai rester grace à la boucle infinie en attente de nouveaux clients.

Code serveur:
// serveur.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<pthread.h>

pthread_t thread;
pthread_attr_t attr;

struct sockaddr_in addr_c,addr_s,temp;

void *countLine(int sock_service) {
char c, buf[100];
int nb_mots = 0;
int nb_lignes = 0;
int nb_lettres = 0;

while(read(sock_service,&c,1) == 1){
if((c== '\\t')||(c==' '))
nb_mots++;
if(c=='\\n')
nb_lignes++;
else
nb_lettres++;
}


sprintf(buf,"ligne = %d, mots = %d, lettres = %d\\n",nb_lignes,nb_mots,nb_lettres);
//printf("%s",buf);
write(sock_service,buf,strlen(buf));

pthread_exit(NULL);
}


int main(int argc,char** argv){
int port, ecoute, connexion;
int lg_adr = sizeof(struct sockaddr_in);
int sock,sock_service,x;
char c;

/* on teste le nombre d'argument */
if(argc != 2){
perror("le nombre d'argument de %s doit etre egal a 2\\n");
exit(1);
}

//if (fork() != 0) exit(0); //démon
//setsid(); //session

/* création et attachement de la socket d'ecoute */

if( (sock = socket(AF_INET,SOCK_STREAM,0) ) <0 ){
perror("erreur creation de socket\\n");
exit(2);
}

addr_s.sin_port = htons(atoi(argv[1]));
addr_s.sin_addr.s_addr = htonl(INADDR_ANY);
addr_s.sin_family = AF_INET;
if( bind(sock,(struct sockaddr*)&addr_s,sizeof(struct sockaddr_in)) != 0){
perror("erreur bind()\\n");
exit(3);
}

/* on accepte une seule connexion */
listen(sock,5);

for(;;){
/* attente de connexion d'un client */
sock_service = accept(sock,(struct sockaddr*)&addr_c,&x);
/* Affichage des informations sur le client*/
printf("un client connecté en local sur le port %d\\n",ntohs(addr_c.sin_port) );

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

if((pthread_create(&thread,&attr,countLine(sock_service),NULL)) != 0)
break;
close(sock_service);
}

close(sock);
return(0);
}


Code client:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>

int main(int argc,char** argv){
FILE *f;
char *buf, buf2;
int nb_caractere, i;
struct hostent *hp;
struct sockaddr_in addr_c,addr_s,temp;
int sock,x;

if(argc != 4){
perror("le nombre d'argument de %s doit etre egal a 2\\n");
exit(1);
}

/* Creation socket client */
if( (sock = socket(AF_INET,SOCK_STREAM,0) ) <0 ){
perror("erreur creation de socket\\n");
exit(2);
}

/* Attachement socket client */
addr_c.sin_port = htons(0);
addr_c.sin_family = AF_INET;
addr_c.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(sock,(struct sockaddr*)&addr_c,sizeof(struct sockaddr_in)) != 0){
perror("erreur bind()\\n");
exit(3);
}

/* Recuperation d'information sur le client*/
getsockname(sock,(struct sockaddr*)&temp,&x);
printf("client sur le port %d \\n",ntohs(temp.sin_port) );

/* Recuperation des informations sur le serveur */
hp = gethostbyname(argv[1]);
addr_s.sin_port = htons(atoi(argv[2]));
bcopy( (char*)hp->h_addr, (char*)&addr_s.sin_addr.s_addr, hp->h_length);

addr_s.sin_family = AF_INET;

printf("nom officiel du serveur %s\\n",hp->h_name);

/* connection au serveur */

connect(sock,(struct sockaddr*)&addr_s,sizeof(struct sockaddr_in));


if((buf = (char *) calloc(256, sizeof(char))) == NULL)
perror("erreur d'allocation memoire\\n");

/* envoie du message au serveur */
f = fopen(argv[3],"r");

while((nb_caractere = fread(buf,1,256,f))!= 0)
write(sock,buf,nb_caractere);

if(shutdown(sock, SHUT_WR) == -1)
perror("shutdown en ecriture");

while(read(sock,&buf2,1) == 1){
printf("%c",buf2);
}
printf("\\n");

fclose(f);
close(sock);

return 0;
}


Merci beaucoup à ceux qui prennent un peu de leur temps pour m'aider
mardi 24 février 2004 à 10:57:53 | Re : Client/Serveur avec thread sous linux

fll

Membre Club

Salut !

Je suppose que ton client ne doit pas recevoir grand chose comme réponse. Si oui, alors c'est que tu as de la chance.

Dans les lignes suivantes, tu crées ton thread et tu le détruis immédiatement !!!

if((pthread_create(&thread,&attr,countLine
(sock_service),NULL)) != 0)
break;
close(sock_service);

Ton serveur se plante parce que tu essaies de lire/écrire sur un socket qui n'est plus valide.
Explication :
Tu devrais détruire ton socket à la sortie du thread (après avoir reçu un accusé de réception de ton client, sonon plantage du client).



Cette discussion est classée dans : int, include, sock, nb, addr


Répondre à ce message

Sujets en rapport avec ce message

telechargement d'un fichier sur internet [ par fredleconte ] Salut, Voila j'essaie de telecharger un fichier http mais je ne sais pas comment recevoir le fichier help please. voici le programme: // Download d'u socket trop lents [ par cid7777777 ] bonjour,jessaye de faire un jeu qui peu se jouera 2 en reseau local.je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver socket raw [ par moi zork ] Bonjour,Je suis entrain de m'entrainer sur les socket raw et je bute sur :#include #include using namespace std;int main (void){    int sock;  sock = multicast en c sous windows [ par tenrod ] Bonsoir a tous,voila j'ai un petit (voire un gros) pb avec le développement d'une application me permettant de faire du multicast en c sous windows.J' Unix: sockets & Co [ par bounkolh ] Bonjour, Je cherche de l'aide pour compléter les ............ du fichier client.c permettant d'interroger le serveur implementé par server.c. Listing boucles et boites de dialogues [ par grems ] salut !Mon appli est censée détecter quand des nouveaux *.hd arrivent dans un dossier . Lorsque ca arrive, une boite de dialogue s'ouvre et une musiqu Multiples messages non reçus...:(( [ par Gendal67 ] Bonsoir tout le monde!Je suis actuellement en cours d'apprentissage des Sockets et j'ai crée une application Client/Server pouvant communiquer ensembl Prob avec les sockets [ par Sload ] Bonjour à tous ! Voila mon probleme , j'essaye de develloper un logiciel client/serveur. Je n'en suis qu'au tout début et j'ai déja un probleme lol ! pb communication socket [ par skyman272 ] bonjourvoici un petit programme client/serveur pour un projet à l'insa (sous linux).Le programme client envoi un message au programme serveur qui lui Probleme de recursivite [ par Anysse ] Salut, je n arrive pas a comprendre le pourquoi de ce que le programme suivant renvoie : #include #include #include void recur (int, int);</FO


Nos sponsors


Sondage...

Comparez les prix

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,499 sec (3)

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