Winsock multi connection commen faire ?

belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 - 6 août 2008 à 22:39
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 7 août 2008 à 14:44
Voilla, j'aimerais savoir comment faire pour rendre mon sever winsock
accessible pour plusieur connection, car acctuelement si je depasse 1 connexion
le server et le client bug .. merci

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 23:09
re,

utilise ton socket serveur en groupe de contrôles et lors de la tentative de connexoion, autorise (request) la connexion d'après le param (ID) sur un autre de ton groupe

en gros ton socket principal (0) ne communique jamais

voir la tonne d'exemples existants sur VbFrance
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
1
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
7 août 2008 à 03:06
J'ai fait :
1
bonjourcheval Messages postés 228 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 8 août 2011
6 août 2008 à 23:08
Bonjour,

Une petite recherche sur le forum t'aurait permit de trouver ceci

walla
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 03:32
1. localport est en lecture seule, ce que tu fais ici ne sert à rien
2. je te dis d'ouvir sur un autre socket, à créer dynamiquement. voir par exemple dans mes sources "URBI" mais le code n'est pas forcément évident
3. voir de toute façon les autres sources et les tutos !
4. évite le langage sms stp! non seulement c'est très chiant mais en plus en "dev", tout étant abrégé, c'est très facile de prendre un mot pour un autre...

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
belette321 Messages postés 100 Date d'inscription samedi 3 mai 2008 Statut Membre Dernière intervention 9 mars 2011 1
7 août 2008 à 04:46
Trop dure pour moi ton votre URBI, je c'est qu'il est possible de
faire un multi client sur WinSock, j'ai une petit idee meme a quoi
pourais ressembler ce code mais quand je l'ai essailler, mais sa ne
marche pas ...

----------------------------------------------------------------------
_________________________
Dim loaderwin As String
_________________________
Private Sub Form_Load()
loaderwin = "0"
End Sub
________________________
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
loaderwin = CSng(loaderwin) + CSng(1)
Load Winsock1(loaderwin)
Winsock1(loaderwin).LocalPort = Port
Winsock1(loaderwin).Listen
End Sub
_________________________
----------------------------------------------------------------------

L'erreur que je retrouve est la suivante:
Wrong number or argumant or invalide  property assiment

Cordialement, moi
P.S: Desoler pour l'orthographe le francais c'est pas mon truc
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2008 à 08:05
Winsock1 est indexé ou pas ?
parce qu'en voyant le proto de ConnectionRequest, je dirai non (pas la propriété Index)

fais deux Sockets, si tu as du mal a voir la chose.

le premier, va faire un Listen, et attendra que les clients viennent.
lors du ConnectionRequest, si le socket 2 (appelons le Data) est libre (voir son State = sckClosed) on lui fais accepter la requete.

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Dim oSck As Winsock
    For Each oSck In Winsock2
        If oSck.State = sckClosed Then
            Exit For
        End If
    Next oSck

    If Nothing Is oSck Then
        Load Winsock2(Winsock2.Count)
        Set oSck = Winsock2(Winsock2.UBound)
    End If
    oSck.Accept requestID
End Sub

