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

Windows Discussion :

[winsock.h] Fonction recv() pour un socket en C


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Points : 9
    Points
    9
    Par défaut [winsock.h] Fonction recv() pour un socket en C
    Bonjour,

    Je voudrais vous soumettre mon problème afin d'espérer votre aide.

    Mon application en développement doit se connecter à un serveur distant que je ne gère pas. Je veux simplement capter les paquets qu'il m'envoie afin de les imprimer à l'écran. (un petit sniffer quoi )

    Voici mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <...>
    nbre_octet = 1;
    
    while&#40;&#40;nbre_octet != SOCKET_ERROR&#41;&&&#40;nbre_octet > 0&#41;&#41;
    &#123;
      nbre_octet = recv&#40;sd,&tampon,1,0&#41;;
      printf&#40;"%c", tampon&#41;;
    &#125;
    Ne connaissant pas la taille du buffer, je capte un par un les octets afin des les imprimer.

    Ceci marche parfaitement puisque je peux voir à l'écran le contenu du buffer. Cepandant, je ne sors jamais de la boucle WHILE, le programme est toujours en attente de réception.

    Comment faire pour quitter la boucle quand je n'ai plus de données à recevoir ? (je rappelle que je ne connais pas la taille du buffer à l'avance).

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    pourquoi tu ne dis pas tout simplement a ton serveur d'envoyer un ou plusieurs octets pour signifier au client que le transfert est fini.
    puis tu teste ce que tu a recu et si c'est la commande de fin tu quitte la boucle.

    on sinon tu fais que ton serveur detruit le socket de connection et to n client teste si la connection est toujours presente

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Tout simplement parce que j'ai dit que je ne gérais pas le serveur.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Le plus étrange est que lorsque je déclare mon buffer en Char et que je fais un printf %c il affiche le contenu correctement.

    Si je déclare le tampon en Char buffer[1024] (1024 par exemple...), et que je printf avec %s il m'affiche n'importe quoi. Même si j'initialise mon buffer avant en le remplissant.

    Vraiment aucune idée pour m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <..>
    char buffer&#91;1024&#93;;
    <..>
    recv&#40;sock, buffer, 1024, 0&#41;;
    printf&#40;"%s", buffer&#41;;
    Ne marche pas nonplus : il affiche rien.

  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 Hikaru
    Le plus étrange est que lorsque je déclare mon buffer en Char et que je fais un printf %c il affiche le contenu correctement.

    Si je déclare le tampon en Char buffer[1024] (1024 par exemple...), et que je printf avec %s il m'affiche n'importe quoi. Même si j'initialise mon buffer avant en le remplissant.

    Vraiment aucune idée pour m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <..>
    char buffer&#91;1024&#93;;
    <..>
    recv&#40;sock, buffer, 1024, 0&#41;;
    printf&#40;"%s", buffer&#41;;
    Ne marche pas nonplus : il affiche rien.
    Les flux de données ne sont pas forcément de chaines de caractères C valides.

    On ne peut donc pas utiliser les fonctions 'chaines' pour traiter le bloc. Ou alors, puisqu'on en connait la taille utile, on peut ajouter un 0 au bon endroit pour en faire une chaine (ne pas déborder). Encore faut-il que les données soient imprimables pour donner un résultat exploitable sur écran ou dans un fichier texte.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    J'ai résolu mon problème depuis le temps, j'avais oublié la balise [résolu].

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

Discussions similaires

  1. [socket] résultat de la fonction recv
    Par alana dans le forum Débuter
    Réponses: 4
    Dernier message: 22/07/2008, 13h14
  2. Winsock fonction recv pas fiable?
    Par ssmint dans le forum Développement
    Réponses: 4
    Dernier message: 26/11/2007, 20h41
  3. Socket : fonction recv.
    Par thieum74 dans le forum C++
    Réponses: 7
    Dernier message: 06/04/2006, 10h18
  4. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  5. Réponses: 2
    Dernier message: 31/05/2005, 09h50

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