begin process at 2012 02 12 18:04:40
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > B@Z SOCKET V 1.4 - CLASS DE SOCKET AVEC ÉVÉNEMENTS, MULTI-CONNEXION, CROSS-THREADING, SANS API

B@Z SOCKET V 1.4 - CLASS DE SOCKET AVEC ÉVÉNEMENTS, MULTI-CONNEXION, CROSS-THREADING, SANS API


 Information sur la source

Note :
9,75 / 10 - par 16 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous :socket, winsock, client, serveur, thread Niveau :Initié Date de création :16/02/2006 Date de mise à jour :01/11/2010 12:27:48 Vu / téléchargé :18 402 / 3 096

Auteur : babboss

Ecrire un message privé
Site perso
Commentaire sur cette source (143)
Ajouter un commentaire et/ou une note

 Description

Comme le dit le titre, cette class permet d'avoir des sockets avec des événements en VB.NET. Effectivement la class fournie dans le framework (System.Net.Sockets) ne lance pas d'événements ce qui n'est pas pratique du tout (Surtout pour ceux qui son habitués au Winsock de VB6).
Xya a déjà posté une source permettant de faire à peu près la même chose (Cf http://www.vbfrance.com/codes/AUTOSOCKET-CLONE-CON TRLE-WINSOCK-NET_20110.aspx)
Je me suis donc inspiré de ça source pour faire ma class.
Cependant je n'utilise pas la même méthode que lui. Je me contente d'utiliser les fonctions BeginXXX de la class socket plutôt que d'ecouter les événements du socket. Ca permet de ne pas utiliser les fonctions de l'API Winsock. Tout est en .Net
Il y a également un autre problème dans la version Auto Socket de Xya: Le Cross-Threading.
Quand on capture un événement de Winsock ou que la fonction CallBack d'une méthode BeginXXX est appelée et que l'on déclenche un événement avec RaiseEvent celui-ci ne s'exécute pas dans le Thread principal. Si dans l'événement de notre Form on écrit quelque chose du genre: Text1.Text = "Toto" On a une exception qui se lève: "Cross-thread operation not valid: Control 'Text1' accessed from a thread other than the thread it was created on."
En gros on n'a pas le droit de toucher à Text1 depuis un autre thread que celui ou il a été créé.
Il me semble que cette exception ne se lève qu'avec Visual Studio 2005 et pas avec le 2003. Toujours est t-il que ce n'est pas beau !
Xya m'a donc aider à résoudre ce problème car il l'a deja corrigé dans la version C# de Auto Socket. Cependant j'ai du l'adapter à VB car on ne peut pas déclencher un événement en utilisant un délégué! J'ai donc bidouillé un peut :)
Voila pour la petite anecdote.

La class permet également de gérer vous même plusieurs connexions sur un serveur (Un exemple est fournis dans le zip)

J'ai aussi rajouter 2 propriétés permettant de customizer le comportement de la class:
- AlwaysRaiseClose : Permet de déclencher l'évènement Closed quand on fait Sock.Disconnect() (Ca me perturbais que l'évènement Close ne soit pas déclenché quand je fesai Winsock.Close :D)

- AsyncEvent : Cette propriétés est assez intéressante. Prenons un exemple pour l'illustrer. Imaginons que vous faite un serveur avec Winsock. Des données arrivent, l'événement DataArrival est donc déclenché. Vous commencer à traiter ces données... Et la d'autre données arrivent ! La procédure en cours est donc interrompu et un nouvel évènement DataArrival est déclenché ! Vous n'allez donc pas traiter les données dans l'ordre ou elles arrivent alors que c'est peut être primordiale. Exemple sur un client IRC, quand il ya un "JOIN Toto" puis un "MODE #Channel +o Toto" Si vous traiter le MODE avant le JOIN vous êtes mal barré :P
Cette propriété permet donc de régler simplement le problème.

J'ai également inclus un exemple de client et de serveur(acceptant plusieurs clients) pour  montrer comment la class fonctionne.

Source

  • ''''''''''''''''''''''''
  • ' Tout est dans le ZIP '
  • ''''''''''''''''''''''''
''''''''''''''''''''''''
' Tout est dans le ZIP '
''''''''''''''''''''''''

 Conclusion

Je tiens à remercier encore une fois Xya pour m'avoir aider sur le problème de Cross-Threading.

Ah oui j'oubliai, tout est écrit en VS2005 donc .NET 2.0 j'ai essayé de ne pas utilisé les fonctions qui n'existe pas en .NET 1.x mais comme je ne les connais pas toutes vous risquez d'avoir des problèmes
Je ne programme en .NET que depuis trés peut de temps et donc j'ai commencer avec VS2005.

Voila, si vous trouvez des bugs dite le moi j'essaierai de les corrigés au plus vite :)
Et n'hésiter pas à mettre des commentaires.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

27 février 2007 19:40:43 :
Version 1.1 -------------- + Ajout des évènements suivant: * ThreadException: Se declenche quand une exception se produit dans un autre évènement. * Listening: Se declenche quand le socket a reussi a Listen * ListenFailed: Se declenche quand le socket n'a pas reussi a Listen + Recuperation de l'hôte de façon asynchrone pour ne pas bloquer l'affichage + Utilisation du DefaultEncoding aulieu du ASCIIEncoding pour mieu gérer les caractère latin (é,è,à,ç,...) + Divers petits bugs resolu Je posterai bientot une class BazSSLSocket pour pouvoir faire du client/server en utilisant SSL
05 novembre 2008 16:54:43 :
Version 1.2 ------------ + Correction de quelques fautes d'orthographes (il doit en rester plein) + Ajout des commentaire avec ''' sur les méthodes publiques + Correction d'un bug trouvé par Redman31100 qui empechait d'écouter sur l'adresse que l'on veut
05 novembre 2008 16:59:22 :
Changement du titre en 1.2 ^^
05 janvier 2009 16:43:13 :
Correction d'un bug qui fermait la connexion lors de la réception de données.
20 janvier 2009 22:59:10 :
Correction d'un bug dans le client qui fermait toute l'application quand on fermait le premier client.
01 novembre 2010 12:27:50 :
- Ajout d'un moyen permettant de ne pas recevoir les données tout de suite après avoir accepté une connexion (problème soulever par casoftware83) - Amélioration de l'exemple Serveur

 Sources du même auteur

