Autosocket, un clone du contrôle winsock en .net

Soyez le premier à donner votre avis sur cette source.

Vue 19 660 fois - Téléchargée 2 804 fois


Description

Dans le Framework .NET, il ya une classe Socket dans l'espace de noms System.Net.Sockets.Socket qui marche bien, mais qui ne lance pas d'événements. Il faut en permanence vérifier l'état du socket, c'est à dire si des données sont disponibles, s'il y a une connexion en attente... AutoSocket est donc une classe qui expose les méthodes les plus utilisées de la classe Socket (Send, Connect, Listen, etc), tout en la simplifiant avec des événements. L'événement Close se produit quand le socket se déconnecte, avec un message de l'erreur s'il y en a une; l'événement DataArrival, semblable à celui du contrôle WinSock qui se produit quand des données arrivent et l'événement Connect qui est explicite. L'utilisation des événements permet de simplifier beaucoup la classe socket: pas besoin de vérifier les connexions en attente et d'appeller Accept(), ni de vérifier les données disponibles, tout est automatique.

Source / Exemple :


'Pour utiliser le socket

'client:
Dim socket As New AutoSocket()
'pour se connecter:
socket.Connect( New IPEndPoint( IPAddress.Parse("<adresse IP>"), <port> ))

'server
Dim socket As New AutoSocket( New IPEndPoint( IPAddress.Parse("<adresse IP locale>"), <port> ) )
'pour se mettre en écoute:
socket.Listen()

'client/server

'pour envoyer des données:
Dim data As Byte()
socket.Send( data )

'pour recevoir des données:
AddHandler socket.DataArrival,  socket_DataArrival

Private Sub socket_DataArrival( sender As Object, data As Byte() )
     'utiliser les données
End Sub

'pour voir la progression de l'envoi:
AddHandler socket.DataDeparture, socket_DataDeparture
AddHandler socket.SendComplete, socket_SendComplete

Private Sub socket_DataDeparture( sender As Object, e as DataDepartureEventArgs )
     'envoyé e.CurrentBytesSent sur e.TotalBytes
End Sub

Private Sub socket_SendComplete( sender As Object, e as EventArgs )
     'l'envoi est terminé
End Sub

Conclusion :


La classe AutoSocket peut être améliorée mais toute la base pour écouter les événements de sockets est présente et testée, il est facile d'ajouter un événement, comme par exemple l'arrivée de données hors-bande ou la fin d'un envoi de données.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

Je pense pas qu'elle soit très adaptée au mode console, le plus simple serait d'utiliser les classes Socket, TcpServer ou TcpClient du framework. Qu'est ce que tu veux faire en gros?
Messages postés
3
Date d'inscription
mardi 10 février 2009
Statut
Membre
Dernière intervention
2 septembre 2009

Y aurai 'il moyen d'utiliser ta classe en mode console, tu peut me montrer un exemple sil te plait, je suis débutant...
Messages postés
103
Date d'inscription
lundi 8 juillet 2002
Statut
Membre
Dernière intervention
24 novembre 2005

Bonjour,

Merci! Et c'est marrant parce qu'en ce moment je suis aussi en train de bosser avec des sockets, mais non bloquants (sous Linux) et avec Python.

Pour être honnête ça fait des années que j'ai pas touché au code et que j'ai pas programmé en VB.NET donc je suis pas sûr d'être d'une grande aide pour trouver le bug.

Mais pour essayer, est ce que les données sont bien envoyées? Est ce que si tu mets un point d'arrêt sur '_socket.Send(data, ...)' dans AutoSocket.Send() il passe dessus? Et sur la ligne 'RaiseEvent DataDeparture' ?
Messages postés
1
Date d'inscription
mercredi 24 décembre 2008
Statut
Membre
Dernière intervention
31 août 2009

Bonjour,
Premièrement, je tiens à dire que ce code est vraiment super !
Ensuite, j'ai un petit problème avec les évènements DataDeparture et SendComplete. L'évènement ne se déclenche pas.
J'ai cherché dans le code de la classe d'où pourrait venir l'erreur, mais sans succès.
Voila, voila...

Merci d'avance.

Kardyne.
Messages postés
13
Date d'inscription
mercredi 28 juin 2006
Statut
Membre
Dernière intervention
21 juillet 2009

Salut,
Comment mettre dans une variable les données d'un socket precis ?
merci
Afficher les 61 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.