Async tcp socket

4/5 (13 avis)

Snippet vu 14 167 fois - Téléchargée 31 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
Clecle0401 Messages postés 21 Date d'inscription samedi 14 septembre 2002 Statut Membre Dernière intervention 10 juin 2009
22 oct. 2008 à 20:50
Je ne sais pas, inscrire quelque chose, afficher un message, appeler une fonction etc..

Quelque chose qui me prouve par exemple que je suis bien connecté :)
Redman31100 Messages postés 167 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 11 février 2009
19 oct. 2008 à 18:53
Comment ça faire un retour à la console ?
Clecle0401 Messages postés 21 Date d'inscription samedi 14 septembre 2002 Statut Membre Dernière intervention 10 juin 2009
19 oct. 2008 à 18:51
Comment, par exemple, faire un retour à la console quand l'évènement Connected est appelé ?
Redman31100 Messages postés 167 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 11 février 2009
5 oct. 2008 à 13:46
J'ai trouvé je fais connect et de suite send, mais EndConnect entre les 2 n'a pas été exécuté donc je dois faire Send dans l'évenement connected.
Redman31100 Messages postés 167 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 11 février 2009
5 oct. 2008 à 13:33
J'ai toujours cette erreur, même sur une IP d'un pote avec le port MSN :

Une requête d'envoi ou de réception de données n'a pas été autorisée car le socket n'est pas connecté et (lors de l'envoi sur un socket datagramme en utilisant un appel sendto) aucune adresse n'a été fournie.

SocketError : NotConnected

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.