Pb winsock chat a plusieur

cedrikz - 22 oct. 2001 à 21:29
 Larwin - 23 oct. 2001 à 04:52
J'ai reussi a cree un chat mais seulement pour 2 personne connecté, j'aimerai que le serveur accepte plusieurs connections, j'ai vu que certain avait rajouter dans la fonction senddata un index as integer j'ai essyer mais sa plante lors de la compil, est ce que qq'un pourrait m'expliquer en detail la facon de proceder pour autoriser plusieurs personne a chater ensemble!
merci d'avance
a+

1 réponse

Petit rappel très court sur le control Winsock en général... et au fait... ca serait vraiment super cool que les gens qui pose des questions la dessus spécifie s'il utilise de l'UDP ou du TCP pour leur connexion... ca f'rai gagné grave de temps pour la réponse :)

------------- Réponse -------------

Notion de base de la connexion TCP :

Lorsque vous créez une application qui utilise le protocole TCP, vous devez d’abord décider si votre application sera serveur ou client. Créer un serveur signifie que votre application "écoutera" sur un port déterminé. Quand le client fait une demande de connexion, le serveur peut alors accepter cette demande et par suite établir la connexion. Une fois celle-ci établie, le client et le serveur peuvent communiquer entre eux librement.

Notion de base d'UDP :

Il est plus simple de créer une application utilisant le protocole UDP qu’une application utilisant le protocole TCP car le protocole UDP ne requiert pas de connexion explicite.

Exemple d'application utilisant le protocole TCP :

Coté Serveur :

Private Sub Form_Load()
' Donne à la propriété LocalPort une valeur entière. Puis invoque la méthode Listen.
tcpServer.LocalPort = 1001
tcpServer.Listen
End Sub

Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long)
' Vérifie que le contrôle est fermé. Sinon, ferme la connexion en cours avant d'accepter la nouvelle.
If tcpServer.State <> sckClosed Then tcpServer.Close
' Accepte la demande avec le paramètre requestID
tcpServer.Accept requestID
End Sub

Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long)
' Déclare une variable pour les données reçues. Invoque la méthode GetData et paramètre pour ces données la propriété Text d'un contrôle TextBox nommé txtOutput.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub

Coté Client :

Private Sub Form_Load()
' Le nom du contrôle Winsock est tcpClient. Note : pour spécifier un hôte distant, vous pouvez utiliser soit l'adresse IP (ex: "121.111.1.1"), soit le nom complet de l'ordinateur...
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End Sub


Private Sub cmdConnect_Click()
' Invoque la méthode Connect pour établir une connexion.
tcpClient.Connect
End Sub

Private Sub txtSendData_Change()
tcpClient.SendData txtSendData.Text
End Sub

Private Sub tcpClient_DataArrival (ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub

Voila une petite appli client serveur simple...
Maintenant il est possible d'accepter plusieurs connexions...

Le code ci-dessous suppose qu’il existe un contrôle Winsock sur une feuille nommée sckServer, et que sa propriété Index a la valeur 0. Ce contrôle fait donc partie d’un groupe de contrôles. Dans la section Déclarations, une variable de niveau module intMax est déclarée dans l’événement Load de la feuille, la valeur 0 est donnée à intMax, et la valeur 1001 à la propriété LocalPort pour le premier contrôle du groupe. Puis la méthode Listen est invoquée sur le contrôle, ce qui en fait le contrôle «écoutant». Chaque fois qu’arrive une demande de connexion, le code exécute un test pour voir si l’Index est 0 (valeur du contrôle «écoutant»). Si c’est le cas, le contrôle écoutant incrémente intMax et utilise ce nombre pour créer une nouvelle instance du contrôle. Celle-ci est alors utilisée pour accepter la demande de connexion.

Private intMax As Long

Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub

Private Sub sckServer_ConnectionRequest (Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub

Voila tout ...

Un peu d'UDP maintenant ...

Par contraste, le protocole UDP ne requiert pas de connexion explicite. Pour envoyer des données entre deux contrôles, trois étapes doivent être exécutées (de chaque côté de la connexion) :

1. Donnez pour valeur à la propriété RemoteHost le nom de l’autre ordinateur.
2. Donnez pour valeur à la propriété RemotePort la valeur de la propriété LocalPort du second contrôle.
3. Invoquez la méthode Bind en spécifiant le LocalPort à utiliser.

Pi l'exemple et de trop la... j'en peu pu :)
Mais je te conseil cette methode pour faire une sorte de "chat en rézo local"

Voila je crois pas avoir fait trop de faute ...
Si t'as besoin de plus d'info ... y'a ka demander :)

Bonsoir tout le monde :)

Larwin
0
Rejoignez-nous