Accueil > Forum > > > > problème avec stringbuilder et socket
problème avec stringbuilder et socket
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
|
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
|
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 = -1End 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ée 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
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
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
vb acces [ par marwakarim ]
salut je suis entrain de réaliser un projet de gestion de brouillage mon problème ce que j'ai former une table dossier ou je veux entrer des données m
Utilisation des sockets .NET (VB2010) [ par raffika ]
Bonjour, avec Visual Basic 2010, j'utilise : Imports System.Net.Sockets Pour faire un client irc (cf ma source ChatIRC) seulement je ne sais pas si j'
VBscript Winsock (je vais péter un cable) [ par Guillamue06 ]
Bonjour je souhaite créer un mini tchat en VBScript en utilisant Winsock. J'ai un problème avec les stats de winsock (sa fait trés longtemp que je n'
Recherche dans la base en boucle [ par Sinsitrus ]
Salut ! J'essais en fait de rechercher dans ma table si un champ est égale à un autre et le signaler. J'ai utilisé ce bout de code : [code=vb]With
Exploiter un fichier texte situé dans les ressources du programmes [ par aus3004 ]
Bonjour, je crée en ce moment un système de favoris pour mon navigateur Internet. Le problème c'est qu'actuellement le fichier nommé "Favoris.ini" qu
Difficultés connexion socket [ par KaNaRette ]
Bonjour tout le monde, Je viens quérir votre aide, car je n'arrive absolument pas à me servir des sockets (j'en ai besoin pour réaliser un jeu d'éche
utilisation socket [ par hajerjoujou ]
bonjour tous le monde , j'ai une application en utilisant vb.net express version 2008 avec sql server 2005 cette application consiste que 2 personnes
Livres en rapport
|
Derniers Blogs
ASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHEASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHE par fathi
Tout le monde est unanime pour dire que la programmation multi-thread et asynchrone est en train de devenir un sujet incontournable. Beaucoup de choses sont arrivées avec le framework 4 pour le code parallèle (TPL, PLinq,.) et bientôt, on va avoir l...
Cliquez pour lire la suite de l'article par fathi PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS !PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS ! par Etienne Margraff
J'ai récemment eu un problème pour obtenir l'intelliTrace sur un site web dans IIS. Il n'y avait pas de message d'erreur, rien dans le journal d'évènement Windows, et après 3 appels à une voyante, 2 visites chez un marabou, j'ai failli me résign...
Cliquez pour lire la suite de l'article par Etienne Margraff OFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONSOFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONS par junarnoalg
De nombreuses entreprises font le choix de SharePoint Online, service fourni au travers de l'offre de Microsoft Office 365. S'il est vrai que ce choix apporte un grand nombre d'avantages; rapidité de mise en œuvre, disponibilité, large couvertu...
Cliquez pour lire la suite de l'article par junarnoalg PRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGEPRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGE par richardc
http://www.c2idotnet.com/articles/presentation-des-api-rest-de-windows-azure-lister-les-comptes-de-storage
Désolé pour "toto", mais c2i existait avant blogs.developpeur.org et c'est mon site "officiel" ;-) ...
Cliquez pour lire la suite de l'article par richardc
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|