Bonjour,
voila j'ai 2 fichier cpp l'un qui joue le role de serveur et un autre client ,j'ai un ptit souci en voulant y mettre un jeu de devinette auquel le serveur choisi un nombre au hasard et le client essaye de le deviner. Alors + precisement mon probleme est k'apres que le client fait une premiere tentative je n'arrive pas a faire en sorte a ce que le client puisse reessayer, cela me bloque apres la validation du premier essai. Voila ce que j'ai modifier dans le parti server only:
_______________________parti serveur __________________
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>
#pragma comment(lib, "ws2_32.lib" )
#define LG_MAX_REQUETE 1024
void traitement(SOCKET, int i);
void main() {
int val,port=0,erreur,i;
WSADATA wsa;
/* initialisation */
WSAStartup(MAKEWORD(2,0), &wsa);
SOCKET serveur;
SOCKET client;
SOCKADDR_IN sin;
SOCKADDR_IN clientsin;
/* saisir la configuration du serveur */
printf("Entrez le numero de port: " );
scanf("%d",&port);
printf("Entrez le nombre cache: " );
scanf("%d",&i);
/* creation de la socket serveur */
serveur=socket(AF_INET,SOCK_STREAM,0);
if(serveur==INVALID_SOCKET)
{
perror("erreur de creation de la socket" );
exit(-1);
}
/* configuration de la socket */
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
/* attacher le socket au n° de port*/
erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin));
if(erreur == INVALID_SOCKET)
{
perror("bind" );
exit(-1);
}
/* creation d'une file d'attente de demande de connexion */
listen(serveur,0);
val=sizeof(clientsin);
printf("\n\tServeur en route\n" );
while(1)
{
/* accepter une connexion */
client=accept(serveur,(SOCKADDR *)&clientsin,&val);
if(client == INVALID_SOCKET)
{
perror("erreur de connection" );
exit(-1);
}
/* fonction qui utilise la socket */
traitement(client, i);
}
}
/* Traitement : traite la requete envoyer par le client
*/
void traitement(SOCKET client, int i)
{
int lg, nb,nb_essai=0;
char reponse[LG_MAX_REQUETE];
/* attendre la reception d'une requete sur la socket "client" */
lg=recv(client,reponse,LG_MAX_REQUETE,0);
reponse[lg]='\0';
nb=atoi(reponse);
nb_essai++;
if(nb < i)
{
printf("trop petit\n" );
}
if(nb > i)
{
printf("trop grand\n" );
}
while (nb!=i);
return;
if(nb==i)
{printf("Bingo vous avez trouvez en %d essais\\n",nb_essai);
}
lg=strlen(reponse);
/* envoyer une requete sur la socket "client" */
send(client,reponse,lg,0);
}
_________________parti client______________
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib" )
#define LG_MAX_REQUETE 1024
void traitement(SOCKET);
void main()
{
int port=0,erreur;
struct hostent *nom_serveur;
char ad_serveur[255];
WSADATA wsa;
/* initialisation */
WSAStartup(MAKEWORD(2,0), &wsa);
SOCKET client;
SOCKADDR_IN sin;
/* saisir la configuration du client */
printf("Entrez l'adresse du serveur :" );
scanf("%s",ad_serveur);
printf("Entrez le numero de port: " );
scanf("%d",&port);
nom_serveur=gethostbyname(ad_serveur);
if(nom_serveur==NULL)
{
perror("adresse non valide" );
exit(-1);
}
/* creation de la socket client */
client = socket(AF_INET,SOCK_STREAM,0);
if(client==INVALID_SOCKET)
{
perror("erreur de creation de la socket" );
exit(-1);
}
/* configuration de la socket */
memcpy(&sin.sin_addr,nom_serveur->h_addr,nom_serveur->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
/* connecter le client au serveur */
erreur=connect(client, (SOCKADDR *)&sin, sizeof(sin));
if(erreur==INVALID_SOCKET)
{
perror("erreur de connexion" );
exit(-1);
}
/* fonction qui utilise la socket */
traitement(client);
/* fermer le socket */
closesocket(client);
WSACleanup();
}
/*
Traitement : taper heure pour avoir l'heure du serveur, ou date pour obtenir la date
du serveur
*/
void traitement(SOCKET client)
{
int lg;
char requete[LG_MAX_REQUETE];
printf("ca marche?\n" );
scanf("%s",requete);
lg=strlen(requete);
send(client,requete,lg,0);
lg=recv(client,requete,LG_MAX_REQUETE,0);
requete[lg]='\0';
printf("%s",requete);
system("PAUSE" );
}