Éviter que les paquets se mélange lors de l'envoie avec winsock

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 099 fois - Téléchargée 39 fois

Contenu du snippet

j'ai trouver une solution à ce problème et je voudrai la partager avec vous.

Source / Exemple :


'1- vous devez mettre sa dans la feuille où il y a le contrôle winsock
Private pile As New Collection
private rendu as long
Public Sub Vider_Pile()
Set pile = New Collection
End Sub

'2- créer un Timer, donné la valeur 1 à la propriété interval et méttez sa dans 'son evenement Timer :
dim encour as long
If pile.Count = 0 Then
Else
If pret = False Then
rendu=rendu+1
encour=rendu
socket.SendData pile.Item(encour)
pile.Remove encour
rendu=rendu-1
End If
End If

'3- dans votre controle winsock, dans l'evenement send complete marquez ca
pret = False

'4-dans ce meme controle winsock, dans l'évenement sendprogress marquez sa

pret = True 

'5- quand vous devez envoyer des données marquez sa à la place 
'de .senddata

pile.Add "Données"

Conclusion :


c tout. dites moi vos commentaires

A voir également

Ajouter un commentaire Commentaires
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
9
Ok j'ai capté comment l'utiliser, mais ça marche pas top :(
J'ai des messages qui se concatènes qd mm mais pas systématiquement :( Donc ce n'est pas une solution fiable.
C'est qd mm incroyable qu'il n'y ait pas de moyen de faire ça sans renvoyé un message du serveur!
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
9
Bref, quelqu'un aurait-il une solution claire, nette et précise qui fonctionne?
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
9
Ca aurait été super top over méga génial avec une petite source de rien du tout pour faire un tout petit exemple...
Ca à l'air pas mal, mais ça manque de commentaires explicatif, de ce fait, je n'arrive pas à m'en servir.
Quand doit on se servir de la fonction vider_Pile?
Qd je fais Pile.Add "données" à la place de SendData, il y a une erreur qui me dit Object Required...
Quand tu dis, éviter que les paquets se mélangent, ça veut dire quoi? Parce que moi les paquets se concatènent si je les envoi à la suite, et j'aimerais qu'ils me les envoi un par un, est-ce ta source sert à faire ça? Merci répondre.
Messages postés
267
Date d'inscription
lundi 22 septembre 2003
Statut
Membre
Dernière intervention
27 novembre 2005

pour resumer (le principe de base) :
tu fais un truc du genre

sck1 et sck 2 = controles winsock

sck1.listen

sub sck1_connectionrequest(byval id as long)
sck2.accept id
end sub

c'est sck1 qui recoi la demande de connection mais c'est sck2 qui l'accepte

et dans ton exemple, tu utilise une collection de winsock plutot qu'un nombre predefini (ca je le savais)

la ou je bloquais, c'est que je croyais que c'etais le winsock qui recevais le connectionrequest qui devais accepter l'IDRequest

mais si je peux l'accepter par un autre winsock ... ca deviens beaucoup + simple !
Messages postés
98
Date d'inscription
mercredi 22 novembre 2000
Statut
Membre
Dernière intervention
12 juillet 2005

personnellement j'utilise uniquement des classes (ajouter winsock.ocx comme référence et non comme composant) ce qui permet d instancier les object du genre dim mysock as new winsock


pour gérer ton pb, tu crée un objet winsock ds ta classe
private withevents sock as new winsock

exemple d un serveur d authentification
....
m_type = srvIdent
sock.close
sock.Bind port, ip (on peur binder l IP de son choix en case de plusieurs IP)
sock.Listen
...


et tu passes le request ID a la classe qui va gérer ca.( ici c un exemple d un serveur multi tache)

Private Sub sock_ConnectionRequest(ByVal requestID As Long)
'***Procédure de traitement des requetes de connexion****
Dim t As Object
If mycol.Count < Maxclients Then
nb = nb + 1
Select Case m_type
'//serveur d identification
Case srvIdent:
Set t = New CServeurLogin
mycol.Add t, Hex(t.ServeurIDent)
t.AffectSocket requestID, Me, timeout, m_msgA, m_filtre

'//serveur de messagerie
Case srvChat:

'//serveur de recherche
Case srvFinder:

'//serveur de fichiers
Case srvBrowser:
Set t = New CServeurBrowser
mycol.Add t, Hex(t.ServeurIDent)
t.AffectSocket requestID, Me, timeout
End Select
End If
Set t = Nothing
End Sub

et dans la classe CserveurLogin
un autre object withevents sock

Public Sub AffectSocket(sID As Long, srv As CServeur, Optional sTimeOut As Long 4000, Optional msg As String, Optional filtreparts As Boolean True)
Dim flag As Boolean
If sock.State <> sckClosed Then sock.Close
sock.Accept sID
....
end sub



un port a l'écoute peut accepter un nbre presque illimité de clients à condition d opter pour un système multithreads. La destruction de la collection ou de l objet via la classe principal impose la fermeture du port.

j obtiens des performences très intéressantes avec ce procédé.
Afficher les 36 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.