Question sur Winsock

Résolu
fred_surz2002 Messages postés 21 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 19 février 2009 - 16 mars 2007 à 13:39
fred_surz2002 Messages postés 21 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 19 février 2009 - 19 mars 2007 à 22:02
Salut,

J'utilise le composant winsock dans une dll codée en vb6 pour me connecter sur un site internet depuis une autre application et y récupérer qqs infos. Quand je passe ne debug dans cette dll, tout se passe bien mais quand je souhaite me connecter directement depuis mon autre application, impossible d'ouvrir une connexion.

Qq'un a-t-il déjà eu ce pb?

Merci

4 réponses

fred_surz2002 Messages postés 21 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 19 février 2009
17 mars 2007 à 12:02
J'ai corrigé mon pb de connexion depuis hier. Il me reste un seul souci, c'est que je ne reçois que la moitié de mon flux de réponse. Je n'arrive pas à récupérer le 2e paquet. Voici mon code:

Set sck = New MSWinsockLib.Winsock


'Vérification de le fermeture du Winsock
If sck.State = "7" Then
    sck.Close
    sck.LocalPort = 0
End If


'Ouverture de la connexion
sck.Connect "192.8.3.135", 11101


Do While sck.State <> "7"
    DoEvents
Loop


'Envoi du flux d'interrogation
If sck.State = "7" Then
'sck.SendData "0359DT00001C108DBAILLEUC209SELF_TROUC304SELFFF0000000100004ASC90000000110005WINFO0000000120004QINF000000013000000000001400061629300000000150004H.M.000000016000820000302000000017000610515300000001800000000000190003ORT00000002000011000000021000100000000260005WINFO0000000270001100000002800011000000031000440021001000010009&SIREN&1091030000003EUR10910300200010" & vbCrLf


'Réception du flux de réponse
    Do While Donnees = ""
        DoEvents
        sck_DataArrival (100000)
    Loop
End If


'Fermeture de la connexion Winsock
sck.Close
sck.LocalPort = 0

Je ne sais pas comment forcer un 2e passage dans le DataArrival pour avoir le 2e paquet.

Merci
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 mars 2007 à 19:50
Salut
Ah, c'est plus clair.
Oui, la réception des données en plusieurs fois est un problème classique (et normal) des Winsocks.
Le composant déclenche l'évènement DataArrival quand le buffer contient quelque chose et que la carte mère a le temps de travailler.
Du coup, tu peux recevoir tes réponses en une seule fois ou en plusieurs fois, tout dépend de la qualité de la communication, de la puissance de ta machine (...)
Il te suffit donc de mémoriser la première partie en entendant les suivantes.
Tu peux faire ça avec une variable déclarée au niveau "Déclarations" de ta forme
Dim sRéception As String
et, à la réception, il te suffit d'ajouter les dernières données à celles précédemment reçues dans cette variable.
Une fois que tu auras tout, il te suffira de récupérer l'ensemble des données dans cette variable..
La question est donc : comment savoir que la réception est terminée ?
Si c'est toi qui gère les envois et la réponse (deux programmes à toi), il suffit d'ajouter une balise à la fin de tes réponses.
D'après les trames exemples que tu as donné, les données semblent être de type ASCII.
Par exemple, ajoute un Chr$(0) à la fin d'un envoi. Mais pourquoi pas un texte clair comme "<fin de réponse>", du moment que cette balise ne peut pas être confondue avec une donnée ...
Chr$(0) car ce n'est pas un caractère que tu risque de rencontrer dans tes données :
monWinSock.SendData "0359DT00001C10...300200010" & Chr$(0)
A la réception, il te suffira de détecter ce Chr$(0) pour savoir que c'est la fin d'une réponse :
Dim sRésultat As String
monWinSock.GetData sRésultat, vbString
sRéception = sRéception & sRésultat
If Instr(1, sRéception, Chr$(0)) <> 0 Then
   ' Une réponse complète est arrivée
   ' La réponse se trouve dans les caractères situés avant le Chr$(0)
   ' A toi de les isoler avec des Instr, Mid, Left ...
End If

Pense aussi à ce nouveau problème :
Tu risques aussi de récupérer deux réponses l'une derrière l'autre, donc une fois que tu auras détecté une balise de fin, il faudra regarder s'il y a encore quelque chose derrière.
Dans ce cas, ce sera une nouvelle réception à traiter plus tard.

Pour finir, je te conseille de lire et analyser une source de "Chat" (ce n'est pas ce qui manque sur le site)
Ce problème est résolu dedans, comprends le bien et tu n'auras plus qu'à t'en inspirer.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate) 
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
16 mars 2007 à 13:48
Salut,
Y a t'il une erreur, un libellé, un  code, bref qqch qui pourrait nous aider à te dépanner

@+: Ju£i?n
Pensez: Réponse acceptée
0
fred_surz2002 Messages postés 21 Date d'inscription mercredi 23 mars 2005 Statut Membre Dernière intervention 19 février 2009
19 mars 2007 à 22:02
Cà a marché au poil Jack! J'ai identifié une séquence de fin de transmission et j'ai pu faire un do while dessus.
Merci pour cette aide rapide et efficace.
0
Rejoignez-nous