lundi 27 juillet 2015

[RÉSOLU]Mini-chat en C, problème recv.

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 :

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
                        }
                    }

Le côté SERVEUR :

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;
                            }
                    }

Voici le contenu du fichier texte :

Code:

DEBUT_AAAAAAAAAA_FIN
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 :

Code:

DEBUT_AAAAA
recup
AAAAA
recup
AAAAA_FIN

Il devrait s'afficher ainsi :

Code:

DEBUT_AAAAAAAAAAAAAAA_FIN
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,


from Hackademics : Forum de hacking – hackers white hat – cours de securite informatique, apprendre langage python, tutoriels de reverse engineering http://ift.tt/1S79mYm
via IFTTT

Aucun commentaire:

Enregistrer un commentaire