VBPHOROM
Source avec Zip WINDOWS MANAGER (LISTER,MONTRER,CACHER,DEACTIVER,ACTIVER,"FO...
Source avec Zip CHANGER LE VOLUME AVEC LA SOURIS
Source avec Zip LIST DES REPONSE DES FONCTIONS CHR EST ASC(TABLE ASCII)
Source avec Zip UN BOUTTON TRES CONFIGURABLE

 Sources de la même categorie

Source avec Zip Source avec une capture GESTIONNAIRE DE TÉLÉCHARGEMENT, AVEC REPRISE ET MULTITHREADI... par Madx23
Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA par vicosta
Source avec Zip Source avec une capture DICTIONAIRE TEXT/AUDIO/VISUELLE ANGLAIS AVEC WEBBROWSER CONT... par majnounmajda
Source avec Zip Source .NET (Dotnet) NSLOOKUP EN VB.NET OU COMMENT FAIRE UNE REQÛETE DNS EN PRÉCI... par ShareVB
Source avec Zip Source avec une capture MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS... par lemout

 Sources en rapport avec celle ci

Source avec Zip SLYSPY(MINI-RAT) par ageryder
Source avec Zip Source avec une capture Source .NET (Dotnet) SOCKET ASYNCHRONE (CLIENT + SERVEUR) par elguevel
Source avec Zip Source avec une capture PETIT EXEMPLE DE CHAT AVEC WINSOCK par robapt
Source avec Zip CHAT :SERVEUR/MULTICLIENT par youzou
Source avec une capture SERVEUR/MULTI CLIENTS - WINSOCK REMOTE CONTROL (EXPLORATEUR,... par djine

Commentaires et avis

Commentaire de babboss le 16/02/2006 03:58:25

Ca fait longtemps que je n'avais pas poster de sources sur VBFrance ^^
Ca fait tout drole ^^

Commentaire de magloui le 16/02/2006 16:17:34

Merci a toi pour cette exelente source, cela devrait ravir pas mal personne, qui avait laisser des commentaires sur le nombre de connection limité a une.

Continue comme ca c'est exelent.

Commentaire de babboss le 17/02/2006 17:28:26

merci,
j'espere que ca pourra servir a des gens ^^

Commentaire de psycho81 le 09/03/2006 16:40:47

Bonjour,

Voilà, je t'expose mon problème.

Prenons 2 ordinateurs qui se connectent sur internet.
Ces deux ordinateurs sont dans un réseau et ne sont pas les paserelles Internet. Comment fournir aux deux postes (transformé pour l'occasion en client serveur bien sur) les accès directs l'un à l'autre (comme Emule par exemple). Je présume qu'il faut un troisième ordinateur (le serveur) qui transmet un socket (avec les datagramme de sous réseau) car avec le TcpClient du framework, nous ne pouvons que nous servir d'une adresse IP. Or l'adresse IP que nous avons sur Internet est celle de la paserelle Internet. Donc je me demande comment fait Emule par exemple pour permettre à deux ordinateur d'avoir une connexion directe dans ces cas ci.

Si tu a la solution à ce problème, tu me rendra le plus grand service que j'ai jamais eu !!!

Bernard


Commentaire de babboss le 11/03/2006 00:48:52

Je pense que le plus simple c'est de bien configurer ton routeur :D
Il suffit de rediriger(Forward) les port que tu veux sur l'addresse IP (locale) de ton choix
Je ne connais pas tellement eMule mais a mon avis il marcherai mieu si les ports été redirigés. Sinon toi tu peut te connecter aux autres mais les autres ne peuvent pas se connecter à toi !
En tout cas ca marche comme ca pour Bitorrent et à mon avis pareil pour eMule.

C'est un problème trés trés courant avec les Routeurs NAT et la solution ne se trouve pas dans les socket et les TcpClient etc... ;)

Commentaire de psycho81 le 11/03/2006 10:49:54

Hum, ce que je veux dire, c'est que par exemple, dans un réseau (plusieur poste sur la meme connection Internet) et sans routeur, on peux très bien avoir un Emule sur chaque machine. Et pourtant ce nn'est pas le serveur qui envoi les paquets de données ... Donc je me dis qu'il y a bien un moyen ... Le serveur doit filer le datagramme tcp/ip (ip+chemin de sous réseau) au client afin qu'il puisse accéder directement au poste concerné sans intermédiaire. C'est ca que je cherche. Pour faire une sorte de reseau p2p privé ....

Commentaire de mallett le 28/06/2006 16:36:24

Salut,

je trouve ce code plutot tres interressant (g pas encore bien creusé) !!!
Avez vous testé une grosse monter en charge ou pas ?
Pour ma part je suggere une petite modif coté serveur, en effet lors d'un 'close' du serveur les clients ne sont pas deconnecter donc pas de 'close' reellement. Si un client send le serveur le ressoit.

je pense que le boutton 'close' serveur devrait faire ceci :

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  If MySock.State <> SocketState.Disconnected Then
    Do While SockList.Count > 0
      Dim i As Integer = SockList.Count - 1
      Dim sock As BazSocket = CType(SockList.Item(i), BazSocket)
      If sock IsNot Nothing AndAlso sock.State = SocketState.Connected Then
        sock.Close()
      End If
    Loop
    MySock.Disconnect()
  End If
End Sub

ce qui a pour effet de deconnecter tous les client avant de fermer le socket d'ecoute reellement.

bon travail BAZ !!! 10/10

A+

Commentaire de raptorz le 11/08/2006 19:43:45

Je t'ai mis 9 étoiles pour tout le beau travail, le code est commenté, Orienté objet , très bien ... ;-)
Je t'aurais mis 10 étoiles si la classe aurait été encapsulée dans un composant. (est-ce faisable ?)

Commentaire de teo770 le 27/08/2006 19:17:11

Est-ce qu'il y aurait beaucoup de modifs à faire pour passer non plus une string mais un binaire ?

Je n'ai pas encore eu le temps de me creuser la tête et je pense qu'avec un source aussi recherché, tu as dû envisager la chose ?

Merci

Teo

Commentaire de Le newbie le 14/11/2006 14:08:39

Salut,

La source est excellente ,fonctionne à la perfection et offre une base de travail énorme. Merci beaucoup. Tiens au fait prends un 10.

@++ et encore bravo

Commentaire de Le newbie le 14/11/2006 14:10:27

Une petite question : comment à partir de ta source il serait possible de faire un chat avec les autre clients et non pas forcément avec le serveur.

Merci de le préciser.

Commentaire de surfzoid le 28/11/2006 19:28:56

Excellent babboss, un 10/10 s'impose vue le boulot.
J'ai juste une petite question qui me brule les lévres depuis for longtemps, comment faire du multisocket client vers plusieur serveur différent ecoutant sur le port 502 par exemple (comme par hasard,lol), et ensuite une fois toutes les connections établie échanger des données de façon fiable, sans ce mélanger les pinceau sur qui a envoyer les paquet et qui doit les recevoir.
Plus concrétement :
3 serveurs modbus sur le port 502 ayant comme ip 30,31 et 33
1 client qui se connect respectivement a 30,31 et 33
puis en boucle pose une question a 30 et stocke la réponse dans un fichier A, ensuite la même question a 31 et stocke la reponse dans un fichier B et finalement a 33 avec un fichier C ?
Merci beaucoup en tout cas pour ton excellente source et je comprendrais aisement qu'on ne reponde pas a ma question tordue car ça fait plus de 6 mois que je bataille avec ça lol :D

Commentaire de eldim le 10/01/2007 09:53:11

Bonjour,
je ne suis pas trop d'accord avec le commentaire du source : un delegate se fait aussi bien en vb qu'en C#... à part ça faut que je test...

Commentaire de jpsarot le 27/02/2007 15:49:04

Merci pour ton Code

J'avais un problème lors de la transmission d'une chaine contenant des caractères dont le code est supérieur à 7FH, ils étaient remplacées par le code 3FH (?), j'ai modifié le code suivant (dans BazSocket.vb)

'Prend en parametre une string pour facilité les chose a l'utilisateur.
    Public Sub Send(ByVal data As String)
        If m_State = SocketState.Connected Then
            Dim ByteData() As Byte = m_Encoding.GetBytes(data)
            Me.Send(ByteData)
        End If
    End Sub

par

'Prend en parametre une string pour facilité les chose a l'utilisateur.
    Public Sub Send(ByVal data As String)
        If m_State = SocketState.Connected Then
            Dim ByteData() As Byte = System.Text.Encoding.Default.GetBytes(data)
            Me.Send(ByteData)
        End If
    End Sub

Commentaire de babboss le 27/02/2007 16:35:56

Bonjour,
Et bien d'abord je vous remercie pour tous ces commentaires constructifs !

Je vais essayer de vous repondre dans l'ordre:

mallett: tu a tout a fait raison il fodrai effectivement remplacer par ce bout de code. Enfaite le server et le client on été fait un peut rapidement, c'était juste pour montrer les possibilités de la Class.

raptorz: Oui c'est possible mais je ne me suis pas trop penché sur la question :S

teo770: Il y a deja une fonction Send qui prend un tableau de Byte en argument. D'ailleur la fonction Send qui prend une String ne fait qu'appeler celle-ci.

le newbie: C'est tout a fait faisable. Encore une fois le Client et Server fourni ne sont pas complet. Pour faire un "Vrai" chat il suffit que le server renvoie au client le texte qu'il recoit des autre clients
dans la fonction: Client_DataArrival
tu fait un boucle qui renvoi les données recu aux autre clients.

surfzoid: oui c'est tout a fait faisable, si tu connai le nombre de server sur lequel tu veut te connecté c'est encore plus simple. Tu crée une Socket (BazSocket :D) pour chaque connexion, et tu fait socket.Connect, etc...
Si tu ne connais pas le nombre de server à l'avance ou qu'il est tres grand, tu fait une boucle qui crée des socket et qui les met dans une List et tu capte leurs évènemments avec des AddHandler

eldim: on peut faire des delegate en VB.Net, ce qu'on ne peut pas faire c'est faire un RaiseEvent sur un delegate. C'est pour ca que j'ai du bidouiller pour eviter le Cross-Threading.

jpsarot: J'ai egalement eu ce problème, ca vient du fait que le ASCIIEncoding n'aime pas trop les accent etc...
Et le plus drole c'est que j'ai fait exactement la meme modif que toi ^^

Je vais mettre à jour la source avec les quelques bugs resolu.
D'ailleur il y en a un qui peut etre assez genant dans:
Public Sub Connect(ByVal RemoteHost As String, ByVal RemotePort As Integer)
  ...
  RemoteEP = New IPEndPoint(Dns.GetHostEntry(RemoteHost).AddressList(0), RemotePort)
  ...
End Sub

Sous Vista AddressList(0) peut etre une addresse IPV6 et non IPV4 ce qui provoque une exception lors de la connexion car la socket est en IPV4
De plus il fodrai utiliser Dns.BeginGetHostEntry() pour ne pas bloquer le thread. Si la resolution de nom met du temps, l'affichage se bloque :/

Voila, encore merci pour les commentaire et la note :)

Commentaire de babboss le 27/02/2007 19:43:15

La version 1.1 est en ligne (1 ans aprés la première version, mais mieu vaut tard que jamais :D )

Commentaire de NHenry le 28/02/2007 13:36:17 administrateur CS

Bonjour,

Pour optimisation et commentaires (je chipote je sais) :
- Si une classe n'a pas à être dérivée (héritée), met les en Notinheritable.
- Utilise DirectCast au lieu de CType, faible différence, DirectCast est plus rapide, mais ne permet que de suivre les héritages.
- Un TODO dans "B@Z Socket\BazSocket.vb"
- Pour documenter tes membres et tes classes, utilise les ''', en .NET2 c'est pris par défaut, en .NET1 il faut installer VBCommenter. Comme cela on voit la doc dans les infos bulles (comme pour les autres classes du framework).
- Quelques fautes de français ('Normalement ici on est connecter.)
Dans les fichier "B@Z Socket\BazSocket.vb" , 2 variables en commentaires dans Send_CallBack
- Les delegates publiques dans EventHandler.VB peuvent être mis dans la classe principale, cela retire un fichier au projet

Voila, comme j'ai dit, je chipotte.

Je note que ta source est bien rédigée, je fais pas toutes mes sopurces sur ce même modèle.

Bonne continuation.




Commentaire de geraldbeaulieu le 30/06/2007 03:12:56

Bravo, j'ai fais beaucoup de recherche afin de trouver un code comme celui-ci 10/10.

Bye

Commentaire de achtouf le 19/12/2007 12:28:59 10/10

Bravo pour cette source.

Après m'être essayé à réaliser ce genre de classe, j'ai finis par laisser tomber par manque de temps, et de connaissances.

Ta source est très intéressante.

Je compte l'utiliser dans un soft pour l'entreprise dans laquelle je travaille. Y vois tu un inconvénient ?

Encore merci ...

PS : Il est préférable (?) d'utiliser les commentaires ''' pour commenter classes, fonctions ... plutot que les simples commentaires '
Ca permet de voir les infos de la classe depuis une autre classe sans aller voir dans le code (un peu comme le fait le framework avec l'explorateur d'objet)

Commentaire de psykocrash le 17/06/2008 23:15:41

Est ce que tu pourrais uploader une version 2008 ? Ce serait sympa ;)

Commentaire de surfzoid le 17/06/2008 23:53:34

Quand tu lance VS 2008, fait ouvrir une solution, celle ci, l'outil de conversion ne se lance pas ?

Commentaire de psykocrash le 18/06/2008 15:44:25

Si si ça fonctionne :)

