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

Soyez le premier à donner votre avis sur cette source.

Vue 24 717 fois - Téléchargée 3 831 fois

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

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
dimanche 9 janvier 2011
Statut
Membre
Dernière intervention
24 juin 2013

Ta source a beaucoup servi pour certains, mais pas vraiment dans le bon sens ^^
Messages postés
39
Date d'inscription
dimanche 11 octobre 2009
Statut
Membre
Dernière intervention
9 mai 2015
3
Bonjour,

Lors du lancement du serveur, le pare feu Windows 7 ne me demande pas d'autorisé la connexion ?
Résultat cela bloque la connexion ! Il y a t-il un moyen d'afficher cette page de confirmation ?

Sinon j'ai tester en désactivant le pare feu Windows 7 mais un message d'erreur s'affiche sur le client :
" -- Impossible de se connecter:Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée 90.xxx.xxx.xxx.:1234 . "

Mon routeur est correctement configurer, j'ai ouvert le port 1234.

Merci d'avance pour votre aide.
Messages postés
463
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
21 avril 2010

Mettre en place un protocole d'authentification, de jeton, d'index, de plage, de passphrase, de mot de passe enfin la liste est longue
Messages postés
165
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
16 février 2011

@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
Messages postés
256
Date d'inscription
jeudi 23 octobre 2003
Statut
Membre
Dernière intervention
20 mars 2013
1
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
Afficher les 145 commentaires

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.