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 : Envoi d'un message de taille variable


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut Socket : Envoi d'un message de taille variable
    Bonjour, je programme une petite appli avec des sockets, et j'ai un petit problème : est-ce possible d'envoyer en UDP et surtout de recevoir une chaîne de caractère de taille inconnue ?
    Je m'explique : sur tous les exemples que j'ai pu voir, on a d'un côté un envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sendto(socket, message, strlen(msg), 0, (struct sockaddr *)&contact, sizeof(struct sockaddr_in))
    Et de l'autre côté, le recepteur qui fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buffer[1024];
    struct sockaddr_in client;
    recvfrom(socket, buffer, sizeof(buffer), 0, (struct sockaddr *) &client, sizeof(struct sockaddr_in))
    Mais moi j'aimerais récupérer le message dans un char * car je ne sais pas à priori la taille du message que je vais recevoir !
    Est-ce possible ?


    Merci d'avance !!

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je t'invites à regarder le manuel de recvfrom http://man.developpez.com/man2/recv.2.php

    Cette fonction retourne le nombre d'octet lu.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut
    Justement, dans la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, socklen_t *fromlen);
    je ne sais pas à l'avance si la longueur retournée ne sera pas plus grande que la longueur de buf (qui est symbolisée par la variable len si je ne me trompe pas)... C'est sur ce point que je bloque...

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Non, la taille sera toujours plus petite (ou égale) à la taille du buffer indiqué par len.

    (sinon, ça pourrait faire rapidement une erreur de segmentation)

    Pour tous les appels systèmes, pense bien à regarder les valeurs de retour (donc aussi avec sendto) pour gérer les erreurs.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Par défaut
    Donc si je te comprend bien, ce n'est pas possible de recevoir des messages de taille max variable, je dois me débrouiller pour envoyer mes infos dans un message de taille fixe, quitte à l'envoyer en plusieurs morceaux ?

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par zarbiman Voir le message
    Donc si je te comprend bien, ce n'est pas possible de recevoir des messages de taille max variable, je dois me débrouiller pour envoyer mes infos dans un message de taille fixe, quitte à l'envoyer en plusieurs morceaux ?
    L'envoie peut se faire en un appel système (même si souvent, un appel send sur un très gros buffer n'arrivera pas à envoyer d'un coup le buffer), il est nécessaire de lire le nombre d'octet envoyé avec send pour envoyer le reste.

    La réception doit se faire éventuellement en plusieurs appels systèmes, notamment car on ne connait pas forcement la taille du paquet (et que si la taille est grosse, l'appel système n'arrivera jamais à lire d'un coup un gros buffer). C'est d'ailleurs pourquoi on redéfini des protocoles de plus haut niveau pour gérer ces soucis.



    Attention, d'un côté tu peux envoyer un petit paquet de taille 10. Et du côté serveur, il se peut que recvfrom n'arrive pas à lire en un coup les 10 et n'en lise que 5 (et donc il faut à nouveau faire appel à recfrom pour continuer la lecture jusqu'à ce que tout ait été lu)

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

Discussions similaires

  1. Socket envoi message Client/Serveur
    Par sebkill dans le forum C#
    Réponses: 27
    Dernier message: 28/05/2008, 22h34
  2. Ouverture de connexion et envoi d'un message par socket
    Par loleske dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/02/2005, 12h52
  3. A respecter lors de l'envoi d'un message (Version 2)
    Par Aurelien.Regat-Barrel dans le forum Windows
    Réponses: 0
    Dernier message: 04/01/2003, 15h59
  4. [Socket]envoie de fichier!!!
    Par SamDaKap dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2002, 08h07

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