Merci pour l'info !

Commentaire de Redman31100 le 23/10/2008 19:11:57 10/10

Je trouve ton code super 10/10.

Seulement j'ai cette erreur : -- Impossible d'ecouter:L'adresse demandée n'est pas valide dans son contexte

Commentaire de surfzoid le 23/10/2008 21:12:11

Tu ne peut pas faire un listener sur un socket distant, mé uniquement sur ton IP, 127.0.0.1 ou 192.xx.xx.xx ou localhost ou ton nom de machine

Commentaire de Redman31100 le 23/10/2008 22:06:43

Et comment on faire pour écouter ce qui arrive sur notre IP Publique ? Parait qu'il faut router de l'ip publique à l'ip locale mais avec la livebox je trouve pas.

Commentaire de surfzoid le 23/10/2008 23:00:24

tu as internet, ?
donc tout les paquets de ton ip public passe bien par ton ip privée avant d'arrivé sur ton écran !

Commentaire de Redman31100 le 24/10/2008 03:13:55

Oui j'ai internet, tout le temps. Si tu veux tu peux me passer ton MSN par MP pour m'aider ^^

Commentaire de surfzoid le 24/10/2008 09:10:44

Désoler, j'en ait vraiment pas le temps, et qui plus est si tu suis mon explication, elle dit que ce que tu essaye de faire, c'est de faire "tourner" ce socket directement dans ta livebox !? hum, je crois que l'aide a ce niveau la ce limite a te résigner sur le fait que tu chereche a faire kelk chose de pas possible, voir inutile.
Desoler

Commentaire de Redman31100 le 24/10/2008 11:58:22

Bah pas mal de gens arrive à faire à tourner leur application serveur en écoute sur leur ip locale et que d'autre personnes communiquent avec lui avec le port forwarding, alors je vois pas pourquoi ça serait forcément impossible avec moi.

Commentaire de babboss le 26/10/2008 14:18:15

Salut,

