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-CONTRLE-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.