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 :

TCP : réception de données


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut TCP : réception de données
    Bonjour

    Je souhaiterai envoyer une structure d'un client vers un serveur

    La question que je me pose est : est ce que c'est possible que ma structure arrive en plusieurs fois ?
    Donc est ce que je dois verifier si la taille du paquet reçu est plus petite que ma structure alors refaire un recv de la taille manquante.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = recv(sock, &maStruct, sizeof maStruct);
    if( i < sizeof maStruct)
    	i = recv(sock, &maStruct[i], sizeof maStruct - i)
    Bien sur il faudrait en fait faire une boucle jusqu'a avoir recu sizeof maStruct...

    Ou est ce que ça ne peut pas arriver ?

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    Bonjour

    Je souhaiterai envoyer une structure d'un client vers un serveur

    La question que je me pose est : est ce que c'est possible que ma structure arrive en plusieurs fois ?
    Donc est ce que je dois verifier si la taille du paquet reçu est plus petite que ma structure alors refaire un recv de la taille manquante.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = recv(sock, &maStruct, sizeof maStruct);
    if( i < sizeof maStruct)
    	i = recv(sock, &maStruct[i], sizeof maStruct - i)
    Bien sur il faudrait en fait faire une boucle jusqu'a avoir recu sizeof maStruct...

    Ou est ce que ça ne peut pas arriver ?
    Plusieurs fois, non. Dans un format inconnu du récepteur, en petits morceaux... Oui, c'est possible...

    Pour ce qui est du format, la problématique est connue.

    http://emmanuel-delahaye.developpez....m#enreg_struct

    l'exemple est donné pour un fichier, mais avec les sockets, c'est le même principe.

    Pour ce qui est du découpage, à toi d'assembler le texte correctement par lignes avant de le traiter.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    merci

    J'ai maintenant une autre question.

    Sachant que dans la permiere partie de ce message j'ai la longueur du message ainsi que le type de la structure, est ce que je peux faire ceci :

    Lire longueur dans la premiere partie du message avec le flag MSG_PEEK, puis allouer un char buffer[longueur] et lire le message dans buffer.
    Puis caster buffer avec le type de la structure indiqué :
    (struct X * )buffer

    Si c'est pas possible je peux aussi faire un switch sur toute les structures possibles et selon le cas delcarer la bonne structure et faire un recv avec l'adresse de la structure mais ça serait plus long à écrire.

    Je débute en programmation réseau donc toutes les suggestions sont bienvenue.

    PS : les données contenues dans ces structures sont crées de facon à être équivalentes quelque soit l'architecture.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux le faire, mais ce n'est pas conseillé car pas portable.
    Renseigne-toi sur ce qu'est la sérialisation (l'art de convertir des structures en une bête suite d'octets)...

    J'en ai un petit exemple ici: http://www.developpez.net/forums/sho...56#post3071556
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    as tu vu mon PS ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, non, je ne l'avais pas vu
    Peux-tu montrer un aperçu du code, que je vois comment on fait ça?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    PS : les données contenues dans ces structures sont crées de facon à être équivalentes quelque soit l'architecture.
    Mais pas la structure elle même. La seule 'structure' portable est un tableau de unsigned char.

    Tu n'as donc pas lu mon article ? Je perds mon temps à te répondre ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Mais pas la structure elle même. La seule 'structure' portable est un tableau de unsigned char.

    Tu n'as donc pas lu mon article ? Je perds mon temps à te répondre ?
    Si j'ai lu ton article mais ma question était niveau reception en un seul bloc ou pas de la structure puis de savoir si on peut la caster ou pas.
    Ton article aborde un autre problème qui est de faire en sorte que la structure soit la même quelque soit la machine qui exécute le programme, ce qui est un autre problème (important je suis d'accord, mais ne mélangeons pas tout).

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Seul le format transmis doit être le même indépendamment de la machine et des options de compilation. La structure elle-même n'est pas censée être liée par ce genre de règle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. réception de données TCP/IP Modbus VBA Excel
    Par le boulet dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/12/2022, 08h59
  2. Réponses: 2
    Dernier message: 06/06/2006, 12h10
  3. Réponses: 7
    Dernier message: 22/05/2006, 14h44
  4. [VB6]Réception de données sur port série
    Par lindecker dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/03/2006, 06h48
  5. Réponses: 5
    Dernier message: 11/03/2004, 15h34

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