En ce qui concerne les socket, tu peux laisser l'adresse d'écoute par defaut qui correspond à toutes les adresse de ta machine, ou alors tu peux mettre ton IP local (192.168.x.x) mais ne met pas 127.0.0.1 sinon le serveur ne pourra pas accepter les connexions exterieur (meme d'ordinateurs dans ton réseau local).

En ce qui concerne le Port Forwarding c'est à peut pret ce que tu à dit. Il faut que tu redirige un port sur ton ordinateur local. Imaginon que ca soit le port 100 qui t'interesse. Tu demmande a ton serveur d'ecouter sur le port 100 et tu demmande à ta Live Box de redirigé le Port 100 sur ton IP local 192.168.x.x en TCP (ou TCP+UDP). Par contre pour les détails pour le faire avec la Live Box je ne peux pas t'aider car je ne connais pas mais ca doit se trouver assez facilement sur google par exemple.

Commentaire de Redman31100 le 27/10/2008 02:37:43

Merci de ton aide mais j'ai cherché plein de fois sur google.
Je m'aperçois que B@Z Socket quelque soit l'ip qu'on choisit met l'ip locale (pour moi 192.168.1.25)

mais je trouve pas dans ton code de B@Z Socket où tu met met l'ip locale et pas l'ip choisi lors de la procédure Connect et j'ai pas pigé pour quoi il y a RemoteEP et LocalEP.

Commentaire de surfzoid le 27/10/2008 09:31:47

Je pense que avant de t attaquer a ce genre de procedure, tu devrai commençai par les base, MSDN pour les socket et google poor les technique de port Forwarding, sniffing ....
Sinon pour faire ce que tu veux il serait plus simple d'utilisé l'existant :
Wireshark / etherall

Commentaire de Redman31100 le 27/10/2008 16:06:21

Je sais déjà comment fonctionne les techniques de port forwarding. Avec une freebox je saurai régler mon souci, mais avec la livebox je trouve aucune option pour le port forwarding(plutot ip forwarding)

Commentaire de babboss le 28/10/2008 15:49:16

Apres 30s de recherche sur google: http://www.dotmana.com/index.php/?p=358

Commentaire de Redman31100 le 28/10/2008 15:56:53

C'est bien joli mais ceux qu'ils disent correspondent pas à ma LiveBox il y a pas de menu NAT.

Commentaire de Redman31100 le 05/11/2008 11:13:17

J'ai compris pourquoi ça marche pas ! Lorsque je met une ip locale dans server et client ça met l'ip 192.168.1.10 chez moi et quand je met mon ip publique ça met l'ip locale 192.168.1.1 qui est pas la bonne chez moi, je vais essayer de corriger le code mais si tu peux faire pareil babboss ça serait cool

Commentaire de Redman31100 le 05/11/2008 11:19:53

J'ai enlevé le AsyncGetHostEntry et resolving mais maintenant ça me donne cette erreur : -- Impossible d'ecouter:Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée

Faudrait qu'on puisse écouter l'ip demandé par l'utilisateur si tu pourrais corriger ton code babboss ça serait cool car j'arrive pas.

Commentaire de babboss le 05/11/2008 17:10:33

Il y avait effectivement un bug qui empechais d'écouter sur l'adresse que l'on veut en utilisant Listen(Ip as string, Port as integer)
Par contre ca marche avec Listen(LocalEP as IPEndPoint)
En tout j'ai régler le problème normalement.

Bon alors sinon j'ai pas trop compris ton histoire de 192.168.1.10 et de 192.168.1.1...

Ce qui est sur c'est que le serveur il n'a pas besoin de connaitre l'ip publique. Il ecoute sur une adresse disponible sur la machine donc 192.168.1.25 d'apres un de tes messages précedents. Apres tous ce passe au niveau du routeur pour rediriger les ports mais tout ca est completement transparent pour le serveur.
Ta machine a normalement 2 IP: 127.0.0.1 et 192.168.1.25 il peut éventuellement y en avoir d'autre si tu a plusieur cartes réseau ou alors que tu est connecté à un VPN, etc...
Mais dans tout les cas tu ne pourra pas précisé ton IP publique dans la méthode Listen sinon tu aura une erreur.

Voila j'espere que ca pourra t'aider,
@++

Commentaire de surfzoid le 05/11/2008 18:45:25

Tout simplement , je pense que "192.168.1.1" c'est l'ip de sont routeur/passerelle et serveur dns, le plus simple pour confirmer serais :
touche Windows + r
cmd + enter
ipconfig / all
et click droit "selectionner", selection tout et appuie sur enter, puis revient ici et fait click droit coller.
Mais encore une fois tu ne me semble trés clair dans tes idées et je pense que tu vas te battre comme dzes moulins a vent lol :-d

Commentaire de Redman31100 le 05/11/2008 18:46:42

Je ne parle pas pour Listen, car ça sera toujours local mais pour connect du client Car il doit se connecter à mon ip publique pour le tester en internet et le routage de ma livebox marche pas apparemment.

Commentaire de surfzoid le 05/11/2008 18:52:44

petite erreur , il fallait comprendre "encore une fois tu ne me semble PAS trés clair ...."

Commentaire de Redman31100 le 05/11/2008 18:53:45

si je suis clair ^^

Commentaire de surfzoid le 05/11/2008 18:57:44

Redman31100 : j ai peut etre zappé un de tes post, tu cherche a faire unserveur, si tel est le cas, regarde plutot dans ta livebox, sur la page html d'admin, si il y a une notion de serveur ou IP virtuel, dans laquel du vas "forwoarder" toute les requettes entrentes sur le port XX vers l'adresse IP de choix, donc je crois 192.168.1.25

Commentaire de surfzoid le 05/11/2008 19:01:41

rorrrrrrr : lol
http://pagesperso-orange.fr/sunflower/livebox/livebox%20sagem.htm

http://www.siteduzero.com/tutoriel-3-35034-creer-un-serveur-web-avec-la-livebox.html

http://www.commentcamarche.net/forum/affich-1207814-configurer-la-live-box-pour-serveur-dedier-cs

http://www.infos-du-net.com/forum/162482-8-serveur-ftp-livebox

http://www.developpez.net/forums/d321059/webmasters-developpement-web/serveurs-apache-iis/serveur-web-p-livebox-p-dydns-marche/

bon en fait , je vais pas tous les mettre il suffiser de :

http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=serveur+livebox

Commentaire de Redman31100 le 05/11/2008 19:44:03

T'inquiète pas j'ai vu plein d'articles pour le routage livebox mais le routage ne marche jamais chez moi.

Commentaire de Triboutmatthieu le 05/11/2008 20:13:53

Dommage qu'on puisse pas mettre de pseudo! c'est un petit détail qui fait que ça change tout. sinon c'est pas mal mais marche que sur un ordi et pas en local pour ma part chez moi

Commentaire de Redman31100 le 05/11/2008 20:14:45

Moi avec mon chat les pseudos sont pris en charge mais j'améliore.

Commentaire de surfzoid le 05/11/2008 21:00:24

Si ton routage ne marche pas c est kil est forcément mal fait, aprés ce n'est pas vraiment un routage, mé une config de ta livebox pour autorisé un service/serveur, c'est plus sur une notion de firewall !

Commentaire de Redman31100 le 05/11/2008 21:01:52

Mal fait, je fait comme tout le monde pourtant, autrement dis si on suis ton raisonnement tout le monde se trompe. Et j'ai il y a aucun rapport avec le firewall.

Commentaire de surfzoid le 05/11/2008 21:55:28

Non, tout le monde ne se trompe, mé jusqu'a aujourdhui je n'est jamais vue quelqun de parfait.
Je suis administrateur réseaux, je touche a des firewall et routeur régulierement, j'ai mis en place et administre notre Domaine Windows, je gere nos serveur mail, ftp, web , samba ....
Et pourtant face a ta situation (ça mé arrivé + d'une foi) je reagi tjr comme je te l ai dit : "quel erreur j'ai commit, j'ai certainement loupé un truc, reprenons ....".
JAMAIS au grand jamais , je n 'irai sortir a mon Boss, " n importe nawak, je l'ai fait nickel chrome, j en suis sur" et le boss qui repliquerer , mé pourkoi ça marche pas alors :-)
donne nous des infos , dabord celle ke je t'é dit + haut (ipconfig/all), la reference, type et model de ta livebox.
A tu une ip fix, si oui ke t affiche la page web : http://www.monip.org/
donne des captures d'écrans de la config de ta livebox.
Ton firewall XP est il activé.....
Pour tout ce qui est des infos au format texte, ne les colle pas forcement ici, ce serait peut etre trop gros, utilises : http://pastebin.com/
Pour les images/screenshot (capture d'écran avec la touche "IMP ecran/syst en haut a droite), meme pas la peine d'esayer ici, utilise donc : http://pastebin.com/

Commentaire de Redman31100 le 05/11/2008 23:14:36

livebox sagem IP locale : 192.168.1.10 passerelle : 192.168.1.1 masque réseau : 255.255.255.0

FireWall Vista activé et débloqué sur le logiciel serveur et client.

Commentaire de babboss le 05/11/2008 23:19:02

Okay je pense savoir d'ou ca vien ^^
A mon avis le routage est bien fait seulement pour tester il faudrait demmander a quelqu'un d'exterieur. Tu ne peux pas tester toi meme en te connectant toi meme en te connectant à ta propre ip publique. J'ai deja expérimenté ce problème.
Il faudrai donc que tu puisse demmander a un amis de se connecter à toi pour tester ou alors utilisé un VPN sur un 2eme PC si tu en a...

Commentaire de Redman31100 le 05/11/2008 23:20:24

alors je demanderais à un ami, de le faire, je vous tient au courant.

Commentaire de surfzoid le 06/11/2008 00:12:13

Evidament "infinite loop!" lol

Commentaire de surfzoid le 06/11/2008 00:18:25

Petit oublit
1, pour ce genre de manip, utilise virtualbox : http://www.virtualbox.org/
tu auras 2 pc en un
2 Ne commence pas par la "fin", commence petit et ensuite quand tu comprends un peut mieux la gestion d'ip , routeur , firewall, puis la notion client/serveur , attaque toi a ton projet, je te sugere vivement, de commencer a te faire la main avec l'example client/serveur de la doc MSDN, je croi de memoire que c'est sur la classe tcplistener et tcpclient :
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(VS.71).aspx
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(VS.71).aspx

Commentaire de Redman31100 le 06/11/2008 16:51:24

Je m'attaque pas à la fin et au début, et normalement on devrait pouvoir tester ça machine, je sais que certain le font sans virtualbox.

Commentaire de surfzoid le 07/11/2008 09:55:37

Bon puisque tel est ta décision , je m'arrête la et retire ma notification par Email de ce post !!
Au revoir et bonne prog .....

Commentaire de Redman31100 le 07/11/2008 21:36:49

C'est ça au revoir ^^

Commentaire de Redman31100 le 08/11/2008 01:59:14

Bizarrement ça marche plus en local depuis cet après-midi.

Commentaire de surfzoid le 08/11/2008 12:59:13

Surment que tu n'as fait AUCUNE erreur ou mauvaise manip ! :
http://www.vbfrance.com/recherche.aspx?r=client+serveur&dotnet=1

Commentaire de Redman31100 le 08/11/2008 13:01:32

Bah j'ai pas touché au programme à la configuration livebox et au système de mon ordi. J'essaye de résoudre le problème mais en vain.

Commentaire de surfzoid le 08/11/2008 13:26:38

Encore 1 fois, car ds une communication on repond, tu cherche a faire un clien/serveur ?
Cherche d'abords :
http://www.vbfrance.com/recherche.aspx?r=client+serveur&dotnet=1
souvent une erreur ki revien, c'est le risque de re inventer, mé je ne sait pas exactement ce ke tu ve fer

Commentaire de Redman31100 le 16/11/2008 06:53:12

Ah ça marchait pas car en le serveur en listen fait pas de resolving donc sur les 2 programmes je précise bien l'ip et non pas 127.0.0.1.

J'ai plus de soucis ^^

Commentaire de Redman31100 le 17/11/2008 04:26:53

Et si je connais réellement l'adresse, c'est utile que dans la DLL BAZ Socket il y es un résolving à chaque fois ? Me demande si on peut le désactiver.

Commentaire de babboss le 17/11/2008 07:02:43

Nan mais le "resolving" ca ne sert que pour transformer les noms en adresse IP
exemple: www.google.fr -> 216.239.59.104

Si tu rentre une adresse IP directement, il n'y a pas besoin de "resolving"...

Enfin bref je vois pas pourquoi tu veux te prendre la tête à desactiver ca.

Commentaire de Redman31100 le 17/11/2008 07:04:37

Ben chaque fois que je rentre une IP il fait le résolving, il fait pas la différence avec texte ou IP le programme. Et ça met du temps à résoudre chaque fois.

Commentaire de babboss le 17/11/2008 07:13:08

Bon quand j'aurai un peu de temps j'arrangerai ca ^^

Commentaire de surfzoid le 17/11/2008 09:57:10

Cite (Commentaire de babboss le 05/11/2008 17:10:33 ) : "Il y avait effectivement un bug qui empechais d'écouter sur l'adresse que l'on veut en utilisant Listen(Ip as string, Port as integer)
Par contre ca marche avec Listen(LocalEP as IPEndPoint)
En tout j'ai régler le problème normalement."

TRAduction : - IPEndPoint = 192.168.xxx.xxx
             - string, integer = "google.com" , 80

Commentaire de Redman31100 le 20/11/2008 13:26:05

Depuis ce matin j'ai un souci avec ton programme mais aussi avec d'autre serveur/client

J'ai testé en local : le serveur se connecte sur l'ip locale par exemple au port 11111(j'ai testé d'autres ports) le client se connecte sur la meme ip et port donc au programme serveur, jusque la ca marche, mais des que le client envoi une donnée au serveur ou le serveur au client, cela déconnecte le client qui a envoyé ou reçu la donnée, sans que le client ou le serveur reçoive, donc ca voudrait dire que le client est déconnecté avant meme la reception ou emission comme si quelquechose déconnecté le client mais c'est pas le serveur.

J'ai pas de virus. alors je me demande ce qui se passe. me demande si ça un lien avec la livebox ou l'ordinateur mais j'ai rien changé.

Commentaire de Redman31100 le 20/11/2008 14:16:36

J'ai trouvé ou ça leve l'exception ca leve l'exception dans le fichier BazSocket.vb

    Private Sub Receive_CallBack(ByVal Ar As IAsyncResult)
        Dim AsyncSocket As Socket = DirectCast(Ar.AsyncState, Socket)
        Dim RecvSize As Integer

        SyncLock RecvSync

            'Regarde si le socket Existe encore, Sinon on quite
            If Not Object.ReferenceEquals(AsyncSocket, m_Socket) Then
                Return
            End If

            Try
                RecvSize = m_Stream.EndRead(Ar)
                If RecvSize <> 0 Then
                    Dim ByteData(RecvSize - 1) As Byte
                    Array.Copy(m_RecvBuffer, ByteData, RecvSize)

                    OnDataArrival(ByteData)


                    If m_Stream.CanRead Then
                        m_Stream.BeginRead(m_RecvBuffer, 0, m_RecvSize, New AsyncCallback(AddressOf Receive_CallBack), m_Socket)
                    Else
                        DisconnectSocket(True)
                    End If

                Else
                    DisconnectSocket(True)
                End If
            Catch ex As Exception
                DisconnectSocket(True)
            End Try
        End SyncLock
    End Sub

ça va dans Catch ex as Exception DisconnectSocket(True) l'erreur est "{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}"

Donc le serveur a fermé la connexion du client mais où et pourquoi, je sais pas.

Commentaire de Redman31100 le 09/12/2008 05:50:24

Quand je me connecte sur un chat irc et que je tapes la commande irc /list j'ai jamais de réponse et sur les autres serveurs internet public j'ai jamais de réponse.

Commentaire de Redman31100 le 05/01/2009 18:37:55

Super babboss ! Ça marche nickel !

Commentaire de babboss le 05/01/2009 19:48:16

De rien ^^

Pour info, le problème venait du fait que le Buffer pour lire les données était de 0 octet. Je ne sais pas trop comment c'est arrivé... Un problème avec la façon dont je gerais le ReceiveBufferSize.

Je n'avais pas tellement le temps pour corriger le problème ces derniers temps :(

En tout cas, Bonne année à tous :)

Commentaire de Redman31100 le 05/01/2009 22:18:18

Bonne année ! 0 octet lol bizarre.

Commentaire de Le newbie le 06/01/2009 08:43:40

Salut, et bonne année.

Je viens de m'apercevoir d'une chose. Si je crée plusieurs clients et que je ferme la fenêtre du premier client, tous les autres client se font jeter. Est ce normal ?

Merci d'avance.

Commentaire de Louu34 le 13/01/2009 14:21:40 10/10

Bravo !!

Commentaire de casoftware83 le 20/01/2009 19:23:41

Bonjour,
et merci pour cette source qui nous fait gagner beaucoup de temps.
néanmoins j'ai le meme message d'erreur que redman, j'ai pourtant telechargé le zip le 10/01/2009 (apres le post de redman).
Auriez vous une solution pour moi ?
merci d'avance.

Commentaire de babboss le 20/01/2009 23:06:27

Quel problème exactement ? Je n'ai pas bien compris.

Sinon je viens de mettre à jour la source. J'ai corrigé le problème expliqué par "Le Newbie".
Il suffisait tout simplement de changer les propriétés du projet Client pour que l'application se ferme uniquement quand la dernière fenêtre est fermée.

Commentaire de Redman31100 le 20/01/2009 23:25:43

Lorsque je veux écouter sur mon IP publique, j'ai ce message d'erreur (application serveur) : "Impossible d'ecouter:L'adresse demandée n'est pas valide dans son contexte"

J'écoute en local avec routage de externe a local par l'ip 11111, personne ne peut me rejoindre.

Comment y remédier ?

Commentaire de babboss le 21/01/2009 01:24:05

Tu ne peux pas écouté sur ton IP publique. Tu doit écouté sur ton IP local (192.168.x.x) et dire a ton routeur de redirigé le trafic d'un certain port (ou plage de port) vers cette IP local.

Tu ne peux écouter que sur des adresses présente sur une interface réseau de ta machine. Et la plus part du temps tu en a seulement deux:
- La boucle local (127.0.0.1)
- Ton ip sur le réseau local (192.168.x.x)

Pour pouvoir écouter sur l'IP publique il faudrait que la box soit directement connectée à ton PC et qu'elle ne soit PAS en mode routeur. Dans ce cas la tu n'aurais pas d'IP privée genre 192.168.x.x mais directement l'IP publique. Par contre tu ne pourrais pas partager la connexion. Le port forwarding reste donc la meilleur solution (et en plus c'est plus sécurisé)

Mais je ne comprend pas trop pourquoi tu t'embête avec ça car en général on écoute sur toute les adresses disponible. Pour ça il y a la surcharge de Listen() qui ne prend que le port en paramètre. Sinon tu peux toujours mettre 0.0.0.0 comme adresse ou un IPEndPoint avec IPAddress.Any comme IP.

Commentaire de Redman31100 le 21/01/2009 01:50:01

D'accord, je vais tester 0.0.0.0 et je te tiens au courant

Mais j'ai bien fait le port forwarding et pour l'instant ça a jamais marché ^^

Commentaire de casoftware83 le 21/01/2009 10:12:24

Bonjour,
malgré le telechargement de version du 5/1/2009, j'ai toujours l'erreur suivante:
"{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}"
D'apres les precedents post redman indique que "ça marche nickel", mais pas chez moi.
Vous indiquez que "le problème venait du fait que le Buffer pour lire les données était de 0 octet", mais je ne comprend pas les modifications qu'il faille apporter a votre source pour que cela marche.
merci pour votre aide

Commentaire de babboss le 23/01/2009 02:37:46

Hum je ne vois pas trop...
Ça te fait cette erreur quand tu fait le test en local ?
Et dès que tu envoie des données, la connexion est fermée, c'est ça ?

Commentaire de casoftware83 le 23/01/2009 16:13:42

bonjour,
en detail, je lance l'appli serveur:
depuis un client telnet je me connecte sur l'ip local (192.168.1.11) et le port 8000, la connection s'etabli et le transfert des données s'opere.
en revanche lorsque j'utilise un boitier de geolocalisation qui transfert des donnees en mode TCP IP sur le port 8000, l'appli serveur leve une exception au moment de la reception des données, l'exception etant celle que redman avait signalé dans son post du 20/11/2008 ("{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}".
je precise que le serveur ecoute 192.168.1.11 et que le boitier emet vers une ip publique forwarder par le routeur (netasq) vers 192.168.1.11
Il semble qu'apres la mise a jour du code faite par vos soins le 5/01/2009, redman a reglé le probleme. moi je l'ai toujours.
encore merci pour votre aide.

Commentaire de Redman31100 le 24/01/2009 00:44:01

Oui, je suis content le programme marche quand je met une ip any en écoute sur le serveur, mais je me pose quand meme la question de savoir pourquoi avec l'ip locale ca marchait pas, enfin pas grave si on sait pas répondre, l'essentiel est fait.

Commentaire de babboss le 24/01/2009 05:55:33

Je ne vois pas vraiment d'où peut venir le problème. Si ça marche avec telnet ça veut dire que c'est bon du coté serveur.
Tu peux me dire sur quel ligne exactement il lève l'exception ?

Sinon essaye de faire un serveur basic avec la class socket du framework pour voir si ça marche.

Le boitier est censé se connecter en TCP, envoyer les données, puis se déconnecté aussi tôt ? Sinon comment est il censé fonctionner ?

Commentaire de casoftware83 le 26/01/2009 11:34:13

Bonjour,
j'en sais un peu plus:
dans la class BazSocket, la ligne
  m_Sync.BeginInvoke(CallAccepted, New Object() {Request})
leve une System.Reflection.TargetInvocationException
l'exception sous-jacente etant une Socket exception ayant pour message:
"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."

En fait mon boitier se connecte toutes les minutes en TCP/IP a l'adresse de mon serveur sur le port 3000, une fois connecté il envoie un stream contenant des donnees de geolocalisation.

Il se peut que la qualité de ma connection GPRS soit mauvaise et que la connection soit interrompu.

je continue a chercher, si le diagnostique est le bon, l'idée serait de gerer cette erreur proprement.

a+

Commentaire de casoftware83 le 26/01/2009 11:38:17

REMPLACE LE PRECEDENT (avec mes excuses)
Bonjour,
j'en sais un peu plus:
dans la class BazSocket et dans la methode Private Sub OnAccepted(ByVal Request As AcceptRequest),
la ligne
  m_Sync.BeginInvoke(CallAccepted, New Object() {Request})
leve une System.Reflection.TargetInvocationException
l'exception sous-jacente etant une Socket exception ayant pour message:
"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."

le debug me donne :
StackTrace:
à System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
à System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
        

En fait mon boitier se connecte toutes les minutes en TCP/IP a l'adresse de mon serveur sur le port 3000, une fois connecté il envoie un stream contenant des donnees de geolocalisation.

Il se peut que la qualité de ma connection GPRS soit mauvaise et que la connection soit interrompu.

je continue a chercher, si le diagnostique est le bon, l'idée serait de gerer cette erreur proprement, malheureusement moi et les thread c'est pas encore ça.

a+

Commentaire de Tropic le 02/08/2009 14:46:15

Comment fait-on pour récupérer l'adresse IP hôte
avant de faire un SocketClient.LaSocket = LaSocket.EndAccept(async)
En fait, avant d'accepter la connexion

Commentaire de hussein47 le 02/09/2009 11:57:20

Moyen d'utiliser ta classe en mode console, tu pourrais faire un petit exemple.
Et je voudrais savoir comment recuperer l'ip de quelqu'un qui ce deconnect du server.

Commentaire de ianis24 le 18/10/2009 20:05:56

HUSSEIN7 => Et je voudrais savoir comment récupérer l'ip de quelqu'un qui ce déconnecte du serveur.

Pareil Pour moi.
Car la ça me cause un gros problème et mes connaissance ne sont pas suffisante pour le régler.
Merci.

Commentaire de babboss le 19/10/2009 03:35:52

Bonjour,

Désolé, je n'est plus trop le temps de m'occuper de cette source en ce moment.

Pour respondre au questions:
- On ne peut pas (à ma connaissance) recupérer l'ip avant de faire le Accept. Il faut Accept et ensuite Close si l'ip ne vous plait pas.
- Pour l'ip de la personne qui se deconnecte une des solution est de maintenir une liste de Client aulieu de la liste de Socket dans l'exemple. Client etant une class que vous créer avec comme attribut l'objet Socket, l'ip du client, etc...
- Pour l'exemple en mode console je ne vois pas ou est le problème ? Il suffit d'utilisé le constructeur par defaut aulieu de celui qui accepte un ISynchronizeInvoke

casoftware83 > en ce qui conserne ton bug je pense que ca vien du fait que la connexion est fermer juste apres qu'on l'ai accepter mais avant que l'on commence a recevoir les données. Du coup le BeginRead plante car la connexion est deja fermer.
Je vais voir si je peut faire quelque chose. Un simple Try... Catch ne serai pas l'idéale car la connexion serait fermer avant que l'on ai pu faire AddHandler sur l'event Close et du coup on ne serait pas notifier que la connexion est déja fermée.
Je vais voir ce que je peut faire.

Commentaire de ianis24 le 25/10/2009 14:35:35

Des que tu a le temps essaie de corriger les quelques bugs.
Ta classe est très intéressante et ton niveau plutôt élevé, Je pense que tu peut créer le Socket Parfait.
Bonne Chance et encore Merci.

Commentaire de Mayzz le 01/04/2010 10:41:06 10/10

Salut BABBOSS,

Très beau travail que celui que tu nous a fais la, même si tu t'es fait aidé pour l'cross-threading, c'etait pas si évident, j'ai moi même tenté de refaire un clône parfait de ce bon vieu Winsock mais sans succès (par manque de temps...).

Le code est propre, fonctionnel, aucun bug pour ma part (j'arrive peut être alors qu'ils sont tous corrigés). Perso je met 10 pour cette source !

J'aurais juste une chose à te demander en MP...

++ Mayzz.

Commentaire de deagle15 le 27/07/2010 11:28:44

J'espère recevoir une réponse malgré la date originale, mais bon :)

Voila j'essaye d'apprendre sur les sockets un peu en analysant tes demo (Client et Server), et que personne me disent d'aller voir des tutos j'apprend que en analysant e sources. Mais bon sur mon server (Je l'ai fait en console par contre) dans l'event de fermeture de connection avec le client :

Private Sub Client_Close(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim sock As BazSocket = CType(sender, BazSocket) 'Recupere le socket concerné par l'evenement
        sock.Close() 'On close car on a plus besoin de ce socket.
        SockList.Remove(sock) 'On supprime le socket de la list
                Console.WriteLine("- Un Client s'est deconnecté")
    End Sub

Bien a CType, pour transformer le socket en BazSocket et bien sa me donne.

Impossible d'effectuer un cast d'un objet de type 'System.Net.Sockets.Socket' en type 'System.Net.Sockets.BazSocket'.

Je sais pas trop quoi faire, quelqu'un peux m'aider svp ?

Merci

Commentaire de thonyboy le 24/10/2010 06:11:27 10/10

C'est excellent !
BRAVO et MERCI

Commentaire de thonyboy le 24/10/2010 13:04:31

J'ai un souci avec cette excellente source.
Si quelqu'un peut m'aider ?

J'observe que quand un client envoie des données, tous les autres les recoivent.

Afin d'économiser la bande passante j'aimerais supprimer ce comportement.
C'est a dire que si un client envoie des données seul le serveur les recoit.

J'ai beau fouiller le source je n'arrive pas a trouver comment modifier ce comportement.


Commentaire de thonyboy le 25/10/2010 06:59:27

Désolé je viens de trouver. Je cherchais dans la librairie et en fait c'est le serveur.

Commentaire de bleach59800 le 29/10/2010 12:45:30

Bonjour ! Cette classe est énorme !! Mais j'ai un petit problème comment faire pour que le serveur puisse envoyé des données à tout les clients à la fois svp ?!

Merci !

Commentaire de thonyboy le 29/10/2010 13:02:22

Bonjour BLEACH

Coté serveur tu as ce morceau de code qui vérifie si tu a sélectionné un destinataire

        If lstClient.SelectedItems.Count <> 1 Then
            MsgBox("Veuillez sélectionner un client.", MsgBoxStyle.Information)
            Return
        End If

        Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)

        If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
            sock.Send(txtSend.Text)
            txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
            txtSend.Text = ""
            txtSend.Focus()
        End If

tu peux donc facilement le remplacé par un truc du genre

If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous

for i = 0 to lstClient.Count -1
        Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
        If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
            sock.Send(txtSend.Text)
            txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
            txtSend.Text = ""
            txtSend.Focus()
        End If
next

PS : Il y a peut etre une faute ou deux, car je tape directement la réponse sans tester sous VisualStudio

Commentaire de bleach59800 le 29/10/2010 13:08:35

Lol 1 min avant que tu le dise j'ai essayé de moi meme exactement le méme code mais sa ne marche pas ^^' sa ne l'envoie qu'au Client 1 et dans le serveur sa écrit

Envoyé: Je test !
Envoyé:

Y aurait il une autre solution j'en ai vraiment besoin svp j'ai essayé plein de chose :s


PS : T'a oublié un End if et lstClient.ITEMS.Count - 1 ^^

Commentaire de bleach59800 le 29/10/2010 15:06:32

HELP svp !! :(

Commentaire de thonyboy le 29/10/2010 15:15:11

J'attendais que tu reflechisses un peu avant de poster.... pour ne pas perdre du temps comme ce midi ;-)

Je suis étonné que la solution ne fonctionne pas.
Est tu sur de bien avoir écris dans la boucle :
' bien mettre i dans item(i)
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)

Commentaire de thonyboy le 29/10/2010 15:30:35

"T'a oublié un End if et lstClient.ITEMS.Count - 1 ^^"

Autant le Endif oui, mais le lstclient.Items.count -1 je ne vois pas.

Commentaire de bleach59800 le 29/10/2010 15:52:13

Oui oui j'ai rien oublié j'ai bien mis le i mais sa ne marche toujours pas :s et pour le
lstClient.ITEMS.Count - 1

tu avais mis lstClient.Count - 1 sans le items ^^

Mais bon le problème n'est toujours pas résolu :/

Jviens de voir un truk illogique !

If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous

Mais alors que la c'est écrit  

Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)

Comment tu veux envoyer aux clients séléctionner alors que juste avant on dis que si il y a pas de client séléctioné c'est qu'on veut l'envoyer a tous ?!! xD

Voici mon code enfait :

Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
            For i = 0 To lstClient.Items.Count - 1
                Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
                If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                    sock.Send(txtSend.Text)
                    txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
                    txtSend.Text = ""
                    txtSend.Focus()
                End If
            Next

        Else
            Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)

            If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                sock.Send(txtSend.Text)
                txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
                txtSend.Text = ""
                txtSend.Focus()
            End If
        End If
    End Sub

