begin process at 2012 02 13 20:49:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > ASYNC TCP SOCKET

ASYNC TCP SOCKET


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

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

Auteur : psykocrash

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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



 Sources du même auteur

Source avec Zip Source .NET (Dotnet) FREEACCESS.NET - VISIONNEUSE DE BASES DE DONNÉES ACCESS
Source avec Zip FREEACCESS : CLONE DU LOGICIEL ACCESS
Source avec Zip COMMENT CRÉER UN MODULE DE CLASSE
INVITE DE COMMANDE : TEXTBOX LOCKER
INTÉRACTION AVEC LES FICHIERS (LECTURE ASCII & BINAIRE) (N°1...

 Sources de la même categorie

Source avec Zip Source avec une capture GESTIONNAIRE DE TÉLÉCHARGEMENT, AVEC REPRISE ET MULTITHREADI... par Madx23
Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA par vicosta
Source avec Zip Source avec une capture DICTIONAIRE TEXT/AUDIO/VISUELLE ANGLAIS AVEC WEBBROWSER CONT... par majnounmajda
Source avec Zip Source .NET (Dotnet) NSLOOKUP EN VB.NET OU COMMENT FAIRE UNE REQÛETE DNS EN PRÉCI... par ShareVB
Source avec Zip Source avec une capture MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS... par lemout

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) OVERSOCK - CLASS SOCKET ASYNCHRONE MULTI-CLIENT AVEC INTER-T... par iLgend
Source .NET (Dotnet) ASYNC SOCKET par iLgend
Source avec Zip Source avec une capture Source .NET (Dotnet) COMMUNICATION TCP CLIENT-SERVEUR ASYNCHRONE par anadom
Source avec Zip Source avec une capture Source .NET (Dotnet) [VB2008] REVERSI par Kite37
Source avec Zip Source avec une capture Source .NET (Dotnet) SOCKET ASYNCHRONE (CLIENT + SERVEUR) par elguevel

Commentaires et avis

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

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

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.

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

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

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"

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.

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)

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

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.

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

Commentaire de Redman31100 le 19/10/2008 18:53:03

Comment ça faire un retour à la console ?

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 Problème Socket asynchrone [ par pictom41 ] Bonjour, J'ai un problème pour un TP de classe. Je dois pratiquer une connexion et une action spécifique sur un serveur a socket asynchrone. J'ai choi 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,307 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales