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] 2 fonctions send() à la suite, j'aimerais avoir 2 recv


Sujet :

Réseau C

  1. #1
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut [Socket] 2 fonctions send() à la suite, j'aimerais avoir 2 recv
    Bonjour à tous,

    Je fais appel à 2 fonctions send() l'une à la suite de l'autre, j'aimerais que dans mon programme recevant, il reçoive les données lors de 2 appels à recv() différents.

    Pour schématiser, en ce moment j'ai
    send("hello");
    send("world");
    et je reçois dans mon serveur
    recv("helloworld")
    et j'aimerais
    recv("hello");
    recv("world");

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par muad'dib
    Bonjour à tous,

    Je fais appel à 2 fonctions send() l'une à la suite de l'autre, j'aimerais que dans mon programme recevant, il reçoive les données lors de 2 appels à recv() différents.

    Pour schématiser, en ce moment j'ai et je reçois dans mon serveur et j'aimerais
    On a aucun contrôle sur ce genre de chose. Ce qu'on met dans le tuyau par quand il veut et arrive quand il veut. La seule chose qui soit garantie (en TCP), c'est l'intégrité et la chronologie des données.

    C'est pour ça qu'au niveau applicatif, on est censé définir, et donc placer, des délimiteurs de fin de lignes pour pouvoir séparer les informations (Rappel : en mode texte, on ne transmet jamais le 0 de fin de chaine car non portable). Après, en réception, on est libre des les 'assembler' comme on veut.

    On émet :

    send("hello\n");
    send("world\n");

    on reçoit, par exemple

    "hello\nwo"
    "rld\n"

    ou

    "hello\nworld\n"

    que l'on reconstruit ensuite en

    "hello\n"
    "world\n"

    Ceci peut aider :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module REC

  3. #3
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Ok merci pour la réponse. Et imaginons que je transmette des données binaires dont le contenu peut contenir des caractères allant de 0x0 à 0xffffff ? Ce que je veux dire, c'est que si le caractère délimiteur peut se retrouver dans les données à transmettre, je n'ai aucun moyen de reconstruire les données

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par muad'dib
    Ok merci pour la réponse. Et imaginons que je transmette des données binaires dont le contenu peut contenir des caractères allant de 0x0 à 0xffffff ? Ce que je veux dire, c'est que si le caractère délimiteur peut se retrouver dans les données à transmettre, je n'ai aucun moyen de reconstruire les données
    L'utilisation de "caracteres balises" pour separer les messages n'est pas la seule possibilite. Tu peux egalement transmettre la taille du message avant le message, utiliser un format du style BER TLV ou autre, travailler avec des structures de taille fixe, etc.
    Il est meme possible de continuer a utiliser la technique du marqueur de fin meme dans ton cas de figure en le doublant par exemple si il s'agit d'une donnee reelle et non du marqueur de fin.

    En clair il faut creer un protocole applicatif.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par muad'dib
    Ok merci pour la réponse. Et imaginons que je transmette des données binaires dont le contenu peut contenir des caractères allant de 0x0 à 0xffffff ? Ce que je veux dire, c'est que si le caractère délimiteur peut se retrouver dans les données à transmettre, je n'ai aucun moyen de reconstruire les données
    Comme tous les flux, le réseau ne sait transmettre que des octets. Les valeurs possibles vont donc de 0 à 255 (0x00 - 0xFF).

    Si tu transmets des données binaire, tu ne peux plus utiliser les structures de textes (lignes). Il faut alors utiliser d'autres techniques. Le plus simple (transfert de fichier, par exemple) est de transmettre d'abord (en texte, par exemple) les informations utiles (chemin, nom, taille, date...), puis les données 'en vrac', eventuellement suivies d'un 'checksum' (ou CRC...)

    Comme le récepteur connait la taille, tant qu'il n'a pas reçu la totalité, continue à enregistrer ce qu'il reçoit. Quand la taille est atteinte, il reçoit éventuelle le CRC et vérifie l'intégrité du fichier.

    Un timeout applicatif (select()...) permet de sortir des situations d'erreurs critiques (plus de réseau etc.)

    Une étude des protocoles FTP ou, plus simplement, TFTP permet de mieux comprendre ces mécanismes...

Discussions similaires

  1. Réponses: 12
    Dernier message: 26/08/2006, 11h29
  2. Pb de socket : select() et send()
    Par olive_le_malin dans le forum Réseau
    Réponses: 16
    Dernier message: 11/06/2006, 11h42
  3. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47
  4. blocage de la fonction : send
    Par fregolo52 dans le forum Réseau
    Réponses: 5
    Dernier message: 20/09/2005, 09h10
  5. [SOCKET C] deux send() pour un recv()
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 01/12/2003, 19h13

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