Quand je séléctionne mes 2 client sa n'envoie le message qu'a un client et quand je ne séléctionne aucun client sa me met cette exception :

L'index se trouve en dehors des limites du tableau.

puis sa surligne ce code :

Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)

^^'


Donc je sais plus trop quoi faire xD

Commentaire de thonyboy le 29/10/2010 16:25:01

a premiere vu le probleme vient de là (encore une fois je te répond en direct a la va vite, donc oui je fais quelques fautes...)

For i = 0 To lstClient.Items.Count - 1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)

le lstclient.selectedindice.item(i) n'est pas bon puisque ca prend tu ceux sélectionné or tu n'en a aucun.
il faut changer pour lstclient.items(i)


Commentaire de bleach59800 le 29/10/2010 16:41:15

Sa marche toujours pas sa me met :

La conversion de la chaîne "Client 1 (127.0.0.1)" en type 'Integer' n'est pas valide.

A la ligne Dim sock As BazSocket = CType(SockList.Item(lstClient.Items.Item(i)), BazSocket)

J'ai méme essayé en ne mettant que Items sans le .Item sa fais pareil :(

Commentaire de thonyboy le 29/10/2010 17:02:48

Mince. J'avais pas vu.

Bon ecoute ce n'est pas trés beau mais voila une solution rapide :

Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
    For i = 0 To lstClient.Items.Count - 1
        lstClient.SetSelected(i, True)
    Next
