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 :

Socket: taille d'une chaine de caractères inconnue


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Par défaut Socket: taille d'une chaine de caractères inconnue
    Bonjour,

    je souhaite établir une communication client/serveur en utilisant les socket, dans cette communication le client envoi une chaine de caractère de taille inconnu, mon code fonctionne bien si la chaine ne contient pas d'espace:
    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
     
    /* traitement de la requete du client */
            printf("j'ai reçu: ");
            buffer[MAX -1]='\0';
     
            for(;;){
            if((nbOcetesRecu=recv(sock_trans,buffer,sizeof(buffer) -1,0))<0){
                    printf("problème d'envoi ");
                    shutdown(sock_trans,2);
                    close(sock_trans);
                    close(sock_conn);
                    exit(0);
            }
                    printf("%s",buffer);
     
                    if(buffer[nbOcetesRecu-1]=='\0'){
                      break;
                    }
            }
    je crois que le problème est dans le test pour sortir de la boucle mais je ne sais pas par quoi peut on le remplacer ?

    Merci pour votre aide.
    E. Bazoga

  2. #2
    Membre émérite
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Par défaut
    quand tu envoies un message de ton client, tu le ferais en utilisant scanf par hasard ?

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Par défaut
    Citation Envoyé par mitkl Voir le message
    quand tu envoies un message de ton client, tu le ferais en utilisant scanf par hasard ?
    oui

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    scanf n'est pas l'ami de ' ' quand son pote %s est dans le coin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char *argv[])
    {
        const char *message = "deux mots a te dire";
        char buffer[250] = {0};
        sscanf(message, "%s", buffer);
        printf("Buffer = '%s'", buffer);
        return 0;
    }
    affiche :
    C'est sûrement à ce genre de cas que pense mitkl.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Par défaut
    Citation Envoyé par mitkl Voir le message
    quand tu envoies un message de ton client, tu le ferais en utilisant scanf par hasard ?
    Merci pour la réponse, en effet j'ai changé la fonction scanf par gets et ça a marché, juste une petite question :quand on envoi une chaine de caractère, est ce que le caractère de fin de chaîne (\0) lui aussi est envoyé ?

    Merci encore une fois.
    E.Bazoga

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    /!\ Il ne faut jamais utiliser la fonction gets /!\
    http://man.developpez.com/man3/gets.3.php --> voir la section BOGUE
    http://c.developpez.com/faq/index.ph..._gets_vs_fgets --> il faut utiliser fgets() en remplacement


    Parce que je suis motivé, un code exemple : il suffit de taper "bonjour" pour voir que ça va être le bazar.
    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 main(int argc, char *argv[])
    {
        struct
        {
            char chaine[4] ;
            int entier;
        } demo ;
     
        demo.chaine[0] = 'a';
        demo.chaine[1] = 'b';
        demo.chaine[2] = 'c';
        demo.chaine[3] = '\0';
        demo.entier = 42;
     
        printf("'%s' %d\n", demo.chaine, demo.entier);
     
        printf("Saisir une chaine : \n");
        gets(demo.chaine);
     
        printf("'%s' %d\n", demo.chaine, demo.entier);
     
        return demo.entier;
    }

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Par défaut
    Citation Envoyé par bazoga Voir le message
    quand on envoi une chaine de caractère, est ce que le caractère de fin de chaîne (\0) lui aussi est envoyé ?

    Merci encore une fois.
    E.Bazoga
    j'attends la réponse.

  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
    Citation Envoyé par bazoga Voir le message
    j'attends la réponse.
    Réponse de normand : ca dépend.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * str = "bonjour";
    nbOcetessend=send(sock_trans, str, strlen(str), 0);
    nbOcetessend = 7 et le dernier caractère envoyée est le caractère 'r'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * str = "bonjour";
    nbOcetessend=send(sock_trans, str, strlen(str) + 1, 0);
    nbOcetessend = 8 et le dernier caractère envoyée est le caractère '\0'
    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 confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Par défaut
    Merci bien pour vos réponses

    A+

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bazoga Voir le message
    quand on envoi une chaine de caractère, est ce que le caractère de fin de chaîne (\0) lui aussi est envoyé ?
    Salut
    C'est toi qui définit combien d'octets tu envoies dans ta socket. Donc si tu veux faire passer le '\0' ; à toi de le spécifier en envoyant (strlen(chaine) + 1) octets.

    Citation Envoyé par bazoga Voir le message
    j'attends la réponse.
    Oui ben au lieu de t'impatienter de cette façon si discourtoise (sans même faire l'effort de lire le post de Bktero qui t'explique un point mille fois plus important que ta question à 2 balles) ; tu aurais réfléchi un minimum tu l'aurais trouvée tout seul...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. la taille d'une chaine du caractére
    Par farid0031 dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/04/2009, 09h24
  2. taille d'une chaine de caractère
    Par Magical dans le forum Langage
    Réponses: 10
    Dernier message: 26/07/2007, 16h36
  3. [mysql 4.11] Select sur la taille d'une chaine de caractère
    Par epeichette dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/06/2007, 09h50
  4. Taille d'une chaine de caractères en PL/SQL
    Par soumou dans le forum PL/SQL
    Réponses: 3
    Dernier message: 02/11/2006, 21h29
  5. la taille d'une chaine de caractère
    Par rakhaoui dans le forum ASP
    Réponses: 2
    Dernier message: 05/06/2006, 14h01

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