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

VB.NET Discussion :

[VB.Net]Pourquoi mon socket ne bloque pas lors de réception?


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut [VB.Net]Pourquoi mon socket ne bloque pas lors de réception?
    Bonjour à tous,

    Je suis actuellement sur une application client/serveur avec socket en dotnet.

    Mon client se connecte tout simplement avec socket.connect(...)

    Je souhaite ensuite passer en mode "ecoute" pour attendre les réceptions de message.

    J'ai donc une boucle "infinie" dans laquelle j'attend la réception de messages.
    Toutefois cela ne bloque pas, il n'attend pas d'avoir un message et continue a boucler...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                While True
                    socketClient.Receive(buffer, 0, socketClient.Available, SocketFlags.None)
                End While
    Pourquoi ? si vous avez besoin de plus d'éléments n'hésitez pas.

    La valeur de retour de cette fonction est bien 0 lorsqu'il n'y a rien a recevoir...

    Merci @+

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Je n'y connais pas grand chose en Socket mais pourquoi ne pas utiliser la capture d'un évènement plutôt qu'une boucle while :

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Je ne crois pas que ça soit faisable, les socket n'ont pas d'évenements comme peuvent l'avoir les composants.

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    socketClient.Available est la taille des données disponible dans la socket.

    Or si il n'y a rien à lire, il vaut .... 0. Ce qui revient à demander de lire 0 octets. C'est pour cela que ton receive n'attend pas.

    Il faut mettre une valeur fixe. (Le minimum de ce que tu t'attends à recevoir)

    Exple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim TailleMinimaleDunMsg as integer = 256
    socketClient.Receive(buffer, 0, TailleMinimaleDunMsg, SocketFlags.None)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Hello,

    Ton explication m'a aidée en effet, il attend de recevoir la valeur du paramèter size avant de continuer, dans mon cas il attendais zero donc ça bouclait.

    Maintenant ce paramètre n'est pas la taille minimale mais la taille exacte de ce que tu t'attends a recevoir.

    Donc si par exemple je fais quelquechose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    If socketClient.Available > 0 Then
        size = socketClient.Available
    Else
       size = 2
    End If
    Dim buffer(size) As Byte
     retour = socketClient.Receive(buffer, 0, size, SocketFlags.None)
    Il va me découper mon message en deux si fait plus de 2 et ne va pas le recevoir si je lui demande 1024 par exemple.

    Si il n'y a pas d'aute solution comment faire pour "concaténer" mes deux tableaux de byte ?

    +

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par shgamer
    Il va me découper mon message en deux si fait plus de 2 et ne va pas le recevoir si je lui demande 1024 par exemple.

    Si il n'y a pas d'aute solution comment faire pour "concaténer" mes deux tableaux de byte ?

    +
    C'est pour cela que je te parlais de Taille Minimal du message. Tu dois savoir en concevant ton application quelle est la taille minimal de ce que tu vas recevoir pour être capable de le traiter.

    Imagine que tes messages sont formatés comme ceci

    "#START#0025Message de 25 charactères#FIN#"
    Ta socket devra d'abord lire 11 charactères (Taille de #Start# + 4, les 4 charactères après #Start# representent la taille du message sans les balises)
    Donc tu lis 11.
    Puis tu analyse les 11 en prenant la taille du messages (25 dans notre exple)
    Pour tu refais un Receive de 25 + taille("#FIN#")

    En espérant que cet exple t'aidera

    PS: Je sais que le paramètre size de receive c'est le nombre de données à lire. Tant que ce nombre n'est pas atteint Receive bloque.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Et bien je te remercie pour ton aide j'ai réussi a m'en sortir grâce à tes conseils

    +

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

Discussions similaires

  1. [VB.Net/DataReader] Pourquoi mon ExecuteReader ne fonctionne pas ?
    Par emeraudes dans le forum Accès aux données
    Réponses: 8
    Dernier message: 21/08/2006, 13h38
  2. Réponses: 2
    Dernier message: 31/07/2006, 08h48
  3. [C# 2.0] Pourquoi mon DataAdapter n'est pas instancié ?
    Par FraktaL dans le forum Services Web
    Réponses: 2
    Dernier message: 04/07/2006, 00h04
  4. Réponses: 10
    Dernier message: 30/06/2006, 18h48
  5. Pourquoi mon script ne marche pas?
    Par amarcil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/05/2006, 21h37

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