Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ASYNC TCP SOCKET


Information sur la source

Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous : socket, asynchrone, tcp Niveau : Débutant Date de création : 20/12/2006 Vu : 9 057

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


Description

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

  • 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
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

Commentaires et avis

signaler à un administrateur
Commentaire de leptidev le 04/12/2007 23:14:01 8/10

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 ...

signaler à un administrateur
Commentaire de tassali le 27/05/2008 12:33:51

super j'ai testé ce code et il marche à merveille
je voudrais savoir comment faire la meme chose en UDP

signaler à un administrateur
Commentaire de aKheNathOn le 25/06/2008 19:21:59

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.

signaler à un administrateur
Commentaire de psykocrash le 26/06/2008 20:04:35

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é.

signaler à un administrateur
Commentaire de Clecle0401 le 03/07/2008 15:00:46

Comment, par exemple, faire un retour à la console quand l'évènement Connected est appelé ?

signaler à un administrateur
Commentaire de werdDomain le 05/10/2008 09:09:21

bon, je ne sait si le probleme est résolut, mais je peut vous éclairé a propos des "Delegate" ...
Il est possible, avec un Delegate, de faire une opperation Inter-Thread en règle :P
voici comment :

'on crée un sub ...
private sub MONSUB(str as string)

end sub

'on declare notre "Delegate" :
private Delegate sub MonDelegate(Str as string)
'On crée une instance de ce delegate et on le refere a MONSUB
dim DelegateInstance as new MonDelegate(AdressOf MONSUB)
'on declare un sub "Public" sur le form :
public sub Action(Str as string)
'on vérifie que l'Invoke est aubligatoire
if InvokeRequired then
  'on invoke le Delegate a avec le thread du form(ME)
  ME.invoke(DelegateInstance, new object() {str})
else
  DelegateInstance(str)
end if
end sub

donc, pour résumé... Quand on feras appele au sub "Action()" a partir d'un autre thread que le form, il vas invoker le "Delegate" a partir du thread du form.
Invoke, c'est comme si on demenderais au Thread qui a crée le form, d'executer ce sub a la place de l'autre thread.
De cette façon, vous n'obtienderez plus d'erreur
"Opperation Inter-Thread invalide" ou
"impocible d'acceder au controle a partir d'un thread autre que celui qu'il la crée"

signaler à un administrateur
Commentaire de Redman31100 le 05/10/2008 10:06:10

Souvent il dit "Hote inconnu" alors que je met une adresse HTTP et port 125

Et quand je met une IP il met adresse non compatible avec le protocole.

Je trouve pas ça normal.

signaler à un administrateur
Commentaire de Redman31100 le 05/10/2008 10:12:48

J'ai trouvé l'erreur : T'a utiliser Resolve de DNS j'ai remplacé par Net.IPAddress.Parse(Hostname)

signaler à un administrateur
Commentaire de Redman31100 le 05/10/2008 13:33:25

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

signaler à un administrateur
Commentaire de Redman31100 le 05/10/2008 13:46:41

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.

signaler à un administrateur
Commentaire de Clecle0401 le 19/10/2008 18:51:01

Comment, par exemple, faire un retour à la console quand l'évènement Connected est appelé ?

signaler à un administrateur
Commentaire de Redman31100 le 19/10/2008 18:53:03

Comment ça faire un retour à la console ?

signaler à un administrateur
Commentaire de Clecle0401 le 22/10/2008 20:50:24

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é :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

raw socket et protocole TCP/IP [ par robertmouac ] Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve raw socket et protocole TCP/IP [ par robertmouac ] Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (verif avec ethreal). Le pr Socket TCP [ par Leo_Robotic_Passion ] Bonjour a tousCe source socket TCP tiré des codes de vbfrance (merci aux auteurs au passage) regroupe un client et un serveur ! J'ai essayé de s Timeout TCP sur les sockets [ par shackleton1986 ] Je suis en train de faire des tests sur les sockets TCP dans le framework 2.0 et j'ai remarqué quelque chose d'assez curieux...Je voulais savoir à que Serveur, Client, FTP, Socket , Stream [ par dbx99 ] Bonjour,ma question a pour but de m'orienter dans la bonne direction.Je souhaite créer une application serveur à laquelle on ne pourra accéder que par Utilisation d'un socket [ par ratala ] Bonjour tout le monde, je cherche a créer un bot pour un jeux, mais en utilisant sa connexion. Je connais le numero du socket, quelqun a une idée de c sérialisation et sockets [ par Kite37 ] Bonjour ! Alors voici ma question : Pour le besoin de mon logiciel, je me retrouve dans l'obligation d'envoyer des objets complet via socket.Ceux-ci n autoformation socket [ par big wallace ] salut tous le monde,voila je vodrais si possible des cours autoformation en programmation socket,& merci d'avance . TCP/IP Modbus pour Automate [ par snakzbenjy ] Bonjour à tous,Alors voilà je suis en stage (BAC+2) et celà fait plusieurs jours que je m'arrache les cheveux.Je doit faire un petit programme en Visu Delegate, non asynchrone [ par OneHacker ] Bonjour, alors j'appelle une procédure de façon asynhrone come on me l'a expliqué mais ca ne marche pas :     Delegate Sub LoadLink(ByVal link As Stri


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,624 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.