OVH Cloud OVH Cloud

probleme avec fflush(stdin)

3 réponses
Avatar
SoULiaNe
Bonjour,

ci dessous vous trouverez un petit source pour un client UDP. Le client
enregistre une chaine lue au clavier dans un buffer de taille limité puis il
l'envoie à un serveur. Ce que je ne comprend pas, c'est pourquoi les chaines de
longueur > à BUFFERSIZE sont tout de même envoyé au serveur, alors que je vide
l'entrée standard avant chaque fgets() à l'aide de fflush(stdin).

Voici un exemple d'utilisation du client :

./clientudp X.X.X.X
salut
DEBUG i=0
ssssssssssssssssssssss
DEBUG i=1
DEBUG i=2
DEBUG i=3

Comme en témoigne les lignes "DEBUG", la longue chaine de S est envoyé à l'aide
de 3 sendto(). Voici le code et merci d'avance pour votre aide :)



#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>

#define BUFFERSIZE 10
#define SERVERPORT 2222

int main(int argc, char **argv) {

int sockfd, i=0;
struct sockaddr_in server_addr;
char * server_ip = argv[1];
char buffer[BUFFERSIZE];

if(argc<2) {
fprintf(stderr, "Syntaxe: %s server_ip\n", argv[0]);
return(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVERPORT);
if(inet_aton(server_ip, &(server_addr.sin_addr)) == 0) {
perror("inet_aton: ");
return(1);
}
memset(&(server_addr.sin_zero),'\0',8);

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

do {
fflush(stdin);
fgets(buffer, BUFFERSIZE, stdin);
printf("DEBUG\ti=%d\n", i++);
sendto(sockfd,buffer,BUFFERSIZE,0,(struct sockaddr
*)&server_addr,sizeof(struct sockaddr));
} while(buffer[0] != '\n');

close(sockfd);
printf("Au revoir !\n");
return(0);

}

3 réponses

Avatar
Richard Delorme
Bonjour,

ci dessous vous trouverez un petit source pour un client UDP. Le client
enregistre une chaine lue au clavier dans un buffer de taille limité
puis il l'envoie à un serveur. Ce que je ne comprend pas, c'est pourquoi
les chaines de longueur > à BUFFERSIZE sont tout de même envoyé au
serveur, alors que je vide l'entrée standard avant chaque fgets() à
l'aide de fflush(stdin).


fflush() ne marche qu'en écriture, pas en lecture.

--
Richard

Avatar
SoULiaNe
fflush() ne marche qu'en écriture, pas en lecture.


Ah... Merci !

Avatar
laurence moquet
Bonsoir,

Je n'ai personnellement pas de solution à votre problème.
Par contre, je ne crois pas que sendto envoye un maximum de BUFFERSIZE
caractères
(http://www.opengroup.org/onlinepubs/009695399/functions/sendto.html) mais
BUFFERSIZE caractère, donc la dernière boucle (celle où vous entrez n pour
finir la saisie) devrait envoyer des caractères aléatoires à votre serveur,
si je ne me trompe pas.

Bonne soirée.
Julien Moquet.

"SoULiaNe" a écrit dans le message de news:
434fb8d3$0$21210$
Bonjour,

ci dessous vous trouverez un petit source pour un client UDP. Le client
enregistre une chaine lue au clavier dans un buffer de taille limité puis
il l'envoie à un serveur. Ce que je ne comprend pas, c'est pourquoi les
chaines de longueur > à BUFFERSIZE sont tout de même envoyé au serveur,
alors que je vide l'entrée standard avant chaque fgets() à l'aide de
fflush(stdin).

Voici un exemple d'utilisation du client :

./clientudp X.X.X.X
salut
DEBUG i=0
ssssssssssssssssssssss
DEBUG i=1
DEBUG i=2
DEBUG i=3

Comme en témoigne les lignes "DEBUG", la longue chaine de S est envoyé à
l'aide de 3 sendto(). Voici le code et merci d'avance pour votre aide :)



#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>

#define BUFFERSIZE 10
#define SERVERPORT 2222

int main(int argc, char **argv) {

int sockfd, i=0;
struct sockaddr_in server_addr;
char * server_ip = argv[1];
char buffer[BUFFERSIZE];

if(argc<2) {
fprintf(stderr, "Syntaxe: %s server_ipn", argv[0]);
return(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVERPORT);
if(inet_aton(server_ip, &(server_addr.sin_addr)) == 0) {
perror("inet_aton: ");
return(1);
}
memset(&(server_addr.sin_zero),'',8);

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

do {
fflush(stdin);
fgets(buffer, BUFFERSIZE, stdin);
printf("DEBUGti=%dn", i++);
sendto(sockfd,buffer,BUFFERSIZE,0,(struct sockaddr
*)&server_addr,sizeof(struct sockaddr));
} while(buffer[0] != 'n');

close(sockfd);
printf("Au revoir !n");
return(0);

}