End If
' On lance la commande sur tous ceux qui sont sélectionné (soit quelques un par l'utisateur, soit tous si aucun)
For i = 0 To lstClient.Items.Count - 1
     if lstClient.Selected(i) = True then
        Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)

        If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
           sock.Send(txtSend.Text)
           txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
           txtSend.Text = ""
           txtSend.Focus()
        End If
    End if
Next


Voila ca devrait résoudre ton probleme si tu en selectionne 2, et si tu en selectionne aucun ca envoie a tous.


End If
End Sub



Dim i As Integer
For i = 0 To Me.ListBox1.Items.Count - 1
Me.ListBox1.SetSelected(i, True)
Next i

Commentaire de thonyboy le 29/10/2010 17:03:49

ps ne prend pas la fin en compte (aprés voila ca devrait résoudre....) c'est du reste de copier/coller

Commentaire de bleach59800 le 29/10/2010 18:38:19

Tu as fais une petite faute      if lstClient.Selected(i) = True then
c'est pas Selected mais GetSelected

Bon je viens d'essayer mais sa me fait comme tout a l'heure se n'envoie le message qu'au Client 1 :( !

Commentaire de thonyboy le 29/10/2010 19:03:10

Passons par la massegrie  car on pourri le thread

Commentaire de babboss le 29/10/2010 23:09:14

Hum, juste un petit conseil d'ordre général: évitez de faire des boucles sur les items de votre ListBox pour parcourir la liste d'utilisateurs. C'est plus propre d'avoir une liste de clients en mémoire dans une structure de données adaptée et de faire une boucle dessus.

Regardez par exemple l'evénènement Client_DataArrival dans Form1.vb du projet Server qui transmet les données reçu d'un client à tous les autres clients.

Commentaire de thonyboy le 01/11/2010 10:31:42

Bonjour Babbboss

Pour ma part, je seche sur un point.

J'aimerais que le serveur, m'affiche l'IP du client qui s'est déconnecté au lieu du banal

txtRecv.AppendText("-- Un Client s'est deconnecté --" & vbCrLf)

Mais je n'arrive pas a trouver. Dés que l'on est dans le sub client_close alors sock.RemoteEP vaut déjà nothing !!!

Peux tu m'indiquer une piste ?

Merci

Commentaire de babboss le 01/11/2010 11:40:32

Le mieux au niveau du serveur c'est d'avoir une class Client qui représente chaque client connecté.
Ensuite au lieu d'utiliser une liste de BazSocket tu utilise un Dictionary (équivalent des tableau associatif) avec comme clé la BazSocket et comme valeur ton objet Client.

Dim ClientList As New Dictionary(Of BazSocket, Client)

Dans l'event Accepted tu crée un nouveau client, tu lui passe dans son constructeur la BazSocket, et tu l'ajoute au Dictionary(au lieu de simplement ajouter la BazSocket a la liste).

Dim c As New Client(AcceptSock)
ClientList.Add(AcceptSock, c)

A partir de la dans ta class Client tu stocke ce que tu veux comme par exemple l'adresse IP du client(que tu récupères quand il est connecter, pour l'avoir au moment ou il se déconnecte)

