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

Réseau C Discussion :

Problème réception chaine fonction recv()


Sujet :

Réseau C

  1. #1
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut Problème réception chaine fonction recv()
    bonjour tout le monde..
    J'ai un p'tit problème avec la fonction recv(): cette dernière ne me récupère que le dernier caractère envoyé. j'ai développé 2 app, un serveur qui écoute sur un port, dès qu'un client se connecte, le serveur lui envoi un mot de bienvenue, mais là mon client ne récupère que la dernière lettre du mot ( le t du mot Salut), hors en utilisant le client telnet M$ , j'ai la chaine complète. d'où peut venir le problème ?
    là pour l'éviter, je suis obligé d'envoyé ma chaine caractère par caractère, et faire de même pour la récupérer du coté client. là ça marche, mais coté performance c'est pas vraiment joli

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par nostalgius Voir le message
    ... d'où peut venir le problème ? ...
    Du client ou du serveur mais sans plus de code, on ne saura t'aider.

    Montre nous le code du client (ou au moins l'envoi des caractères) et le code de serveur (ou au moins la réception des caractères)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Re,
    comme je disais j'ai testé mon serveur avec le client telnet de micro****, et là je récupérai la totalité de la chaine envoyée par le serveur, ce qui me laisse pensé que le problème vient de ma fonction recoi_donnees(), voici le code des deux fonctions:

    //Fonction envoi_donnees():

    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
    int envoi_donnees(SOCKET sur_socket)
    {
        int retour = 1;
        char data[]="Salut";
        char t_donnees_a_envoyer[10] = {0};
        sprintf(t_donnees_a_envoyer, "%d", strlen(data));
        int i;
        for(i=0;i<strlen(t_donnees_a_envoyer);i++)
        {
            if(send(sur_socket, &t_donnees_a_envoyer[i], 1, 1)!= SOCKET_ERROR)
            {
                //printf("\n\tSucces envoi taille donnees (%d).", atoi(t_donnees_a_envoyer));
            }else{
                retour = 0;
                break;
            }
        }
        if(retour == 1){
            send(sur_socket, &t_donnees_a_envoyer[strlen(t_donnees_a_envoyer)+1], 1, 1); //j'ajoute le '\0'
                if (send(sur_socket, data, strlen(data) ,1) == SOCKET_ERROR)
                    {
                        printf("\n\tErreur envoi donnees.");
                        retour = 0;
                    }
                else printf("\n\tSucces envoi donnees (%s).", data);
        }else { printf("\n\tErreur envoi taille donnees."); }
        return retour;
    }
    Fonction recoi_donnees()
    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
    int  recoi_donnees(SOCKET sur_socket)
    {
        int retour = 1;
        char t_donnees_a_recevoir[10];
        int i = -1;
        do
        {
            i++;
            if(recv(sur_socket, &t_donnees_a_recevoir[i], 1, 1) != SOCKET_ERROR)
            {
                printf("\n\tSucces reception donnees: %c", t_donnees_a_recevoir[i]);
            }else{
                retour = 0;
                break;
            }
        }while(t_donnees_a_recevoir[i]!='\0');
     
        if(retour == 1)
        {
            int taille=atoi(t_donnees_a_recevoir);
            int t=0, t_donnees_recu=0;
            char* data_recu = malloc(taille*sizeof(char));
            for(i=0;i<taille;i++) data_recu[0]='\0';
            while(t_donnees_recu<taille)
            {
                t=recv(sur_socket, data_recu+t_donnees_recu, 1, 1);
                if (t == SOCKET_ERROR)
                {
                    printf("\n\tErreur reception donnees @ %d.", t_donnees_recu);
                    retour = 0;
                    break;
                }
                else{
                    printf("\n\tSucces reception donnees (%d:%s).", t_donnees_recu, data_recu+t_donnees_recu);
                    t_donnees_recu += t;
                }
            }
            data_recu[i]='\0';
            printf("\n\tdonnees recues (%s).", data_recu);
        }else { printf("\n\tErreur reception donnees."); }
     
        return retour;
    }
    Résultat avec telnet:

    ça marche
    Résultat avec mon client:

    je n'ai que le dernier caractère

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Il va falloir travailler la présentation jeune padawan

    1 pb dans la fonction recoi_donnees() : si tu recois 5 caractères, tu alloues 5 caractères et tu mets quand même un \0 en final (donc en dehors du bloc alloué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* data_recu = malloc((taille + 1) * sizeof(char));
    Au fait, le retour d'un malloc(), cela se teste même si cela échoue rarement

    Un autre pb ici (pas grave mais cela ne fait pas ce que tu penses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<taille;i++) data_recu[i]='\0';
    Pourquoi fais tu systématiquement un send() avec 1 comme dernier paramètre. Le 4 eme parametre attend 0 ou bien un ou logique avec MSG_OOB, MSG_DONTROUTE, MSG_DONTWAIT et MSG_NOSIGNAL. Je pense que dans ton cas, 0 suffit largement (même remarque pour la fonction recv()).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    Merci pour la réponse aussi rapide
    je vais mettre le dernier paramètre de send() à 0, modifier la taille d'allocation et supprimer la ligne d'initialisation de toutes les cases de data_recu. Et voire si ça marche. merci encore

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Dans la fonction envoi_donnees(), tu peux remplacer le code :
    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
    int envoi_donnees(SOCKET sur_socket)
    {
       int retour = 1;
       char data[]="Salut";
       char t_donnees_a_envoyer[10] = {0};
       sprintf(t_donnees_a_envoyer, "%d", strlen(data));
     
       int i;
       for(i=0;i<strlen(t_donnees_a_envoyer);i++)
       {
          if(send(sur_socket, &t_donnees_a_envoyer[i], 1, 1)!= SOCKET_ERROR)
          {
             //printf("\n\tSucces envoi taille donnees (%d).", atoi(t_donnees_a_envoyer));
          }
          else
          {
             retour = 0;
             break;
          }
       }
       if(retour == 1)
       {
          send(sur_socket, &t_donnees_a_envoyer[strlen(t_donnees_a_envoyer)+1], 1, 1); //j'ajoute le '\0'
    par

    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
    int envoi_donnees(SOCKET sur_socket)
    {
       int retour = 1;
       char data[]="Salut";
       char t_donnees_a_envoyer[10] = {0};
       sprintf(t_donnees_a_envoyer, "%d", strlen(data));
     
          if(send(sur_socket, t_donnees_a_envoyer, strlen(t_donnees_a_envoyer) + 1, 0)!= SOCKET_ERROR)
          {
             //printf("\n\tSucces envoi taille donnees (%d).", atoi(t_donnees_a_envoyer));
          }
          else
          {
             retour = 0;
             break;
          }
       }
       if(retour == 1)
       {
    Tu y gagneras en concision et en clarté
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut


    Merci énormément
    c'est résolu! mon client reçoit la chaine entière, tout venait du dernier paramètre
    de send()/recv() .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Bon, maintenant que ton programme fonctionne, il est temps de le rendre plus joli (le code) et plus fiable aussi.

    Je suis sûr que le programme ne fonctionne plus si au lieu d'envoyer "Salut", on envoit "Il fait beau et chaud".
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    je l'utilisai pour garantir l'envoi totale de la taille, mais maintenant j'en ai plus besoin, oui, je ferai mieux de supprimer toutes ces lignes, merci encore vous m'avez été d'une grande aide passez une bonne fin de journée.

  10. #10
    Membre averti
    Inscrit en
    Mai 2010
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 11
    Par défaut
    oui, ça a donnée quelque chose du genre:

    mais en initialisant le tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;i<taille+1;i++) data_recu[i]='\0';
    ça pose plus de prb:

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec la fonction permuter de deux chaine
    Par abdou monta dans le forum Débuter
    Réponses: 4
    Dernier message: 08/04/2014, 23h37
  2. Gros problème pour chaine str déterminer par fonction
    Par MediaVistaIntel dans le forum Général Python
    Réponses: 6
    Dernier message: 16/06/2012, 16h34
  3. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  4. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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