Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : problème avec stringbuilder et socket [ Réseaux & Internet / Sockets ] (Kite37)

mardi 15 avril 2008 à 22:44:02 | problème avec stringbuilder et socket

Kite37

Bonjour !

Dans le cadre d'une mise en mode online d'un de mes logiciels, je me suis intéressé à l'utilisation en mode asynchrone des sockets.
Cependant, lors de la récupération des données (qui sont censée être stockées dans un stringbuilder jusqu'à lecture de la balise "<end>"), j'ai un problème assez génant.

Normalement, lorsqu'un message reçu ne contient pas "<end>", il est stocké dans le stringbuilder, et ainsi de suite jusqu'à ce qu'un message contenant "<end>" soit reçu, auquel cas le contenu du stringbuilder est affiché a l'écran dans son intégralité.

Mais voilà, malgré le code ci-dessous qui devrait théoriquement marcher, seul le premier message stocké dans le stringbuilder est affiché a l'écran au lieu de l'intégralité du contenu qu'il est censé recevoir..

Je ne sais pas si je suis très clair dans mes explications, veuillez m'en excuser .

Ci-dessou le code de la méthode asynchrone de réception de données et d'affichage. Il n'est pas commenté, mais je ne pense pas qu'il soit dur a comprendre.


Private Sub receiveCallBack(ByVal obj As IAsyncResult)
        Dim handler As Socket = CType(obj.AsyncState, Socket)

        Dim bytesInc As Integer = handler.EndReceive(obj)
        Dim data As String = String.Empty

        If bytesInc > 0 Then

            data = Encoding.UTF8.GetString(buffer)

            If data.IndexOf("<end>") > -1 Then
                data = sb.ToString() & Mid(data, 1, data.IndexOf("<end>"))

                sb.Remove(0, sb.Length)



                Me.txtInc.Text = data

                handler.BeginReceive(buffer, 0, bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), handler)
            Else
                sb.Append(data)
           
                handler.BeginReceive(buffer, 0, bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), handler)
            End If


        End If
      
    End Sub

J'espère que quelqu'un pourra me dépanner, merci d'avance.

Cordialement, Kite

mercredi 16 avril 2008 à 07:17:36 | Re : problème avec stringbuilder et socket

Renfield

Administrateur CodeS-SourceS
déclaré où, ton stringBuilder ?

je vois pas non plus ou est déclaré et affecté 'buffer'

mercredi 16 avril 2008 à 09:53:15 | Re : problème avec stringbuilder et socket

Kite37


Mon stringbuilder et mon buffer son des variables private normalement visibles dans tout le module.

mercredi 16 avril 2008 à 10:59:19 | Re : problème avec stringbuilder et socket

Megafan

Salut,

Effectivement coté code je vois rien d'anormal au premier abord, par contre quand tu dis

seul le premier message stocké dans le stringbuilder est affiché a l'écran au lieu de l'intégralité du contenu qu'il est censé recevoir..

A tu vérifié :

- Tu rentre 1 fois dans le callback sans avoir le <end> dans ton buffer ?
---> rentre tu a nouveau dans ton callback ? et tu  ne recois plus rien
- Tu peux tester si bytyeInc=0 , l'application distante n'a t'elle pas fermée le socket ?
---> quelle est la taille de ton buffer ?

- Personnelement en asynchrone je travaille toujours avec un StateObject (voir  msdn)
dans lequel je gére mon socket, mon buffer Asynchrone et mon buffer complet (ton sb)

Donne des nouvelles

@+ Megafan





mercredi 16 avril 2008 à 11:21:36 | Re : problème avec stringbuilder et socket

Kite37


Oui j'ai fait des test avec tout ce que tu me dis : je reçoit bien des données mais c'est lors de l'ajout au stringbuilder qu'il y a un problème.

Même chose en utilisant le stateOject de MSDN (c'est d'ailleurs pour cela que j'ai essayer de tout séparer).

Je pense que je vais reprendre mon code de zéro, il doit y avoir quelques chose qui m'a échappé :s

Cordialement, KiTe

mercredi 16 avril 2008 à 13:05:53 | Re : problème avec stringbuilder et socket

Kite37


En fait il y des choses quime dérange dans la version de MSDN, peut être pourrez vous m'expliquer :

 Private Sub acceptCallBack(ByVal obj As IAsyncResult)
        Dim listener As Socket = CType(obj.AsyncState, Socket)
        Dim handler as socket = listener.EndAccept(obj)

        Dim State as new StateObject()

         State.workSocket = handler

       handler.BeginReceive(buffer, 0, bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), state)
    End Sub


Quelle est l'utilité de passer par un Socket intermédiaire (handler) alors qu'il serait plus simple de faire :

 Private Sub acceptCallBack(ByVal obj As IAsyncResult)
        Dim conSock As Socket = CType(obj.AsyncState, Socket)
   
        Dim State as new StateObject()
        State.workSocket = conSock.endAccept(obj)

        State.workSocket .BeginReceive(buffer, 0, bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), State)
    End Sub


Car au final il n'y a pas vraiment de différence, et une économie mémoire (handler n'est pas utilisé) pour au final passer le meme stateObject et donc le meme socket en paramètre ..


