IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

reception de données avec recv()


Sujet :

C

  1. #21
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    ok je vais modifier tout ça suivant vos recommandations pour qu'il devient lisible et surtout en finir avec cette boucle infinie. Je vous présenterais après la nouvelle version.

    PS : dans ma boucle modifiée que j'ai posté en dernier, totalbytes vaut 2 ... ...

  2. #22
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par mala92 Voir le message
    Surtout pour un débutant. je n'ai jamais compris l'intérêt de condenser un code sur une ligne.
    Bah, la fainéantise d'aller à la ligne


    sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(bytesrecu!= SOCKET_ERROR) 
           {
              totalbytes = totalbytes + bytesrecu;
             fwrite(buffer,1024, 1,fichier_src);
           }
    else
            break;
    S'il y a une erreur, il faut sortir de la boucle.
    Personnellement je ferais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    while(...)
    {
    if(bytesrecu > 0) 
           {
              totalbytes = totalbytes + bytesrecu;
             fwrite(buffer,1024, 1,fichier_src);
           }
    else
            break;
    
    }
    if(bytesrecu == SOCKET_ERROR)
    {
            //traitement de l'erreur
    }

  3. #23
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    @fusionfroide ton code d'origine n'est pas trop déconnant. c'est juste l'affectation (retour de recv) et la comparaison ( != SOCKET_ERROR) tu te fous dedans.

    j'espère que tu auras appris une chose : ne jamais faire une double opération sur une même ligne (sans parenthèse). Même après plus de 10ans en C, je n'ose pas faire ce genre de chose (principalement, comme le dit Neckara, pour des questions de lisibilité).

  4. #24
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Salut,

    J'ai modifié le code et voici les points positifs que je constat :

    - le fichier est envoyé et écrit dans un fichier entièrement.
    - la fonction recv() renvoie le nombre de bytes lu dans mon cas 2503 octets
    - la boucle s'arrête au 2503ème octet lu.

    Le seul point négatif :

    - présence de texte parasite à la fin du fichier. Je pense que ça vient du buffer qui contient les anciennes données transmises juste avant et vient me les rajouter à la fin du texte.

    Donc la solution serait de vider le buffer à chaque tour de transmission de données et éviter que fwrite() n'ajoute du texte déjà écrit dans le fichier de récéption. Donc j'ai pensé à utiliser memset (buffer, 0, BUFZISE) juste après fwrite() mais le fichier devient impossible à ouvrir.

    Quelle fonction permet de vider un buffer ? merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    char nom[50] = "fichierRecubis.txt";
    FILE *fichier_src = fopen (nom, "wb");
    if (fichier_src == NULL)
    {
       perror ("fopen() ");
       exit (0); //exit(EXIT_FAILURE);
    }
     
    int BUFZISE=1024;
    char *buffer = malloc(BUFZISE); // Allocation de la mémoire
    int bytesrecu=0;
    int totalbytes=0;
     
    /* Si l'on reçoit des informations : on les affiche à l'écran */
     
    while(totalbytes<2503)
    {
     
       bytesrecu=recv(sock, buffer, BUFZISE, 0);
     
       /* Si l'on reçoit des informations : on les affiche à l'écran */
     
       if(bytesrecu!= SOCKET_ERROR)
     
          {
              totalbytes = totalbytes + bytesrecu;
              fwrite(buffer,BUFZISE, 1,fichier_src);
     
           }
     
            printf("test : %d octets \n", totalbytes);
    }
     
    fclose(fichier_src);
     
    }
    /* sinon, on affiche "Impossible de se connecter" */
     
    else
    {
        printf("Impossible de se connecter\n");
    }

  5. #25
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Re salut,

    je viens de trouver la solution à ce texte parasite qui s'ajoute à la fin du fichier. Dans fwrite, au lieux de d'écrire BUFZISE j'ai écris bytesrecu. comme ça le fwrite écrire dans mon fichier de réception des données juste les octets reçu !

    solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(buffer,bytesrecu, 1,fichier_src);
    Donc finalement pas besoin de réinitialiser le buffer

    Merci beaucoup pour l'aide.

    Maintenant que ça marche avec du texte, j'espère que je n'aurais aucune modification (ou peut être très peu) pour que je puisse transférer des fichiers binaire. après tout fread et fwrite ça marche aussi avec des fichiers binaire

Discussions similaires

  1. [Débutant] envoie et reception des données avec un acquitement
    Par samiti dans le forum C#
    Réponses: 3
    Dernier message: 07/08/2012, 09h21
  2. Reception de données avec ajax
    Par yann18 dans le forum jQuery
    Réponses: 13
    Dernier message: 08/06/2011, 17h26
  3. envoi/reception de données avec le port serie
    Par chitane87 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 23/05/2011, 19h33
  4. InfoPath envoie et reception de données avec base SQL
    Par fanfan49 dans le forum InfoPath
    Réponses: 2
    Dernier message: 05/06/2007, 15h44
  5. Réponses: 4
    Dernier message: 02/06/2005, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo