Bonsoir,
, j'aurais quelque questions à vous poser
j'ai ici deux codes un pour un client et un pour un serveur, les deux fonctionnant en local.
L'idée étant que le client veut envoyer un message au serveur.
Le serveur renvoie alors ce même message au client.
Le client affiche le message reçu.
Concrètement il s'agit de voir si le message est toujours intact après deux échanges. C--->S---> C
Ce que j'ai pu remarquer à présent avec mon code, c'est que le message envoyé par C arrive bien au serveur, l'affichage me le confirme.
En revanche, le client n'a pas toujours le temps de récupérer à nouveau le message qui est aléatoirement, correct ou incomplet.
J'ai supposé que cela était dû au serveur qui, après avoir envoyé de nouveau le message n'attends pas.
S'il n'attends pas, alors soit le message est lu assez tôt par le client, soit il n'a pas été lu assez tôt, auquel cas le serveur se termine et du coup il est impossible au client de récupérer son message.
J'aimerais donc arriver à modifier le code suivant pour avoir un échange complet; peut être en ajoutant une sorte d'acquittement ? Mais j'avoue ne pas voir comment faire ?
Un coup de main serait apprécié
Client.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 int main(int argc, char *argv[]) { int portno, sockfd; struct sockaddr_in serv_addr; struct hostent *server; char *msg="Message d'exemple"; portno = 7000; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); server = gethostbyname("localhost"); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting"); char *buffer=malloc(sizeof(char)*(strlen(msg)+1)); write(sockfd,msg,strlen(msg)); read(sockfd,buffer,strlen(msg)); // On reçoit un tableau de char on converti en string en ajoutant \0 buffer[strlen(msg)]='\0'; printf("%s\n", buffer); return 0;
Serveur.c
En gros, il faudrait que mon serveur soit capable d'attendre après avoir écris dans la socket que le client est bien reçu avant de fermer la socket. Si j'avais un main unique, j'aurais pu simuler ça avec des tubes et des process assez facilement; mais là je vois pas du tout comment je peux faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, clilen; char buffer; struct sockaddr_in serv_addr, cli_addr; int n; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) error("ERROR opening socket"); portno = 7000; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("ERROR on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t*) &clilen); if (newsockfd < 0) error("ERROR on accept"); do { n = read(newsockfd,&buffer,1); write(newsockfd,&buffer, 1); } while(n>-1); return 0; }
Merci à vous !!
Partager