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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    Par défaut reception de données avec recv()
    Salut,

    J'essaie de modifier mon code serveur/client pour pouvoir envoyer des fichiers entiers. Du coté, serveur, je dispose de la fonction qui me lit le fichier que je lui désigne puis me l'envoie avec la fonction send () :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    char nom[50] = "c:\\fichier_send.txt";
    int fin, current;
    FILE *fichier_src = fopen (nom, "rb");
    if (fichier_src == NULL)
    {
       perror ("fopen() ");
       exit (0); //exit(EXIT_FAILURE)
    }
     
    fseek(fichier_src, 0, SEEK_END);
    fin=ftell(fichier_src);
    /* On se place a l'endroit qui va bien dans le binaire */
    fseek (fichier_src, 0, SEEK_SET);
    current = 0; /* Détermination de la position courante dans la fichier */
     
    #define BUFSIZE 1024
    int nb_lu;
    char buffer[BUFSIZE];
    memset (buffer, 0, BUFSIZE);
    nb_lu = fread (buffer, sizeof (char), BUFSIZE, fichier_src);
    int nb_send;
    int inc = 1;
    while ((nb_lu > 0) && (nb_lu <= fin - current))
    {
       if ((nb_send = send (csock, buffer, nb_lu, 0)) == -1)
          {
             perror ("send() ");
             exit (-1);
          }
     
       printf ("nb_send(boucle) \'%d \' = %d\n", inc, nb_send);
       if (nb_send == -1)
          perror ("send () ");
       current = current + nb_lu;
       memset (buffer, 0, BUFSIZE);
       inc++;
       if (fin - current < BUFSIZE)
       {
          break;
       }
       else
       nb_lu = fread (buffer, sizeof (char), BUFSIZE, fichier_src);
    }
     
    memset (buffer, 0, BUFSIZE);
    fread (buffer, sizeof (char), fin - current, fichier_src);
    if ((nb_send = send (csock, buffer, fin - current, 0)) == -1);
    {
       perror ("write() ");
    }
    printf ("nb_send = %d\n", nb_send);
    fclose (fichier_src);
    Mais mon problème se situ au niveau du client qui reçoit les données transmises par send(). Quand je lance le transfère d'un paragraphe de texte, la fonction recv() me le copie dans un fichier et répète la copie infiniment (en tout cas, ça n'a pas l'air de s'arrêter). Puis j'ai remarqué je mets un temps infini pour sortir de la boucle while. La taille du fichier en sortie est très lourd (40MB) pour un petit paragraphe. Est ce que vous pouvez m'indiquer comment améliorer ma fonction recv() ?
    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
     
    char nom[50] = "fichierRecubis.txt";
            FILE *fichier_src = fopen (nom, "wb");
            if (fichier_src == NULL)
                {
                        perror ("fopen() ");
                            exit (0); //exit(EXIT_FAILURE);
                    }
     
        int bytesrecu=0;
        int totalbytes=0;
     
        /* Si l'on reçoit des informations : on les affiche à l'écran */
            if(bytesrecu=recv(sock, buffer, 1024, 0) != SOCKET_ERROR)
        {
        totalbytes += bytesrecu;
        fwrite(buffer,1024, 1,fichier_src);
            /*printf("Recu : %s\n", buffer);*/
        }
     
        while(totalbytes<4096)
        {
     
            /* Si l'on reçoit des informations : on les affiche à l'écran */
            if(bytesrecu=recv(sock, buffer, 1024, 0) != SOCKET_ERROR)
        totalbytes += bytesrecu;
        fwrite(buffer,1024, 1,fichier_src);
            /*printf("Recu : %s\n", buffer);*/
     
        }
     
        fclose(fichier_src);
            }
            /* sinon, on affiche "Impossible de se connecter" */
            else
            {
                printf("Impossible de se connecter\n");
            }
    PS : ne soyez pas choqué par mon code, je suis un étudiant en physique qui s'intéresse à l'informatique

  2. #2
    Membre Expert
    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
    Par défaut
    salut,

    je ne vais pas résoudre ton souci, mais ...
    je n'aime pas ce genre de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(bytesrecu=recv(sock, buffer, 1024, 0) != SOCKET_ERROR)
    je préfère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bytesrecu=recv(sock, buffer, 1024, 0);
    if(bytesrecu != SOCKET_ERROR)
    Pourquoi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(buffer,1024, 1,fichier_src);
    alors que recv te donne le nombre d'octets à copier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(buffer, bytesrecu, 1,fichier_src);

  3. #3
    Membre averti
    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
    Par défaut
    Ok merci pour vos précisions.

    Sinon, est ce qu'il y a un moyen de vérifier si la fonction recv() reçoit effectivement tout les paquets qui lui sont transmit par send() ?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    Par défaut
    Tu as déjà essayé de faire afficher a valeur de totalbytes à chaque tour de boucle afin de comprendre pourquoi tu as une boucle infinie?

  5. #5
    Membre averti
    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
    Par défaut
    Salut,

    Alors j'ai modifié le code de réception des données de la façon suivante pour faire un test :

    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
     
     
    char nom[50] = "fichierRecu.txt";
    FILE *fichier_src = fopen (nom, "wb");
    if (fichier_src == NULL)
    {
       perror ("fopen() ");
       exit (0); //exit(EXIT_FAILURE);
    }
     
    int bytesrecu=0;
    int totalbytes=0;
     
    /* Si l'on reçoit des informations : on les affiche à l'écran */
    if(bytesrecu=recv(sock, buffer, BUFZISE, 0) != SOCKET_ERROR)
    {
        totalbytes = totalbytes + bytesrecu;
        fwrite(buffer,1024, 1,fichier_src);
        printf("===========================\n");
            printf("Recu : %d\n",totalbytes);
        printf("===========================\n");
     
    }
     
    fclose(fichier_src);
    }
            /* sinon, on affiche "Impossible de se connecter" */
            else
            {
                printf("Impossible de se connecter\n");
            }
    Alors ce code, me sauvegarde dans un fichier seulement les 1024 premiers octets du texte à transmettre (donc le début du texte est transmis). d'ailleurs le fichier crée pèse 1024 octets. Sinon, ce qui m'étonne c'est ce que me renvoie la fonction recv() : la variable totalbytes vaut 1 après une première exécution . normalement recv() renvoie le nombre d'octets reçu qui dans ce cas là 1024 ... je ne comprends pas pourquoi.

  6. #6
    Membre Expert
    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
    Par défaut
    On dirait que mes recommandations ne servent à rien.
    Citation Envoyé par fusionfroide Voir le message
    la variable totalbytes vaut 1 après une première exécution . normalement recv() renvoie le nombre d'octets reçu qui dans ce cas là 1024 ... je ne comprends pas pourquoi.
    Qui te dit que bytesrecu est le nombre d'octets reçu ?
    moi je dirais plutôt que c'est le résultat de recv(sock, buffer, BUFZISE, 0) != SOCKET_ERROR donc true, donc 1.

    PS : c'est pour ça que je n'aime pas les opérations multiples sur 1 seule ligne et en plus sans parenthèse.

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