ÉVITER QUE LES PAQUETS SE MÉLANGE LORS DE L'ENVOIE AVEC WINSOCK

Messages postés
320
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
16 février 2009
- - Dernière réponse : tbbuim1
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
- 31 mars 2005 à 15:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/8147-eviter-que-les-paquets-se-melange-lors-de-l-envoie-avec-winsock

Afficher la suite 
tbbuim1
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
7 -
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!
tbbuim1
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
7 -
Bref, quelqu'un aurait-il une solution claire, nette et précise qui fonctionne?
tbbuim1
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
3 février 2011
7 -
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.
kimmelf2
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 !
cs_sub-zero
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é.