Winsock multi connection commen faire ?

Signaler
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
-
PCPT
Messages postés
13281
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
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

Messages postés
13281
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
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  
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
J'ai fait :
Messages postés
228
Date d'inscription
mercredi 13 décembre 2000
Statut
Membre
Dernière intervention
8 août 2011

Bonjour,

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

walla
Messages postés
13281
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
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  
Messages postés
100
Date d'inscription
samedi 3 mai 2008
Statut
Membre
Dernière intervention
9 mars 2011
1
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
mettre Index à 0 pour Winsock2( j'avais omis ce detail)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Tu peux aussi t'inspirer de ceci
_________________________________________________________________________
VB.NETis good ...VB6is better<
Messages postés
228
Date d'inscription
mercredi 13 décembre 2000
Statut
Membre
Dernière intervention
8 août 2011

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
§ 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
Messages postés
228
Date d'inscription
mercredi 13 décembre 2000
Statut
Membre
Dernière intervention
8 août 2011

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?
Messages postés
13281
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
çà 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