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. #1
    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 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 é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
    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
    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 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 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
    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
    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,

    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 é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
    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.

  7. #7
    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
    Je me suis renseigné sur la fonction recv() et elle renvoie bien le nombre d'octets reçu. Je viens de faire un test avec un while(bytesrecu) en espérant qu'à la fin de réception la variable bytesrecu vaille 0 et je me suis retrouvé avec une boucle infinie et un fichier texte crée de 250 Mo ... décidément je ne comprends pas à quoi joue cette fonction recv() !

  8. #8
    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 http://man.developpez.com/man2/recv.2.php
    Ces fonctions renvoient le nombre d'octets reçus si elles réussissent, ou -1 si elles échouent, auquel cas errno contient le code d'erreur.
    -1 est considéré comme true.

    Ta boucle doit donc être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(nbOctetLu > 0)
    {
    }

  9. #9
    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
    oui mais le problème c'est ce que dans mon cas la fonction recv() renvoie 1 même si je reçois dans le fichier 1024 octets (taille du buffer). logiquement elle dois me renvoyer 1024 non ?

    Si je fais while(nombrelu>0) je vais encore entrer dans une boucle infinie puisque recv() renvoie tout le temps 1 dans mon cas ...

  10. #10
    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
    Peux-tu nous remontrer ton code avec les modifications que tu as faites?

  11. #11
    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
    Voilà pour le code : je l'ai modifié pour qu'il m'affiche ce que renvoie recv() comme tu l'a conseillé dans un poste précédent. et effectivement recv() me renvoie la valeur "1" et non pas le nombre d'octets reçu. totalbytes vaut 1 ... bizarre non ?

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

  12. #12
    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

    Pas de boucle while, exactement le même code qu'au début, tu es sûre d'avoir posté le bon ?

  13. #13
    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
    Soit tu n'as pas posté le bon code, soit tu n'as pas suivi la remarque de mala92 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( ( bytesrecu=recv(sock, buffer, BUFZISE, 0) ) != SOCKET_ERROR)

  14. #14
    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
    Citation Envoyé par Neckara Voir le message
    Soit tu n'as pas posté le bon code, soit tu n'as pas suivi la remarque de mala92 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( ( bytesrecu=recv(sock, buffer, BUFZISE, 0) ) != SOCKET_ERROR)
    A mon avis ce n'est pas le bon code, mais je crois avoir trouvé le souci (avec le while de la question d'orgine), pour confirmer ce que je pense il me faut le nouveau code (avec le while).

  15. #15
    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
    j'ai effectivement enlevé la boucle while pour voir pourquoi le code ne se termine pas. si le résultat renvoyé par recv() n'est pas le nombre d'octets lu, comment je vais pouvoir maitriser la boucle ? c'est pour ça que je fais un test juste avec une seule réception de données avec laquelle je reçois le premier paquet de données soit 1024 octets qui correspondent au début du teste que je veux envoyé et j'arrive à les stocker dans un autre fichier. Donc logiquement pour recevoir les autres paquets, il faut faire une boucle mais comment la maitriser si recv() ne renvoie pas le nombre d'octets lu comme prévu ... y a un truc louche dans cette histoire.

  16. #16
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        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);*/
     
        }
    bytesrecu = 1 à ce que tu dis. donc pour que totalbytes = 1024 (condition du while), tu va tourner 1024 fois dans le while et donc écrire 1024 *1024, donc 10Mo.

    si le résultat renvoyé par recv() n'est pas le nombre d'octets lu, comment je vais pouvoir maitriser la boucle ?
    tu es une tête de mule c'est pas possible. Coupe ce putain de if en 2 !!!! (dsl mais j'ai l'impression qu'il faut s'énervé pour que tu comprennes )
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bytesrecu=recv(sock, buffer, 1024, 0);
    printf("bytesrecu = %d", bytesrecu);
    ca dit quoi.

  17. #17
    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
    Restons polis.

    Il faut comprendre que l'opérateur != est prioritaire sur l'opérateur =.

    Ainsi quand tu fais :
    a sera égal que résultat de b != c, c'est à dire que a sera égal à :
    - 1 si b != c
    - 0 si b == c

    Tu as alors deux solutions :
    - mettre des parenthèses pour qu'il fasse d'abord a = b puis ensuite b != c : (a = b) != c
    - mettre ton code en deux lignes : a = b; puis if(b != c)

    EDIT : je ne fait que présenter les deux solutions possibles, il va sans dire que la deuxième solution est bien meilleurs que la première car c'est beaucoup plus lisible et ce sans aucune perte de performance.

  18. #18
    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
    Y a du nouveau !

    Donc voilà ma boucle while modifiée mais qui ne finit pas, mais j'arrive cette fois ci à recevoir l'ensemble du texte du fichier envoyé. le problème c'est que le dernier paragraphe est recopié infiniment dans le fichier.

    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
     
     
    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,BUFZISE, 1,fichier_src);
        printf("===========================\n");
            printf("test : %d\n",totalbytes);
        printf("===========================\n");
     
        }
     
        while(totalbytes<BUFZISE)
        {
     
            /* Si l'on reçoit des informations : on les affiche à l'écran */
            if(totalbytes=recv(sock, buffer, 1024, 0) != SOCKET_ERROR)
        totalbytes = totalbytes + bytesrecu;
        fwrite(buffer,1024, 1,fichier_src);
            printf("test : %d\n", totalbytes);
     
        }
     
        fclose(fichier_src);
            }
            /* sinon, on affiche "Impossible de se connecter" */
            else
            {
                printf("Impossible de se connecter\n");
            }
    désolé, tout ce que je fais me permet d'apprendre la programmation, je ne suis pas brillant dans le domaine je le sais.

  19. #19
    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
    Citation Envoyé par Neckara Voir le message
    Tu as alors deux solutions :
    - mettre des parenthèses pour qu'il fasse d'abord a = b puis ensuite b != c : (a = b) != c
    - mettre ton code en deux lignes : a = b; puis if(b != c)EDIT : je ne fait que présenter les deux solutions possibles, il va sans dire que la deuxième solution est bien meilleurs que la première car c'est beaucoup plus lisible et ce sans aucune perte de performance.
    Surtout pour un débutant. je n'ai jamais compris l'intérêt de condenser un code sur une ligne.

  20. #20
    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
    Citation Envoyé par fusionfroide Voir le message
    Y a du nouveau !

    Donc voilà ma boucle while modifiée mais qui ne finit pas, mais j'arrive cette fois ci à recevoir l'ensemble du texte du fichier envoyé. le problème c'est que le dernier paragraphe est recopié infiniment dans le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ....
            
        while(totalbytes<BUFZISE)
        {
        
            /* Si l'on reçoit des informations : on les affiche à l'écran */
            if(totalbytes=recv(sock, buffer, 1024, 0) != SOCKET_ERROR)
        totalbytes = totalbytes + bytesrecu;
        fwrite(buffer,1024, 1,fichier_src);
            printf("test : %d\n", totalbytes);
    
        }
        ....
    désolé, tout ce que je fais me permet d'apprendre la programmation, je ne suis pas brillant dans le domaine je le sais.
    En plus de condenser le code sur une ligne, tu as un gros souci avec les accolades, à mon avis.

    perso, un code qui marche devrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        while(totalbytes<BUFZISE)
        {
           bytesrecu=recv(sock, buffer, 1024, 0) 
            /* Si l'on reçoit des informations : on les affiche à l'écran */
           if(bytesrecu!= SOCKET_ERROR) 
           {
              totalbytes = totalbytes + bytesrecu;
             fwrite(buffer,1024, 1,fichier_src);
           }
            printf("test : %d\n", totalbytes);
        }

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