L'intérêt du Dictionary c'est de pouvoir récupéré simplement le Client à partir de la BazSocket:

Dim sock As BazSocket = CType(sender, BazSocket) ' Récupère le socket concerné par l'évènement
        Dim client As Client = ClientList.Item(sock) ' Récupère le client qui correspond à la socket

Commentaire de thonyboy le 01/11/2010 11:51:27

Ouais, ben un énorme merci, parce que ta réponse est claire, pédagogique et complete.

Commentaire de babboss le 01/11/2010 12:33:43

Je viens de mettre à jour l'exemple serveur avec ce que je t'ai expliquer.
En faite j'avais déjà fait ces modifications il y a plusieurs mois mais je ne les avaient pas postées

Commentaire de thonyboy le 01/11/2010 17:32:07

Trop fort et maintenant le corrigé !
Et ca tombe plutot bien car découvrant le "dictionary" j'étais parti dans un truc un peu compliqué.

Commentaire de bleach59800 le 06/11/2010 21:09:15

Alors voilà j'ai adapté le code avec la nouvelle version de B@ZSocket et sa donne sa


Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
            ' Du coup on les sélectionne tous
            For i = 0 To lstClient.Items.Count - 1
                lstClient.SetSelected(i, True)
            Next
'Puis là on l'envoie à tous
            For i = 0 To lstClient.Items.Count - 1
                If lstClient.GetSelected(i) = True Then
                    Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket

                    If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
                        sockall.Send(txtSend.Text)
                        txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
                        txtSend.Focus()
                    End If
                End If
            Next
        ElseIf lstClient.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
            Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(0)), Client).Socket

            If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                sock.Send(txtSend.Text)
                txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
                txtSend.Text = ""
                txtSend.Focus()
            End If
        ElseIf lstClient.SelectedItems.Count > 1 Then ' Si plusieurs client séléctionnés mais pas tous

            For i = 0 To lstClient.SelectedItems.Count
                If lstClient.GetSelected(i) = True Then
                    Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket

                    If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
                        sockall.Send(txtSend.Text)
                        txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
                        txtSend.Focus()
                    End If
                End If
            Next
      
        End If
        
    End Sub


Quand je veux envoyer qu'à un client sa marche niquel, quand je veux envoyer a tout les clients sa marche aussi, quand je veux envoyer un message au client 1 et au client 2 niquel encore ! Mais quand je veux envoyer un message au client 1 ET au CLIENT 3 ou au client 2 ET au client 3 sa me met

L'index se trouve en dehors des limites du tableau.

A la ligne :

Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket


Merci de m'aider !

Commentaire de babboss le 06/11/2010 22:01:04

Tu as oublié un " - 1" dans ta boucle:
For i = 0 To lstClient.SelectedItems.Count -1

Sinon Pour simplifier ton code:
- Pas la peine de faire un cas particulier pour 1 client sélectionné. Un "ElseIf lstClient.SelectedItems.Count >= 1" est suffisant et ça fait du code en moins ^^
- La boucle qui envoie à tous les client est redondante avec celle qui envoie à plusieurs clients. Une fois que tu as sélectionné tous les clients tu peux te servir du "ElseIf lstClient.SelectedItems.Count >= 1"
- Le "If lstClient.GetSelected(i) = True" ne sert à rien car tu boucle déjà sur les éléments sélectionnés.
- Remettre le focus sur la zone texte après la boucle (et non pas dedans)

Commentaire de bleach59800 le 06/11/2010 22:13:03

Merciii beaucoup sa marche ! :p

Voici mon code :

        If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
            ' Du coup on les sélectionne tous
            For i = 0 To lstClient.Items.Count - 1
                lstClient.SetSelected(i, True)
            Next
            'Puis là on l'envoie à tous
            For i = 0 To lstClient.Items.Count - 1
                If lstClient.GetSelected(i) = True Then
                    Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket

                    If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
                        sockall.Send(txtSend.Text)
                        txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)

                    End If
                End If
            Next
            txtSend.Focus()
        ElseIf lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
            For i = 0 To lstClient.SelectedItems.Count - 1

                Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket

                If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                    sock.Send(txtSend.Text)
                    txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)

                End If
            Next
            txtSend.Focus()
        End If


Est ce qu'il y a des modifications pour que sa soit mieu?

Commentaire de babboss le 06/11/2010 22:26:52

Encore plus court:

If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
            ' Du coup on les sélectionne tous
            For i = 0 To lstClient.Items.Count - 1
                lstClient.SetSelected(i, True)
            Next
        End If

        If lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
            For i = 0 To lstClient.SelectedItems.Count - 1

                Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket

                If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                    sock.Send(txtSend.Text)
                    txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)

                End If
            Next
            txtSend.Focus()
        End If

Commentaire de bleach59800 le 06/11/2010 22:32:37 10/10

Merci bcp !! Je vais enfin pouvoir m'attaquer a mon projet ! :)

Commentaire de bleach59800 le 06/11/2010 23:46:21

Un autre problème :(

A la place de la listBox je veux utiliser une listView

donc dans RefreshSockList j'ai :

Private Sub RefreshSockList()

        ListView1.Items.Clear()


        For Each i As KeyValuePair(Of BazSocket, Client) In ClientList
            ' Ajoute le client a la liste
            ListView1.Items.Add(i.Value.ToString)

        Next
End Sub

Et dans mon bouton Send :

If ListView1.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
            Dim sock As BazSocket = CType(ListView1.Items(ListView1.SelectedIndices(0)), Client).Socket
            If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
                sock.Send(txtSend.text)
        
                txtRecv.AppendText("Envoyé : " & txtSend.text & vbCrLf)
                txtSend.Text = ""

            End If
End If
txtSend.Focus()

Puis sa me met l'erreur :

Une valeur de type 'System.Windows.Forms.ListViewItem' ne peut pas être convertie en 'MonProjet.Client'

et sa souligne : ListView1.Items(ListView1.SelectedIndices(0))


J'ai essayé plein de modification mais l'erreur persiste encore ! :s

Merci de m'aider svp !


PS : Je veux absolument la ListView car on peut mettre la propriété Details dans View

Commentaire de achtouf le 06/12/2010 15:25:03

Hello !

J'utilise toujours ton source parce qu'il est toujours aussi bien fait :)

Par contre, je me demande s'il n'y a pas un bug ici :

Public Sub Close()
If m_State <> BazSocketState.Disconnected AndAlso m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End Sub

Ca ne devrait pas être ce code ??

Public Sub Close()
If m_State <> BazSocketState.Disconnected Then
If m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End If
End Sub

Commentaire de Jeromedu79 le 24/02/2011 10:53:37 10/10

Très belle source.

Commentaire de guilleto le 06/04/2011 14:46:28

Bonjour à toutes et tous,

Je n'arrive pas à faire fonctionner la source sur 2 postes faisant parti du même réseau !
J'arrive seulement à la faire fonctionner sur le même PC avec les Adresses IP de base.

