Async tcp socket

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 355 fois - Téléchargée 29 fois

Contenu du snippet

Classe de pour faciliter l'utilisation des sockets tcp en mode asynchrone.

Je dois maintenant trouver le moyen de régler le problème des opérations inter-threads non valides. J'ai lu quelques sources sur des fonctions delegates, mais j'ai pas compris leur fonctionnement. Si vous en avez compris le fonctionnement, merci de m'aider ici ou par message privé ;)

Source / Exemple :


Imports System
Imports System.Net
Imports System.Net.Sockets

Public Class CAsyncTCPSocket

#Region "Attributs"
    Private aSocket As Socket
    Private aTemporaryBuffer As Byte()
    Private aTemporaryBufferLenght As Integer
#End Region

#Region "Evènements"
    Public Event Connected()
    Public Event Disconnected()
    Public Event DataSended()
    Public Event DataArrival(ByVal Data As Byte(), ByVal Lenght As Integer)
#End Region

#Region "Constructeur"
    Sub New()
        Me.aTemporaryBufferLenght = 1024
    End Sub
#End Region

#Region "Parametrage"
    Public Property ReceiverLenght() As Integer
        Get
            Return Me.aTemporaryBufferLenght
        End Get
        Set(ByVal Lenght As Integer)
            Me.aTemporaryBufferLenght = Lenght
        End Set
    End Property
#End Region

#Region "Connexion"
    Public Sub Connect(ByVal Hostname As String, ByVal Port As Integer)
        Me.aSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Me.aSocket.BeginConnect(New IPEndPoint(Dns.GetHostEntry(Hostname).AddressList(0), Port), AddressOf ConnectCallback, Nothing)
    End Sub

    Private Sub ConnectCallback(ByVal asyncResult As IAsyncResult)
        Me.aSocket.EndConnect(asyncResult)
        Call Receive()
        RaiseEvent Connected()
    End Sub
#End Region

#Region "Déconnexion"
    Public Sub Close()
        Me.aSocket.Shutdown(SocketShutdown.Both)
        Me.aSocket.Close()
        RaiseEvent Disconnected()
    End Sub
#End Region

#Region "Réception de données"
    Private Sub Receive()
        ReDim Me.aTemporaryBuffer(Me.aTemporaryBufferLenght)
        Me.aSocket.BeginReceive(Me.aTemporaryBuffer, 0, Me.aTemporaryBuffer.Length, SocketFlags.None, AddressOf ReceiveCallback, Nothing)
    End Sub

    Private Sub ReceiveCallback(ByVal ar As IAsyncResult)
        Me.aSocket.EndReceive(ar)
        RaiseEvent DataArrival(Me.aTemporaryBuffer, Me.aTemporaryBuffer.Length)
        Call Receive()
    End Sub
#End Region

#Region "Envoit de données"
    Public Sub Send(ByVal Data As String)
        Dim Buffer As [Byte]() = System.Text.Encoding.ASCII.GetBytes(Data)
        Me.Send(Buffer)
    End Sub

    Public Sub Send(ByVal Data As Byte())
        Me.aSocket.BeginSend(Data, 0, Data.Length, SocketFlags.None, AddressOf SendCallback, Nothing)
    End Sub

    Private Sub SendCallback(ByVal ar As IAsyncResult)
        Me.aSocket.EndReceive(ar)
        RaiseEvent DataSended()
    End Sub
#End Region

End Class

A voir également

Ajouter un commentaire

Commentaires

leptidev
Messages postés
206
Date d'inscription
mercredi 30 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2007
-
Code parfait, bref et très concret, manque un peu de commentaire peut etre sur le côté asynchrone !

Bon travail et merci j'ai enfin pu faire marcher ce *** de composant ...
tassali
Messages postés
6
Date d'inscription
mercredi 30 mai 2007
Statut
Membre
Dernière intervention
27 mai 2008
-
super j'ai testé ce code et il marche à merveille
je voudrais savoir comment faire la meme chose en UDP
aKheNathOn
Messages postés
285
Date d'inscription
dimanche 22 juillet 2001
Statut
Modérateur
Dernière intervention
5 décembre 2013
-
J'ai un message d'erreur sur l'événement DataArrival :
Opération inter-threads non valide : le contrôle 'logs' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

Sous Visual 2005 - saurais-tu d'où ça vient ?

Merci d'avance.
psykocrash
Messages postés
244
Date d'inscription
vendredi 14 juin 2002
Statut
Membre
Dernière intervention
17 mars 2009
-
C'est un problème connu. En fait l'évènement DataArrival est déclanché par un callback. Ce callback est un thread différent du thread qui gère ton interface, ta form. Par mesure de sécurité, il est interdit à un thread d'exécuter du code dans un autre, d'où l'erreur que tu as.

De ce que j'ai lu sur Internet, il faut utiliser des delegate. J'ai donc mis à jour mon code en les intégrant mais ça ne fonctionne pas (c'est pour ça que j'ai pas mis la MAJ ici). Y'a bien ce code b@z socket qui a trouvé un moyen de finter ça et les gens semblent contents de ce code, mais je l'ai trouvé un peu trop chaotique, trop complexe pour l'usage auquel il est destiné si tu veux. Je continue donc à chercher une meilleur solution.

Si quelqu'un sait comment résoudre ce problème, je suis intéressé.
Clecle0401
Messages postés
21
Date d'inscription
samedi 14 septembre 2002
Statut
Membre
Dernière intervention
10 juin 2009
-
Comment, par exemple, faire un retour à la console quand l'évènement Connected est appelé ?

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.