Bonjour,
Je vous crit pour avoir de votre aide sur un projet personnel.
Un "simple" mini-chat en C.
J'y ai ajout une fonction pour rcuprer un fichier texte.
N'ayant pas trouv d'aide sur internet, ou du moins pas suffisante, j'ai du me dbrouiller pour construire le systme.
Aprs quelques jours de casse-tte, j'ai finalement russi crer ce que je voulais.
Brivement, le client suite la rception d'une commande que j'envoie via le serveur, va compter le nombre de caractres dans un fichier [prcis], puis le diviser en X blocs, sachant qu'un bloc est gal 1024 caractres, 2 blocs = 2048 etc...
Je reois tout normalement, ou presque, quand les caractres envoys par blocs sont reus (par le serveur), il y a la commande (RECUP) qui se rajoute chaque fin de bloc.
Par exemple :
Serveur >> recup //Commande
Client << 2 //Nombre de blocs.
Client << [BLOC de 1024 caractres]recup //Notez le recup en plus.
Client << [Dernier bloc de 120 caractres] //Pour le dernier bloc, il n'y a pas le recup qui vient s'ajouter.
J'ai touch un peu tout, sans vraiment s'avoir d'ou cela pouvait venir. Aucune piste pour l'instant, mais je souponne la longueur envoy en send et recv.
Sachant que les deux sont 1024.
Bref, voici le code CLIENT :
Le ct SERVEUR :
Voici le contenu du fichier texte :
Le A est prsent 2160 fois, je ne l'ai pas directement C/C pour des raisons videntes.
Et pour finir, voici ce que je reois :
A gauche le serveur ou j'y envois la commande "RECUP" qui demande au client d'envoyer le contenu du fichier texte.
A droite le contenu du fichier texte est affich pour montrer qu'il n'est de base, pas corrompu.
Les blocs sont ensuite reconstitus, et voici le rsultat :
Il devrait s'afficher ainsi :
Une fois encore, c'est raccourci, j'espre que a reste tout de mme comprhensible.
Notez tout de mme que le recup provoque un saut de ligne...
Quand le fichier texte fait moins de 1024 caractres, je n'ai pas faire face ce problme. Ni la fonction de reconstitution des blocs [SERVEUR] ni le calcul des blocs & des caractres [CLIENT] n'est remettre en cause.
J'espre avoir de l'aide, j'en ai grandement besoin !
Amicalement,
Je vous crit pour avoir de votre aide sur un projet personnel.
Un "simple" mini-chat en C.
J'y ai ajout une fonction pour rcuprer un fichier texte.
N'ayant pas trouv d'aide sur internet, ou du moins pas suffisante, j'ai du me dbrouiller pour construire le systme.
Aprs quelques jours de casse-tte, j'ai finalement russi crer ce que je voulais.
Brivement, le client suite la rception d'une commande que j'envoie via le serveur, va compter le nombre de caractres dans un fichier [prcis], puis le diviser en X blocs, sachant qu'un bloc est gal 1024 caractres, 2 blocs = 2048 etc...
Je reois tout normalement, ou presque, quand les caractres envoys par blocs sont reus (par le serveur), il y a la commande (RECUP) qui se rajoute chaque fin de bloc.
Par exemple :
Serveur >> recup //Commande
Client << 2 //Nombre de blocs.
Client << [BLOC de 1024 caractres]recup //Notez le recup en plus.
Client << [Dernier bloc de 120 caractres] //Pour le dernier bloc, il n'y a pas le recup qui vient s'ajouter.
J'ai touch un peu tout, sans vraiment s'avoir d'ou cela pouvait venir. Aucune piste pour l'instant, mais je souponne la longueur envoy en send et recv.
Sachant que les deux sont 1024.
Bref, voici le code CLIENT :
Code:
else if(strstr(bufferRecv, code_recv)){ //Si le message reu est gal "RECUP" int bclsnd = 0; //Boucle while int plus = 0; //Pour les blocs envoyer. char bufnbr[10]; //Variable pour envoyer le nombre de bloc au seveur. FILE* checkf = NULL; checkf = fopen(path, "r"); //Vrifie que checkf (fichier texte) existe. if (checkf!=NULL){ //Si aucune erreur alors fclose(checkf); //Fermeture de checkf CountChar(); //Va dans une fonction pour calculer le nombre de caractres & blocs. sprintf(bufnbr, "%d", nbrsend); //Stock un int dans un char. send(sock, bufnbr, 10, 0); //Envoi du int stock dans un char. while(bclsnd != nbrsend){ //Boucle pour l'envoi des blocs. send(sock, text_log+plus, 1024, 0); plus += 1024; //Se tlporte 1024 caractres plus loin pour envoyer les blocs. ++bclsnd; } } else { //Si checkf (fichier texte) n'existe pas alors. send(sock, text_return[1], 20, 0); //Envoi d'une erreur } }
Code:
else if (strstr(bufferSend, code_recv)){ //Si le message envoy est gal "RECUP" int bclrcv = 0; //Variable pour boucle while int client_id = atoi(bufferRecv); //Rcupre le message client (CHAR) et le converti en INT. while(bclrcv != client_id){ //Boucle pour recevoir les blocs. recv(csock, bufferRecv, 1024, 0); //Rception du premier bloc de 1024 caractres. printf("Client >> %s\n",bufferRecv); //Affiche le bloc. stock(bufferRecv); //Stock le bloc pour le reconstituer. ++bclrcv; } }
Code:
DEBUT_AAAAAAAAAA_FIN
Et pour finir, voici ce que je reois :
A gauche le serveur ou j'y envois la commande "RECUP" qui demande au client d'envoyer le contenu du fichier texte.
A droite le contenu du fichier texte est affich pour montrer qu'il n'est de base, pas corrompu.
Les blocs sont ensuite reconstitus, et voici le rsultat :
Code:
DEBUT_AAAAA recup AAAAA recup AAAAA_FIN
Code:
DEBUT_AAAAAAAAAAAAAAA_FIN
Notez tout de mme que le recup provoque un saut de ligne...
Quand le fichier texte fait moins de 1024 caractres, je n'ai pas faire face ce problme. Ni la fonction de reconstitution des blocs [SERVEUR] ni le calcul des blocs & des caractres [CLIENT] n'est remettre en cause.
J'espre avoir de l'aide, j'en ai grandement besoin !
Amicalement,
Commentaire