Async tcp socket

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

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.