Est-ce que quelqu'un a déjà rencontré ce problème ?

Par avance merci.

Olivier

Commentaire de thonyboy le 06/04/2011 15:08:44

Bonjour.

Cette source fonctionne parfaitement sur plusieurs PC je l'utilise au quotidien.
Vérifie tes params réseau, et assures toi que le port utilisé n'est pas bloqué

Commentaire de angelblood le 14/04/2011 20:40:09

Bonjour,
Est-il possible d'envoyer une image entière xD (j'ai réussi que une partie) du client au serveur ? :)

Merci

Commentaire de thonyboy le 07/06/2011 19:29:56

@baboss
tu es toujours là ?
J'ai un petit soucis au niveau du serveur avec Private Sub Client_DataArrival(ByVal sender As Object, ByVal data() As Byte)
En effet lorsque les données sont envoyée avec un certains laps de temps, pas de soucis.
Mais lorsque le serveur recoit (trop?) de Data à un instant T, Data contient plusieurs lignes de données envoyé par plusieurs send.
Ex: si je fais une boucle au niveau du client qui fait un Send

Les lignes recues, sont alors numérotées dans la chaine Data de DataArrival (sans CRLF)

Qu'elle est (ou était ta vision pour gerer cela) ?

Il est vrai que mon sub Client_DataArrival traite et interperte les données ce qui met un certain temps.
La solution est elle dans un nouveau thread pour le traitement des données afin de ne pas retarder le DataArrival ?

D'avance merci

ThonyBoy

Commentaire de surfzoid le 07/06/2011 21:03:50

Faire une pile avec des index!

Commentaire de babboss le 08/06/2011 00:30:42

@thonyboy
En effet quand tu fait un send pour envoyer un paquet de donner rien ne garantie qu'il va arriver tel quel dans le Client_DataArrival. Si il y a des problèmes sur le réseau il peut arriver en 2fois. Si tu envoie un gros paquet de données (plus de 8k si ma mémoire est bonne) il va également arriver en plusieurs fois. Si tu fais plusieurs petits send à la suite, ils vont arriver en une foi. Etc...

La solution la plus propre c'est de définir un protocole pour envoyer tes données. Par exemple tu définis que tous tes paquet finisse par CRLF. Ensuite dans ton Client_DataArrival tu rajoutes ces données dans un buffer. Et ensuite tu "parse" ton buffer pour récupérer les paquets un par un et les analyser. Si un paquet n'est pas encore fini d'arriver il reste dans le buffer jusqu'au prochain appel de Client_DataArrival. En gros le principe c'est d'avoir un système de queue ou tu analyse les paquets dans l'ordre ou il arrive et tu attends que le paquet soit complètement arrivé pour l'analyser.

Je ne sais pas si c'est très clair. J'essayerai de faire un bout de code si j'ai le temps.

Commentaire de guilleto le 17/06/2011 17:23:53

Bonjour babboss,

Je n'arrive toujours pas à faire fonctionner ce soft.
Sur le PC serveur je mets le serveur.exe avec la DLL et je configure l'adresse IP avec l'IP du PC client.
Sur le PC client je mets le client.exe avec la DLL et je configure l'adresse IP avec l'IP du PC serveur.

Je clique sur Connect et voici le message :
-- Impossible de se connecter:Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu 192.168.1.136:11111

Que dois-je faire pour que cela fonctionne ?

Par avance merci

Olivier

Commentaire de thonyboy le 17/06/2011 17:35:42

@Guilleto

Tu fais erreur sur la config du serveur il ne faut pas mettre l'adresse IP du client (car il peut y avoir plusieurs client qui se connectent au serveur).
Tu dois mettre l'adresse IP du PC Serveur.
Et les ports doivent etre le meme coté client et coté serveur

Commentaire de thonyboy le 17/06/2011 17:53:31

En complement de ma réponse précédente, il faut également que tu t'assure que le port que tu utilise est bien ouvert et non bloqué par un parefeu ou autre

Commentaire de guilleto le 18/06/2011 00:06:04

Merci pour ces précisions !

Je vais tester cela dès que possible !

Encore merci.

Olivier

Commentaire de rapha35 le 20/06/2011 17:55:58

Bonjour tout le monde !
Je recontre un problème dans l'utilisation du B@zSocket :

System.ObjectDisposedException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
at System.Net.Sockets.NetworkStream.EndWrite(IAsyncResult asyncResult)


ce qui fait crash immédiatement le software ... (ligne 847)

Merci de votre aide.

Commentaire de thonyboy le 06/07/2011 10:16:36

Bonjour BabBoss

Je me pose quelques questions au niveau du code.

Private Sub OnAcceptFailed(ByVal ex As Exception)
        Try
            If InvokeRequired() Then
                If m_AsyncEvent Then
                    m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
                Else
                    m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
                End If
            Else
                Sync_AcceptFailed(ex)
            End If
        Catch exp As Exception
            OnThreadException(exp)
        End Try
    End Sub

Ici je me demande s'il n'y a pas une erreur. En effet on fait la meme chose quand m_async_event est vrai ou faux.
Il ne me couterait rien de virer le test mais je me dis que tu devais vouloir faire quelque chose de different.




D'autre part j'ai l'impression que les 2 fonctions suivantes ne sont pas utilisées :
Private Sub OnSendProgress
et
Private Sub OnSendComplete

ThonyBoy

Commentaire de guilleto le 02/08/2011 10:26:24

Bonjour à toutes et tous,

J'ai réussi à faire fonctionner l'application : juste un problème de droit !

En revanche je voudrais savoir comment refuser un client si celui-ci existe déjà ?
Et de la même manière lorsque j'ai un socket qui est reçu par le serveur en provenance du Client n°1, comment envoyer une réponse uniquement à ce Client et non à tout les clients indiqués dans la liste ?

Par avance merci

Olivier

Commentaire de surfzoid le 02/08/2011 12:34:41

Il te faut gérer une pile, ou une collection

Commentaire de surfzoid le 02/08/2011 12:35:32

http://www.pise.info/vb-net/06.htm
http://plasserre.developpez.com/cours/vb-net/
http://www.google.fr/search?q=collection+vb+net&ie=utf-8&oe=utf-8&aq=t&rls=com.mandriva:en-US:unofficial&client=firefox-a

Commentaire de guilleto le 02/08/2011 14:12:38

Merci SurfZoid pour ta réponse.

Ce que je souhaites faire c'est que lorsqu'un Client envoie un socket, seul le Serveur récupère ce socket !
Est-ce que cela est possible ?
Pour envoyer un message uniquement à un client c'est dans le source mais je ne l'avais pas vu !
Et pour ce qui est de refuser un Client déjà connecté, je penses avoir trouvé !

Par avance merci

Olivier

Commentaire de thonyboy le 08/08/2011 14:26:30

@Guilleto

Lorsqu'un client envoie un socjet seul le serveur le récupe.
Pour ce qui est de refuser un client déèja connecté, il est normalement impossible pour un client de se connecter 2 fois, sauf a utiliser si ce client utilise une adresse Ip différente pour chaque connexion

Commentaire de surfzoid le 08/08/2011 15:55:29

Mettre en place un protocole d'authentification, de jeton, d'index, de plage, de passphrase, de mot de passe enfin la liste est longue

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Winsock client qui ne marche qu'une fois! [ par Olivier ] Mon application client serveur fonctionne parfaitement une seule fois.La seconde fois, le client plante sur .connect en annonçant "adresse en cours d' Client et serveur IRC avec Winsock (Aide !!!) [ par KOOK ] Salut, j'ai télécharger plusieurs sources de client et serveur irc mais aucune ne marche, j'ai un problème avec Winsock, pourriez vous m'aider, existe winsock client/serveur [ par Meddah ] je veux réalisé une application qui calcule les tarifs dans un cybercafé je cherche soi un exemple pour base sur lui soi une aide sur winsock car je n winsock client/serveur [ par Meddah ] je veux réalisé une application qui calcule les tarifs dans un cybercafé je cherche soi un exemple pour base sur lui soi une aide sur winsock car je n winsock : [ par Yan ] Voila je code une app client/serveurJe cherche à faire un serveur multi-clientsbon chez mio je lance le machin la connexion s'établit, cool :)Je quitt help me : winsock prob... [ par Hardousss ] Salut tlm !!chui un debutant en vb et c'est ma premiere participation au fameux forum vbfrance.com donc...i trust in ur ingenuity guys to help me sol Fermeture correct socket - (Winsock ) [ par toine21bis ] ben voili,j'ai un serveur et un client.Je veux que lorsque mon client quitte le programme vb et le relance, que la connexion se refasse correctement. Fermeture correct socket - (Winsock ) [ par toine21bis ] ben voili,j'ai un serveur et un client.Je veux que lorsque mon client quitte le programme vb et le relance, que la connexion se refasse correctement. Client/Serveur envoi d'1 image [ par Arnaud01 ] Re-Bonjour à tous,j'aurai souhaité savoir comment il fallait si prendre pour envoyer une image en Client/Serveur avec Winsock.GetData etWinsock.Send Winsock en VB.Net [ par yous ] J'ai bien compris l'utilisation de Winsock en VB6 mais je rencontre un gors pb pour le faire fonctionner en .Net.Au chargement de l'interface, je défi


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,196 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales