B@z socket v 1.4 - class de socket avec événements, multi-connexion, cross-threading, sans api

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

Source / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.