Cordialement Kite

mercredi 16 avril 2008 à 13:26:16 | Re : problème avec stringbuilder et socket

Renfield

Administrateur CodeS-SourceS
ca ne change pas grand chose...
j'ignore l'impact sur l'execution (minime, j'imagine)

mercredi 16 avril 2008 à 15:48:39 | Re : problème avec stringbuilder et socket

Megafan

Réponse acceptée !
Salut,
1 - Si tu penses que c'est l'ajout au string builder qui pose un probléme, passe par une chaine que tu concatenes à chaque CallBack....

2 -Pour moi l'interet du StateObject est de gérer ton traitement asynchrnone dans un seul objet
genre exemple d'une classe SO que j'utilise...

Public

Class HTTPStateObject

PublicConst BufferSize AsInteger = 8192
Public HTTPSocket As Socket = Nothing
Public HTTPAsyncBuffer(BufferSize) AsByte
Public HTTPBuffer() AsByte = {}
Public EndOfHeader AsInteger = -1
Public ContentLength AsLong = -1

End

Class

donc tout se qui va se rapporter au traitement
Comme tu peux le constater j'utilise un buffer complet (HTTPBuffer) que je remplis à chaque evenement ReadCallBack en 'concatenant' HTTPAsyncBuffer. Tu peux y ajouter l'IP du Client ou tout un tas de choses...

@+ Megafan






jeudi 17 avril 2008 à 12:33:16 | Re : problème avec stringbuilder et socket

Kite37

Réponse acceptée !
J'ai modifié mon code, en réutilisant le classe stateObject (ici correspond à l'objet reader) et ça marche.

Voici le code :

 Private Sub receiveCallBack(ByVal obj As IAsyncResult)
        Dim state As clsRemoteReader = CType(obj.AsyncState, clsRemoteReader)
        Dim bytesInc As Integer = state.mainSocket.EndReceive(obj)

        Dim data As String = String.Empty
        Dim index As Integer

        If bytesInc > 0 Then


            data = Encoding.UTF8.GetString(state.buffer, 0, bytesInc)

            Array.Clear(state.buffer, 0, state.buffer.Length)

            index = data.IndexOf("<end>")

            If index > -1 Then
                data = state.sb.ToString() + Mid(data, 1, index)

                state.sb.Remove(0, state.sb.Length)

                state.sb.Append(Mid(data, index, data.Length - 1), 0, Mid(data, index, data.Length - 1).Length)

                Me.txtInc.Text = data

                state.mainSocket.BeginReceive(state.buffer, 0, state.bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), state)
            Else
                state.sb.Append(data, 0, bytesInc)

                state.mainSocket.BeginReceive(state.buffer, 0, state.bufferSize, 0, New AsyncCallback(AddressOf receiveCallBack), state)
            End If


        End If
     
    End Sub




jeudi 17 avril 2008 à 18:56:56 | Re : problème avec stringbuilder et socket

Megafan

Salut,
Bien.
Content d'avoir pu t'aider.
@+
Megafan



Cette discussion est classé dans : data, socket, handler, stringbuilder, if


Répondre à ce message

Sujets en rapport avec ce message

Winsock Error [ par sniceper ] Bonjour, je suis actuellement en train de coder un mini jeux client serveur en VB6 à 1 serveur et 1 à 4 clients. Desireux de gérer les coupures de con Optimiser le code (Eviter une dixaine de Tonnes de Conditions IF) [ par reacen ] Bonjour. Je cherche un petit code optimisé,si on me repond pas, je risque de fair: if Num = 0 then DATA = "11"if Num = 1 <f Probleme de buffer a larriver dinformation dans dataarrival [ par h4ck5r2001 ] Salut a tous ,Je vien de coder un bot pour se connecter a battle.net mais le probleme sais que defois bnet envoie 2 packet en 1 partie ou 1 packet en Socket Itératif en VB.net [ par enzo68290 ] Bonjour,je suis débutant en Visual Basic 2008je cherche à dévellopper une application simple permettant de commander à distance une machine pour des a problemme pour utulise les utulisateur dans un logciel vb [ par drknow ] aide moi svp un problemme avec viseul basic 6 Bonjour, je cree un programme sous vb qui lie une base de donnais les utulisateur est crée selon la code répété pour chaque action de l'utilisateur [ par bouligrain ] Bonjour à tous,J'ai une question concernant un formulaire excel. Comment faire pour qu'une action s'effectue à chaque fois qu'un contrôle est changé? problème d'affichage du méssage reçu par le modem sur un TextBox [ par hawish ] Bonjour je suis débutante en VB 6.0 s'il vous plaît je voudrais afficher chaque message reçu dans mon modem sur le PC Je programme en Visual Basic 6 datagridview et ado.net [ par sousoudev2 ] bonjour tout le monde.s'il veut plait quelqu'un peut m'aider .J'ai un datagridview que tous ses champs sont readonly =true car ils viennent de d'autre petit problem avec un timer et for / next [ par h4ck5r2001 ] salut, mon problème est que je voudrai utiliser mon timer pour envoyer des commandes contenue dans une listbox jusqua 4 fois maximum une a la suite d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.