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 récupérer un fichier texte.
N'ayant pas trouvé d'aide sur internet, ou du moins pas suffisante, j'ai du me débrouiller pour construire le système.
Après quelques jours de casse-tête, j'ai finalement réussi à créer ce que je voulais.
Brièvement, le client suite à la réception d'une commande que j'envoie via le serveur, va compter le nombre de caractères dans un fichier [précis], puis le diviser en X blocs, sachant qu'un bloc est égal à 1024 caractères, 2 blocs = 2048 etc...
Je reçois tout normalement, ou presque, quand les caractères envoyés par blocs sont reçus (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 caractères]recup //Notez le recup en plus.
Client << [Dernier bloc de 120 caractères] //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 soupçonne la longueur envoyé en send et recv.
Sachant que les deux sont à 1024.
Bref, voici le code CLIENT :
Le côté SERVEUR :
Voici le contenu du fichier texte :
Le A est présent 2160 fois, je ne l'ai pas directement C/C pour des raisons évidentes.
Et pour finir, voici ce que je reçois :
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 reconstitués, et voici le résultat :
Il devrait s'afficher ainsi :
Une fois encore, c'est raccourci, j'espère que ça reste tout de même compréhensible.
Notez tout de même que le recup provoque un saut de ligne...
Quand le fichier texte fait moins de 1024 caractères, je n'ai pas à faire face à ce problème. Ni la fonction de reconstitution des blocs [SERVEUR] ni le calcul des blocs & des caractères [CLIENT] n'est à remettre en cause.
J'espère 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 récupérer un fichier texte.
N'ayant pas trouvé d'aide sur internet, ou du moins pas suffisante, j'ai du me débrouiller pour construire le système.
Après quelques jours de casse-tête, j'ai finalement réussi à créer ce que je voulais.
Brièvement, le client suite à la réception d'une commande que j'envoie via le serveur, va compter le nombre de caractères dans un fichier [précis], puis le diviser en X blocs, sachant qu'un bloc est égal à 1024 caractères, 2 blocs = 2048 etc...
Je reçois tout normalement, ou presque, quand les caractères envoyés par blocs sont reçus (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 caractères]recup //Notez le recup en plus.
Client << [Dernier bloc de 120 caractères] //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 soupçonne 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 reçu 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"); //Vérifie 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 caractères & 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 téléporte 1024 caractères 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); //Récupère le message client (CHAR) et le converti en INT. while(bclrcv != client_id){ //Boucle pour recevoir les blocs. recv(csock, bufferRecv, 1024, 0); //Réception du premier bloc de 1024 caractères. 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 reçois :
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 reconstitués, et voici le résultat :
Code:
DEBUT_AAAAA recup AAAAA recup AAAAA_FIN
Code:
DEBUT_AAAAAAAAAAAAAAA_FIN
Notez tout de même que le recup provoque un saut de ligne...
Quand le fichier texte fait moins de 1024 caractères, je n'ai pas à faire face à ce problème. Ni la fonction de reconstitution des blocs [SERVEUR] ni le calcul des blocs & des caractères [CLIENT] n'est à remettre en cause.
J'espère avoir de l'aide, j'en ai grandement besoin !
Amicalement,
Commentaire