Problème de transmission d'entier d'un client à un serveur

Signaler
Messages postés
18
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
6 mai 2006
-
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
-
Bonjour,

nous devons faire une bataille navale en réseau et nous avons un problème de transmission d'entiers.

En fait on envoit des valeurs correctes à notre client mais celui-ci
recoit n'importe quoi, et nous ne comprenons pas d'ou vient l'erreur:

voici notre code

Merci d'avance pour vos réponses



SERVEUR

#include

#include



#include

#include

#include

#include

#include

#include

#include



#include "socket.h"

#include "transmission.h"

#include "bateau.h"





#define NJ 2 //nombre de joueurs







typedef struct

{

int com;

char nom_joueur[30];

int grille[10][10];



} CLIENT;











void * initialisation_joueur(void* voidparam)


{





CLIENT *client=(CLIENT*) voidparam;

char sms0[80]="Bienvenue ";

int i;




reception_chaine(client->com,client->nom_joueur,30);


int compte=strlen(client->nom_joueur);

for(i=10;inom_joueur[i-10];



transmettre_chaine(client->com,sms0);



pthread_exit(0);

return NULL;


}





void * envoi_grille(void* voidparam)


{

int i,j;

char c[10]="papa";

CLIENT *client=(CLIENT*) voidparam;

for(i=0;igrille[j][i]);

write(15,c,sizeof(c));

}

}

pthread_exit(0);

return NULL;


}





int main()

{

CLIENT * client[2*NJ];

pthread_t threads[2*NJ];

int connexion;

int port=12000;

int code;

int grille[10] transmettre_entier(client->com, 17); [10];

int i,j,k;

bateau *vaisseau[4];

for(i=0;icom, 17);

printf("attente de joueurs sur le port %d\n", port);





for(i=0;icom=client[0]->com;

client[3]->com=client[1]->com;





code= pthread_create(&threads[0], NULL, initialisation_joueur, client[0]);

code= pthread_create(&threads[1], NULL, initialisation_joueur, client[1]);

pthread_join(threads[0], NULL);

pthread_join(threads[1], NULL);



code= pthread_create(&threads[2], NULL,envoi_grille, client[0]);

code= pthread_create(&threads[3], NULL,envoi_grille, client[1]);





pthread_join(threads[2], NULL);

pthread_join(threads[3], NULL);





// fermeture du point de connexion

close(connexion);



printf("stop\n");





return 0;

}







CLIENT

#include

#include

#include

#include

#include



#include "socket.h"

#include "transmission.h"

#include "bateau.h"



//pthread_mutex_t verrou; // declaration d'un verrou

//pthread_cond_t *condition;



#define NJ 2 //nombre de joueurs





typedef struct

{

int com;

char nom_joueur[30];

int grille[10][10];



}JOUEUR;







void *lecture(void *voidparam)

{

JOUEUR *joueur=(JOUEUR*) voidparam;

char chaine[255];

int code;

//code=reception_entier(joueur->com);

code=reception_chaine(joueur->com, chaine, 255);

if(code com, chaine);

if(code grille);

pthread_exit(0);

return NULL;

}









int main()

{

JOUEUR *joueur;

joueur=(JOUEUR *)malloc(sizeof(JOUEUR) *1);

int port=12000;

//int grille[10][10];

//initialiser_grille(grille);

Case * c;

c=(Case *)malloc(sizeof(Case) *1);

// initialisation, necessaire pour pouvoir utiliser le verrou

//pthread_mutex_init(&verrou, NULL);

//pthread_cond_init(condition,NULL);



pthread_t threads[4];



printf("Quel est votre prenom? \n");





joueur->com= canal_communication("localhost", port);



if(joueur->com < 0)

return 1;







//pthread_mutex_lock(&verrou);



//while(x==0){

//pthread_cond_wait(condition, &verrou);



//afficher_grille(grille);

//c=placer_pion(grille);











// manipulation des données



//}

//pthread_mutex_unlock(&verrou);







pthread_create(&threads[0], NULL, lecture, (void *) &(joueur));

pthread_create(&threads[1], NULL, ecriture, (void *) &(joueur));







pthread_join(threads[0], NULL);

pthread_join(threads[1], NULL);



pthread_create(&threads[2], NULL, reception_grille, (void *) &(joueur));

pthread_join(threads[2], NULL);







close(joueur->com);



printf("stop\n");



return 0;

}





TRANSMISSION ENTIER



int transmettre_entier(int communication, int entier)

{



int code;

int n;

uint32_t nn;



// convertir l'entier au format reseau

n=entier;

nn= htonl(entier);



// transmettre l'entier

code= write(communication, &nn, sizeof(nn));

if(code < 0)

// erreur de transmission

return code;

printf("envoi entier %d\n",entier);

return 0;

}







int reception_entier(int communication)

{

int n;

int code;

uint32_t nn;



// recevoir un entier au format reseau

code= read(communication, &nn, sizeof(nn));

if(code < sizeof(nn))

// reception incomplete

return -1;



// convertir en entier

n= ntohl(nn);

printf("reception entier %d\n",n);

return n;

}

1 réponse

Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut :)



Le client est-il sous Win32?

Parce que... Dans la structure CLIENT: Le descripteur de socket n'est
un int que sous UNIX. Sous windows c'est un descripteur SOCKET.



Deux observations sur la toute dernière fonction, reception_entier()



* Elle fait appel à ntohl() or ntohl() ne prend en argument un
uint32_t que sous UNIX (défini dans netinet/in.h); et sous win32 cette
fonction prend en argument une struct sock_addr_in. Donc #ifdef WIN32
...



* la fonction read() utilisée juste au dessus ne prend théoriquement pas de uint32 en argument. Fais un man read dans la console pour voir.