Ainsi, le socket principal reste disponible (Listen)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2008 à 08:06
mettre Index à 0 pour Winsock2( j'avais omis ce detail)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
7 août 2008 à 09:37
Tu peux aussi t'inspirer de ceci
_________________________________________________________________________
VB.NETis good ...VB6is better<
0
bonjourcheval Messages postés 228 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 8 août 2011
7 août 2008 à 14:10
Dans le lien que je t'ai envoyé, c'est expliqué très clairement avec des exemples simple... Voici une partie du code que j'ai Copier-Coller de la source.

Pour faire un projet qui peut être connecté à plusieurs Winsock en même
temps, faites-le avec  2 winsocks, l'un « Wck » avec la propriété «
Index » à 0
et l'autre « Serveur ».
Rajoutez la variable public (donc accessible de partout) « Nb », et initialisez la à 0 au form_load.
Selon
ce qu'on vient de voir, faites en sorte (et ça paraît logique) que ce
soit « Serveur » qui soit serveur donc qui écoute mais pour son
évenement ConnectionRequest mettez :

§ Private Sub Serveur_ConnectionRequest(ByVal requestID As Long)
§ Nb=Nb+1
§ Load Wck(Nb)
§ Wck(Nb).Accept requestID
§ End Sub

Vous
avez compris !!! A chaque demande
de connexion à votre appli, elle
charge un nouveau contrôle Winsock
« Wck » qui va prendre la demande et
donc se connecter a l'appli appelante : au final, si 25 ctrl cherchent
à vous appelez, vous pourrez vous connecter aux 25 et communiquer avec
les 25 ! Ou plus ! (ou moins aussi).
Le ctrl Winsock « Serveur » lui reste TOUJOURS A L'ECOUTE PRET A TRAITER LES EVENTUELLES DEMANDES.

Et pour faire propre, il faut pas oublier :

§ Private Sub Wck_Close(Index As Integer)
§ Unload Wck(Index)
§ If Wck.count=0 then Nb=0
§ End Sub

Ce
qui permet de décharger de la mémoire les ctrl winsock auxquel leur
correspondant ont lâché la communication, et qui donc ne servent plus.

Comment traiter différentes réceptions ou la gestion des ordres :

Souvent
vos applis vont s'envoyer des infos, mais pas tjrs les mêmes : donc
comment faire pour que le prog distingue s'il vient de recevoir le
Pseudo du type ou bien un message qu'il vient d'envoyer pour afficher
dans le chat ? Simple encore une fois !!!

Faites correspondre chaque type de données (je ne parle pas du type VB) à un caractère puis faites par exemple :

pour l'envoi d'un pseudo :

§ .senddata « P » & VarPseudo

pour l'envoi d'un msg :

§ .senddata « M » & VarMsg

et pour la réception, on distingue comme ça :

§ Dim data as string
§ Dim Ordre as string * 1
§   .getdata data
§   Ordre = left(data,1)      'récupère dans Ordre le 1er caractère
§   data = right(data,len(data)-1)      'retire ce 1er caractère de data
§   Select case Ordre      'faites ici différents usages des données
§     Case « P »
§       Pseudo = data
§     Case « M »
§       Text1.text = data
§   End Select

Walla
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2008 à 14:18
§ Private Sub Wck_Close(Index As Integer)
§ Unload Wck(Index)
§ If Wck.count=0 then Nb=0
§ End Sub

gaffe a ne pas tenter de decharger le socket d'index 0
Nb ne sert pas a grand chose, si ?

perso, je ferai :
Private Sub Wck_Close(Index As Integer)
If Index = Wck.UBound And Index<>0 Then
Unload Wck(Index)
End If
End Sub

ca supprime les sockets en partant du dernier, si possible...
au pire, on réutilise les sockets constament, donc pas de soucis reel de consommation de mémoire du fait de ces controles dynamiques
0
bonjourcheval Messages postés 228 Date d'inscription mercredi 13 décembre 2000 Statut Membre Dernière intervention 8 août 2011
7 août 2008 à 14:38
Nb sert à envoyer les données dans le dernier Wck "Loader"

Mais bon, cette source n'est pas de moi...

Je me demandais, si l'index 0 est supprimer. si on refait un load apres, est-ce qu'il va fonctionner?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 14:44
çà fera "boom" ^^
contrôle inexistant.
le 0 sert de modèle pour les autres chargements dynamiques

(NB : désolé d'insister mais mon urbi...., à défaut de servir niveau code alors, est aussi utilisable ASIS. il gère seul son autogénération dynamique. il y aura juste 2 data inutiles "[Int:Str] ")

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp  
0
Rejoignez-nous