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 :

Socket - Réception de plusieurs données à la suite


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut Socket - Réception de plusieurs données à la suite
    Bonjours tous le monde,

    je voudrais savoir s'il est possible, via une socket, de recevoir deux messages à la suite?

    J'ai un programme C qui communique avec un client php via une socket locale. Voici les codes :

    Pour le serveur (en C) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    recv(s,execution.path, sizeof(execution.path), 0);
    printf("%s\n",execution.path);
    recv(s,execution.email, sizeof(execution.email), 0);
    printf("%s\n",execution.email);
    Pour le client (en php) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    fputs($idSocket,$path."\0"); 
    fputs($idSocket,$email."\0"); 
    ?>
    Le problème est que mon programme C bloque sur le deuxième recv.
    Il m'imprime bien le contenu de execution.path mais n'arrive pas à recevoir la deuxième chaine de caractères.

    Je ne comprend pas pourquoi car je ne ferme la socket qu'après...donc en principe la socket devrait continuer à écouter non?

    Merci d'avance

  2. #2
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    Le problème est que ton récepteur ne sait pas combien d'octets il va recevoir et il se désynchronise avec l'émetteur.

    Pour envoyer des chaines de caractères, il faut que l'émetteur envoie d'abord la longueur de la chaine puis la chaine.

    D'abord, cela permet au récepteur de préparer un buffer suffisemment grand (allocation dynamique par exemple). Ensuite, il sait exactement combien il va recevoir et donc la synchro n'est pas perdue.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Ok d'accord.

    Moi j'avais dans l'idée d'avoir une structure en C me permettant de récupérer toute les informations suceptible pour un client.

    J'avais donc établis ma structure comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct Execution execution;
     
    struct Execution
    {
        char path[200];
        char email[200];
    };
    J'avais donc une bonne supérieur pour le nombre de caractères de chaque information.

    Pour le premier envoie j'ai du mal à comprendre alors pourquoi il arrive à fonctionner car le client n'annonce pas le nombre de caractères envoyés (car je le suppose à chaque fois inférieur à 200). J'avais placé côté client le caractère spécial "/0" pour bien spécifier la fin de ma chaine justement.

    L'annonce se fait simplement par envoie d'un entier via la socket? Cette réception ne sera-t-elle pas bloqué à son tour?

    Merci pour ton aide Jenna

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Affiche le retour de recv (nombre de byte lus) tu comprendras qu'après le premier appel recv execution.path contient $path suivis de $mail.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    recv(s,execution.path, sizeof(execution.path), 0);
    printf("%s\n",execution.path);
    printf("%s\n",execution.path + strlen(execution.path) +1);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Ah oui

    Donc si je comprends bien tout ce que j'envoie en php est récupéré par le premier recv dans C?

    Pourquoi quand je faits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n",execution.path);
    je n'ai pas alors le resultat de $path et $mail à la suite? Je n'ai que le resultat de $path qui s'affiche or si je comprends bien (ce que je doute) dans execution.path il y a $path et $mail.
    Quand j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n",execution.path + strlen(execution.path) +1);
    là j'ai le résultat de $mail.

    Je ne vois vraiment plus comment faire alors pour envoyer toutes mes informations de php vers C Parce que je me dit que si j'envoye la taille avant le message tout va partir dans la même variable non?

    Quand on dit que l'emetteur doit annoncé la taille puis envoyer la chaine je dois faire ceci du côté client?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
    fputs($idSocket,strlen($path)); //taille de la chaine
    fputs($idSocket,$path."\0"); 
    fputs($idSocket,strlen($email));
    fputs($idSocket,$email."\0"); 
    ?>
    Je suis un peu dépassé j'avoue
    Parce que je ne vois pas d'autre alternative pour la communication php-C pour l'envoie de mes informations.

    Merci à tous

  6. #6
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par dvp_zero
    je n'ai pas alors le resultat de $path et $mail à la suite? Je n'ai que le resultat de $path qui s'affiche or si je comprends bien (ce que je doute) dans execution.path il y a $path et $mail.
    printf s'arrête au premier \0 rencontré

    Tu peux définir un buffer assez grand char buffer[400] pour accueillir en une seule fois les deux chaînes et ne pas te prendre la tête puisque tu es sûr que tes chaînes ne dépasseront pas 200 char chacune vu tes définitions :
    Citation Envoyé par dvp_zero
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Execution
    {
        char path[200];
        char email[200];
    };
    puis tu découpes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(execution.path, buffer);
    strcpy(execution.email, buffer + strlen(execution.path) +1);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup ssmario2 pour ta solution et tes explications.

    J'arrive enfin à faire ce que je désire avec ta solution

    Pour information, quand on utilise les fonctions de découpages ça reste toujours du C standard?
    J'ai importé le <String.h>.

    Voilà...topic résolu, merci à tous pour vos contributions!

  8. #8
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par dvp_zero Voir le message
    Pour information, quand on utilise les fonctions de découpages ça reste toujours du C standard?
    J'ai importé le <String.h>.
    Oui <string.h> est un header du standard C, strcpy sert à copier des chaîne de caractères.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    okok

    Merci pour tout

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

Discussions similaires

  1. Socket: Utilisation d'un port plusieurs fois de suite
    Par MrEddy dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 29/10/2012, 20h51
  2. [Flex4] RTM réception de plusieurs données
    Par telluri dans le forum Flex
    Réponses: 0
    Dernier message: 14/10/2011, 01h53
  3. réception série de plusieurs données
    Par moustiqu3 dans le forum C#
    Réponses: 6
    Dernier message: 02/05/2010, 20h20
  4. {VBA Excel}Copie de plusieurs données a la suite
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/06/2007, 15h40
  5. [nouveau] saisir plusieurs espace de suite ou tabuler
    Par siuol dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 28/02/2005, 12h32

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