C: comment faire pour effacer de la mémoire tampon de lecture() sur une socket
Je suis en train de recevoir des données à partir d'un serveur, et il fonctionne très bien pour la première fois, mais comme read() conserve une boucle permet aussi de stocker les anciennes valeurs précédemment lu. Voici ce que j'ai jusqu'à présent.
char receive[50];
if((he = gethostbyname(servername)) == NULL ) {
perror(strcat("Cannot find server named:", servername));
exit(0);
}
he = gethostbyname("localhost");
localIP = inet_ntoa(*(struct in_addr *)*he->h_addr_list);
client_sock_desc = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(localIP);
server_addr.sin_port = htons(serverport);
len = sizeof(server_addr);
if(connect(client_sock_desc, (struct sockaddr *)&server_addr,len) == -1) {
perror("Client failed to connect");
exit(0);
}
strcpy(buf, "CLIENT/REQUEST\n");
send(client_sock_desc, buf, strlen(buf), 0);
//send actual function request
//put a space before \n char to make it easier for the server
for(i = 0; i < sizeof(wholeRequest); i++) {
if(wholeRequest[i] == '\n') {
wholeRequest[i] = ' ';
wholeRequest[i+1] = '\n';
break;
}
}
while(read(client_sock_desc, receive, sizeof(receive)) > 0) {
strcpy(receive, ""); //attempt to erase all old values
printf(receive);
fflush(stdout);
}
close(client_sock_desc);
Lorsque le serveur envoie les données une seule fois et ferme le socket, il fonctionne parfaitement. Mais puis-je avoir le client, ouvrez le support de nouveau, d'envoyer des données au serveur, et le serveur sera de nouveau envoyer des données au client et fermer le socket. Le client sera à nouveau essayer de lire les données que le serveur a envoyé, mais cette fois, il remplit recevez avec à la fois l'information et de la partie de l'ancienne information
receive[0]='\0'
serait un bon moyen pour effacer la chaîne. Comme il est, puisque vous "clair" receive
avant de l'imprimer, comment n'avez-vous jamais aucune sortie? Serait-ce parce que vous avez besoin printf("%s", receive)
? Je ne suis pas sûr de savoir comment printf
réagit lorsque la chaîne de format est ""
...j' "clair" de la recevoir après j'ai l'impression, donc quand je fais la
read()
de nouveau, il faut espérer combler un vide receive
avec seulement les valeurs actuelles qu'il a reçu du serveurNon - vous "clair" de la recevoir dans la
strcpy
ligne, qui, dans le code ci-dessus, qui se passe AVANT le printf
. Le fflush
signifie simplement que tout ce qui printf
allait à la sortie stdout
va réellement à la console avant d'exécuter la ligne suivante. C'est vider la mémoire tampon", et vous le faites sur la SORTIE.OriginalL'auteur user2158382 | 2013-04-21
Vous devez vous connecter pour publier un commentaire.
Il me semble que dans votre code, vous supprimez les données reçues avant de l'imprimer - ensuite, vous passez d'une chaîne à
printf
qui est essentiellement vide, et je ne suis pas sûr de ce queprintf
n' (puisque c'est le formatage de chaîne de caractères qui est vide).Essayez ceci:
receive
Pouvez-vous montrer une partie de la sortie? peut-être que le résultat n'est pas null...
il travaille maintenant, je viens de boucle à travers les 1024 indice de recevoir des chaîne et changé à
'\0'
. Il fonctionne, mais je me sens tellement mal, je pensais que c'est ce questrcpy(receive, "")
était censé faire! Hackiest correctif jamais lolJ'ai été d'édition de la question avec le correctif à ce que votre commentaire est venu en... compter le nombre de caractères lus, puis ajouter le
'\0'
manuellement au bon endroit. Moins hacky que zéro de remplissage de la mémoire tampon entier...Voici quelques exemple de sortie --- Entrez la commande: multipliez 1 2 3 SERVEUR/RÉSULTAT de multiplier 1 2 3 6 Entrez la commande: multipliez 1 2 SERVEUR/INCOMPATIBILITÉ de multiplier 2 3 multipliez 1 2 3 6. La partie que j'ai mise en gras est clairement une partie de l'ancienne résultat. Seul "SERVEUR/INCOMPATIBILITÉ de multiplier 2 3" doit être reçu dans
receive
OriginalL'auteur Floris