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 !

B@Z SOCKET V 1.3 - CLASS DE SOCKET AVEC ÉVÉNEMENTS, MULTI-CONNEXION, CROSS-THREADING, SANS API


Information sur la source

Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous : socket, winsock, client, serveur, thread Niveau : Initié Date de création : 16/02/2006 Date de mise à jour : 20/01/2009 22:59:08 Vu / téléchargé: 12 329 / 2 421

Note :
9,67 / 10 - par 12 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Comme le dit le titre, cette class permet d'avoir des sockets avec des événements en VB.NET. Effectivement la class fournie dans le framework (System.Net.Sockets) ne lance pas d'événements ce qui n'est pas pratique du tout (Surtout pour ceux qui son habitués au Winsock de VB6).
Xya a déjà posté une source permettant de faire à peu près la même chose (Cf http://www.vbfrance.com/codes/AUTOSOCKET-CLONE-CONTRLE-WINSOCK-NET_20110.aspx)
Je me suis donc inspiré de ça source pour faire ma class.
Cependant je n'utilise pas la même méthode que lui. Je me contente d'utiliser les fonctions BeginXXX de la class socket plutôt que d'ecouter les événements du socket. Ca permet de ne pas utiliser les fonctions de l'API Winsock. Tout est en .Net
Il y a également un autre problème dans la version Auto Socket de Xya: Le Cross-Threading.
Quand on capture un événement de Winsock ou que la fonction CallBack d'une méthode BeginXXX est appelée et que l'on déclenche un événement avec RaiseEvent celui-ci ne s'exécute pas dans le Thread principal. Si dans l'événement de notre Form on écrit quelque chose du genre: Text1.Text = "Toto" On a une exception qui se lève: "Cross-thread operation not valid: Control 'Text1' accessed from a thread other than the thread it was created on."
En gros on n'a pas le droit de toucher à Text1 depuis un autre thread que celui ou il a été créé.
Il me semble que cette exception ne se lève qu'avec Visual Studio 2005 et pas avec le 2003. Toujours est t-il que ce n'est pas beau !
Xya m'a donc aider à résoudre ce problème car il l'a deja corrigé dans la version C# de Auto Socket. Cependant j'ai du l'adapter à VB car on ne peut pas déclencher un événement en utilisant un délégué! J'ai donc bidouillé un peut :)
Voila pour la petite anecdote.

La class permet également de gérer vous même plusieurs connexions sur un serveur (Un exemple est fournis dans le zip)

J'ai aussi rajouter 2 propriétés permettant de customizer le comportement de la class:
- AlwaysRaiseClose : Permet de déclencher l'évènement Closed quand on fait Sock.Disconnect() (Ca me perturbais que l'évènement Close ne soit pas déclenché quand je fesai Winsock.Close :D)

- AsyncEvent : Cette propriétés est assez intéressante. Prenons un exemple pour l'illustrer. Imaginons que vous faite un serveur avec Winsock. Des données arrivent, l'événement DataArrival est donc déclenché. Vous commencer à traiter ces données... Et la d'autre données arrivent ! La procédure en cours est donc interrompu et un nouvel évènement DataArrival est déclenché ! Vous n'allez donc pas traiter les données dans l'ordre ou elles arrivent alors que c'est peut être primordiale. Exemple sur un client IRC, quand il ya un "JOIN Toto" puis un "MODE #Channel +o Toto" Si vous traiter le MODE avant le JOIN vous êtes mal barré :P
Cette propriété permet donc de régler simplement le problème.

J'ai également inclus un exemple de client et de serveur(acceptant plusieurs clients) pour  montrer comment la class fonctionne.

 

Source

  • ''''''''''''''''''''''''
  • ' Tout est dans le ZIP '
  • ''''''''''''''''''''''''
''''''''''''''''''''''''
' Tout est dans le ZIP '
''''''''''''''''''''''''

Conclusion

Je tiens à remercier encore une fois Xya pour m'avoir aider sur le problème de Cross-Threading.

Ah oui j'oubliai, tout est écrit en VS2005 donc .NET 2.0 j'ai essayé de ne pas utilisé les fonctions qui n'existe pas en .NET 1.x mais comme je ne les connais pas toutes vous risquez d'avoir des problèmes
Je ne programme en .NET que depuis trés peut de temps et donc j'ai commencer avec VS2005.

Voila, si vous trouvez des bugs dite le moi j'essaierai de les corrigés au plus vite :)
Et n'hésiter pas à mettre des commentaires.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

27 février 2007 19:40:43 :
Version 1.1 -------------- + Ajout des évènements suivant: * ThreadException: Se declenche quand une exception se produit dans un autre évènement. * Listening: Se declenche quand le socket a reussi a Listen * ListenFailed: Se declenche quand le socket n'a pas reussi a Listen + Recuperation de l'hôte de façon asynchrone pour ne pas bloquer l'affichage + Utilisation du DefaultEncoding aulieu du ASCIIEncoding pour mieu gérer les caractère latin (é,è,à,ç,...) + Divers petits bugs resolu Je posterai bientot une class BazSSLSocket pour pouvoir faire du client/server en utilisant SSL
05 novembre 2008 16:54:43 :
Version 1.2 ------------ + Correction de quelques fautes d'orthographes (il doit en rester plein) + Ajout des commentaire avec ''' sur les méthodes publiques + Correction d'un bug trouvé par Redman31100 qui empechait d'écouter sur l'adresse que l'on veut
05 novembre 2008 16:59:22 :
Changement du titre en 1.2 ^^
05 janvier 2009 16:43:13 :
Correction d'un bug qui fermait la connexion lors de la réception de données.
20 janvier 2009 22:59:10 :
Correction d'un bug dans le client qui fermait toute l'application quand on fermait le premier client.

Commentaires et avis

signaler à un administrateur
Commentaire de babboss le 16/02/2006 03:58:25

Ca fait longtemps que je n'avais pas poster de sources sur VBFrance ^^
Ca fait tout drole ^^

signaler à un administrateur
Commentaire de magloui le 16/02/2006 16:17:34

Merci a toi pour cette exelente source, cela devrait ravir pas mal personne, qui avait laisser des commentaires sur le nombre de connection limité a une.

Continue comme ca c'est exelent.

signaler à un administrateur
Commentaire de babboss le 17/02/2006 17:28:26

merci,
j'espere que ca pourra servir a des gens ^^

signaler à un administrateur
Commentaire de psycho81 le 09/03/2006 16:40:47

Bonjour,

Voilà, je t'expose mon problème.

Prenons 2 ordinateurs qui se connectent sur internet.
Ces deux ordinateurs sont dans un réseau et ne sont pas les paserelles Internet. Comment fournir aux deux postes (transformé pour l'occasion en client serveur bien sur) les accès directs l'un à l'autre (comme Emule par exemple). Je présume qu'il faut un troisième ordinateur (le serveur) qui transmet un socket (avec les datagramme de sous réseau) car avec le TcpClient du framework, nous ne pouvons que nous servir d'une adresse IP. Or l'adresse IP que nous avons sur Internet est celle de la paserelle Internet. Donc je me demande comment fait Emule par exemple pour permettre à deux ordinateur d'avoir une connexion directe dans ces cas ci.

Si tu a la solution à ce problème, tu me rendra le plus grand service que j'ai jamais eu !!!

Bernard


signaler à un administrateur
Commentaire de babboss le 11/03/2006 00:48:52

Je pense que le plus simple c'est de bien configurer ton routeur :D
Il suffit de rediriger(Forward) les port que tu veux sur l'addresse IP (locale) de ton choix
Je ne connais pas tellement eMule mais a mon avis il marcherai mieu si les ports été redirigés. Sinon toi tu peut te connecter aux autres mais les autres ne peuvent pas se connecter à toi !
En tout cas ca marche comme ca pour Bitorrent et à mon avis pareil pour eMule.

C'est un problème trés trés courant avec les Routeurs NAT et la solution ne se trouve pas dans les socket et les TcpClient etc... ;)

signaler à un administrateur
Commentaire de psycho81 le 11/03/2006 10:49:54

Hum, ce que je veux dire, c'est que par exemple, dans un réseau (plusieur poste sur la meme connection Internet) et sans routeur, on peux très bien avoir un Emule sur chaque machine. Et pourtant ce nn'est pas le serveur qui envoi les paquets de données ... Donc je me dis qu'il y a bien un moyen ... Le serveur doit filer le datagramme tcp/ip (ip+chemin de sous réseau) au client afin qu'il puisse accéder directement au poste concerné sans intermédiaire. C'est ca que je cherche. Pour faire une sorte de reseau p2p privé ....

signaler à un administrateur
Commentaire de mallett le 28/06/2006 16:36:24

Salut,

je trouve ce code plutot tres interressant (g pas encore bien creusé) !!!
Avez vous testé une grosse monter en charge ou pas ?
Pour ma part je suggere une petite modif coté serveur, en effet lors d'un 'close' du serveur les clients ne sont pas deconnecter donc pas de 'close' reellement. Si un client send le serveur le ressoit.

je pense que le boutton 'close' serveur devrait faire ceci :

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  If MySock.State <> SocketState.Disconnected Then
    Do While SockList.Count > 0
      Dim i As Integer = SockList.Count - 1
      Dim sock As BazSocket = CType(SockList.Item(i), BazSocket)
      If sock IsNot Nothing AndAlso sock.State = SocketState.Connected Then
        sock.Close()
      End If
    Loop
    MySock.Disconnect()
  End If
End Sub

ce qui a pour effet de deconnecter tous les client avant de fermer le socket d'ecoute reellement.

bon travail BAZ !!! 10/10

A+

signaler à un administrateur
Commentaire de raptorz le 11/08/2006 19:43:45

Je t'ai mis 9 étoiles pour tout le beau travail, le code est commenté, Orienté objet , très bien ... ;-)
Je t'aurais mis 10 étoiles si la classe aurait été encapsulée dans un composant. (est-ce faisable ?)

signaler à un administrateur
Commentaire de teo770 le 27/08/2006 19:17:11

Est-ce qu'il y aurait beaucoup de modifs à faire pour passer non plus une string mais un binaire ?

Je n'ai pas encore eu le temps de me creuser la tête et je pense qu'avec un source aussi recherché, tu as dû envisager la chose ?

Merci

Teo

signaler à un administrateur
Commentaire de Le newbie le 14/11/2006 14:08:39

Salut,

La source est excellente ,fonctionne à la perfection et offre une base de travail énorme. Merci beaucoup. Tiens au fait prends un 10.

@++ et encore bravo

signaler à un administrateur
Commentaire de Le newbie le 14/11/2006 14:10:27

Une petite question : comment à partir de ta source il serait possible de faire un chat avec les autre clients et non pas forcément avec le serveur.

Merci de le préciser.

signaler à un administrateur
Commentaire de surfzoid le 28/11/2006 19:28:56

Excellent babboss, un 10/10 s'impose vue le boulot.
J'ai juste une petite question qui me brule les lévres depuis for longtemps, comment faire du multisocket client vers plusieur serveur différent ecoutant sur le port 502 par exemple (comme par hasard,lol), et ensuite une fois toutes les connections établie échanger des données de façon fiable, sans ce mélanger les pinceau sur qui a envoyer les paquet et qui doit les recevoir.
Plus concrétement :
3 serveurs modbus sur le port 502 ayant comme ip 30,31 et 33
1 client qui se connect respectivement a 30,31 et 33
puis en boucle pose une question a 30 et stocke la réponse dans un fichier A, ensuite la même question a 31 et stocke la reponse dans un fichier B et finalement a 33 avec un fichier C ?
Merci beaucoup en tout cas pour ton excellente source et je comprendrais aisement qu'on ne reponde pas a ma question tordue car ça fait plus de 6 mois que je bataille avec ça lol :D

signaler à un administrateur
Commentaire de eldim le 10/01/2007 09:53:11

Bonjour,
je ne suis pas trop d'accord avec le commentaire du source : un delegate se fait aussi bien en vb qu'en C#... à part ça faut que je test...

signaler à un administrateur
Commentaire de jpsarot le 27/02/2007 15:49:04

Merci pour ton Code

J'avais un problème lors de la transmission d'une chaine contenant des caractères dont le code est supérieur à 7FH, ils étaient remplacées par le code 3FH (?), j'ai modifié le code suivant (dans BazSocket.vb)

'Prend en parametre une string pour facilité les chose a l'utilisateur.
    Public Sub Send(ByVal data As String)
        If m_State = SocketState.Connected Then
            Dim ByteData() As Byte = m_Encoding.GetBytes(data)
            Me.Send(ByteData)
        End If
    End Sub

par

'Prend en parametre une string pour facilité les chose a l'utilisateur.
    Public Sub Send(ByVal data As String)
        If m_State = SocketState.Connected Then
            Dim ByteData() As Byte = System.Text.Encoding.Default.GetBytes(data)
            Me.Send(ByteData)
        End If
    End Sub

signaler à un administrateur
Commentaire de babboss le 27/02/2007 16:35:56

Bonjour,
Et bien d'abord je vous remercie pour tous ces commentaires constructifs !

Je vais essayer de vous repondre dans l'ordre:

mallett: tu a tout a fait raison il fodrai effectivement remplacer par ce bout de code. Enfaite le server et le client on été fait un peut rapidement, c'était juste pour montrer les possibilités de la Class.

raptorz: Oui c'est possible mais je ne me suis pas trop penché sur la question :S

teo770: Il y a deja une fonction Send qui prend un tableau de Byte en argument. D'ailleur la fonction Send qui prend une String ne fait qu'appeler celle-ci.

le newbie: C'est tout a fait faisable. Encore une fois le Client et Server fourni ne sont pas complet. Pour faire un "Vrai" chat il suffit que le server renvoie au client le texte qu'il recoit des autre clients
dans la fonction: Client_DataArrival
tu fait un boucle qui renvoi les données recu aux autre clients.

surfzoid: oui c'est tout a fait faisable, si tu connai le nombre de server sur lequel tu veut te connecté c'est encore plus simple. Tu crée une Socket (BazSocket :D) pour chaque connexion, et tu fait socket.Connect, etc...
Si tu ne connais pas le nombre de server à l'avance ou qu'il est tres grand, tu fait une boucle qui crée des socket et qui les met dans une List et tu capte leurs évènemments avec des AddHandler

eldim: on peut faire des delegate en VB.Net, ce qu'on ne peut pas faire c'est faire un RaiseEvent sur un delegate. C'est pour ca que j'ai du bidouiller pour eviter le Cross-Threading.

jpsarot: J'ai egalement eu ce problème, ca vient du fait que le ASCIIEncoding n'aime pas trop les accent etc...
Et le plus drole c'est que j'ai fait exactement la meme modif que toi ^^

Je vais mettre à jour la source avec les quelques bugs resolu.
D'ailleur il y en a un qui peut etre assez genant dans:
Public Sub Connect(ByVal RemoteHost As String, ByVal RemotePort As Integer)
  ...
  RemoteEP = New IPEndPoint(Dns.GetHostEntry(RemoteHost).AddressList(0), RemotePort)
  ...
End Sub

Sous Vista AddressList(0) peut etre une addresse IPV6 et non IPV4 ce qui provoque une exception lors de la connexion car la socket est en IPV4
De plus il fodrai utiliser Dns.BeginGetHostEntry() pour ne pas bloquer le thread. Si la resolution de nom met du temps, l'affichage se bloque :/

Voila, encore merci pour les commentaire et la note :)

signaler à un administrateur
Commentaire de babboss le 27/02/2007 19:43:15

La version 1.1 est en ligne (1 ans aprés la première version, mais mieu vaut tard que jamais :D )

signaler à un administrateur
Commentaire de NHenry le 28/02/2007 13:36:17

Bonjour,

Pour optimisation et commentaires (je chipote je sais) :
- Si une classe n'a pas à être dérivée (héritée), met les en Notinheritable.
- Utilise DirectCast au lieu de CType, faible différence, DirectCast est plus rapide, mais ne permet que de suivre les héritages.
- Un TODO dans "B@Z Socket\BazSocket.vb"
- Pour documenter tes membres et tes classes, utilise les ''', en .NET2 c'est pris par défaut, en .NET1 il faut installer VBCommenter. Comme cela on voit la doc dans les infos bulles (comme pour les autres classes du framework).
- Quelques fautes de français ('Normalement ici on est connecter.)
Dans les fichier "B@Z Socket\BazSocket.vb" , 2 variables en commentaires dans Send_CallBack
- Les delegates publiques dans EventHandler.VB peuvent être mis dans la classe principale, cela retire un fichier au projet

Voila, comme j'ai dit, je chipotte.

Je note que ta source est bien rédigée, je fais pas toutes mes sopurces sur ce même modèle.

Bonne continuation.




signaler à un administrateur
Commentaire de geraldbeaulieu le 30/06/2007 03:12:56

Bravo, j'ai fais beaucoup de recherche afin de trouver un code comme celui-ci 10/10.

Bye

signaler à un administrateur
Commentaire de achtouf le 19/12/2007 12:28:59 10/10

Bravo pour cette source.

Après m'être essayé à réaliser ce genre de classe, j'ai finis par laisser tomber par manque de temps, et de connaissances.

Ta source est très intéressante.

Je compte l'utiliser dans un soft pour l'entreprise dans laquelle je travaille. Y vois tu un inconvénient ?

Encore merci ...

PS : Il est préférable (?) d'utiliser les commentaires ''' pour commenter classes, fonctions ... plutot que les simples commentaires '
Ca permet de voir les infos de la classe depuis une autre classe sans aller voir dans le code (un peu comme le fait le framework avec l'explorateur d'objet)

signaler à un administrateur
Commentaire de psykocrash le 17/06/2008 23:15:41

Est ce que tu pourrais uploader une version 2008 ? Ce serait sympa ;)

signaler à un administrateur
Commentaire de surfzoid le 17/06/2008 23:53:34

Quand tu lance VS 2008, fait ouvrir une solution, celle ci, l'outil de conversion ne se lance pas ?

signaler à un administrateur
Commentaire de psykocrash le 18/06/2008 15:44:25

Si si ça fonctionne :)

Merci pour l'info !

signaler à un administrateur
Commentaire de Redman31100 le 23/10/2008 19:11:57 10/10

Je trouve ton code super 10/10.

Seulement j'ai cette erreur : -- Impossible d'ecouter:L'adresse demandée n'est pas valide dans son contexte

signaler à un administrateur
Commentaire de surfzoid le 23/10/2008 21:12:11

Tu ne peut pas faire un listener sur un socket distant, mé uniquement sur ton IP, 127.0.0.1 ou 192.xx.xx.xx ou localhost ou ton nom de machine

signaler à un administrateur
Commentaire de Redman31100 le 23/10/2008 22:06:43

Et comment on faire pour écouter ce qui arrive sur notre IP Publique ? Parait qu'il faut router de l'ip publique à l'ip locale mais avec la livebox je trouve pas.

signaler à un administrateur
Commentaire de surfzoid le 23/10/2008 23:00:24

tu as internet, ?
donc tout les paquets de ton ip public passe bien par ton ip privée avant d'arrivé sur ton écran !

signaler à un administrateur
Commentaire de Redman31100 le 24/10/2008 03:13:55

Oui j'ai internet, tout le temps. Si tu veux tu peux me passer ton MSN par MP pour m'aider ^^

signaler à un administrateur
Commentaire de surfzoid le 24/10/2008 09:10:44

Désoler, j'en ait vraiment pas le temps, et qui plus est si tu suis mon explication, elle dit que ce que tu essaye de faire, c'est de faire "tourner" ce socket directement dans ta livebox !? hum, je crois que l'aide a ce niveau la ce limite a te résigner sur le fait que tu chereche a faire kelk chose de pas possible, voir inutile.
Desoler

signaler à un administrateur
Commentaire de Redman31100 le 24/10/2008 11:58:22

Bah pas mal de gens arrive à faire à tourner leur application serveur en écoute sur leur ip locale et que d'autre personnes communiquent avec lui avec le port forwarding, alors je vois pas pourquoi ça serait forcément impossible avec moi.

signaler à un administrateur
Commentaire de babboss le 26/10/2008 14:18:15

Salut,

En ce qui concerne les socket, tu peux laisser l'adresse d'écoute par defaut qui correspond à toutes les adresse de ta machine, ou alors tu peux mettre ton IP local (192.168.x.x) mais ne met pas 127.0.0.1 sinon le serveur ne pourra pas accepter les connexions exterieur (meme d'ordinateurs dans ton réseau local).

En ce qui concerne le Port Forwarding c'est à peut pret ce que tu à dit. Il faut que tu redirige un port sur ton ordinateur local. Imaginon que ca soit le port 100 qui t'interesse. Tu demmande a ton serveur d'ecouter sur le port 100 et tu demmande à ta Live Box de redirigé le Port 100 sur ton IP local 192.168.x.x en TCP (ou TCP+UDP). Par contre pour les détails pour le faire avec la Live Box je ne peux pas t'aider car je ne connais pas mais ca doit se trouver assez facilement sur google par exemple.

signaler à un administrateur
Commentaire de Redman31100 le 27/10/2008 02:37:43

Merci de ton aide mais j'ai cherché plein de fois sur google.
Je m'aperçois que B@Z Socket quelque soit l'ip qu'on choisit met l'ip locale (pour moi 192.168.1.25)

mais je trouve pas dans ton code de B@Z Socket où tu met met l'ip locale et pas l'ip choisi lors de la procédure Connect et j'ai pas pigé pour quoi il y a RemoteEP et LocalEP.

signaler à un administrateur
Commentaire de surfzoid le 27/10/2008 09:31:47

Je pense que avant de t attaquer a ce genre de procedure, tu devrai commençai par les base, MSDN pour les socket et google poor les technique de port Forwarding, sniffing ....
Sinon pour faire ce que tu veux il serait plus simple d'utilisé l'existant :
Wireshark / etherall

signaler à un administrateur
Commentaire de Redman31100 le 27/10/2008 16:06:21

Je sais déjà comment fonctionne les techniques de port forwarding. Avec une freebox je saurai régler mon souci, mais avec la livebox je trouve aucune option pour le port forwarding(plutot ip forwarding)

signaler à un administrateur
Commentaire de babboss le 28/10/2008 15:49:16

Apres 30s de recherche sur google: http://www.dotmana.com/index.php/?p=358

signaler à un administrateur
Commentaire de Redman31100 le 28/10/2008 15:56:53

C'est bien joli mais ceux qu'ils disent correspondent pas à ma LiveBox il y a pas de menu NAT.

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 11:13:17

J'ai compris pourquoi ça marche pas ! Lorsque je met une ip locale dans server et client ça met l'ip 192.168.1.10 chez moi et quand je met mon ip publique ça met l'ip locale 192.168.1.1 qui est pas la bonne chez moi, je vais essayer de corriger le code mais si tu peux faire pareil babboss ça serait cool

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 11:19:53

J'ai enlevé le AsyncGetHostEntry et resolving mais maintenant ça me donne cette erreur : -- Impossible d'ecouter:Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée

Faudrait qu'on puisse écouter l'ip demandé par l'utilisateur si tu pourrais corriger ton code babboss ça serait cool car j'arrive pas.

signaler à un administrateur
Commentaire de babboss le 05/11/2008 17:10:33

Il y avait effectivement un bug qui empechais d'écouter sur l'adresse que l'on veut en utilisant Listen(Ip as string, Port as integer)
Par contre ca marche avec Listen(LocalEP as IPEndPoint)
En tout j'ai régler le problème normalement.

Bon alors sinon j'ai pas trop compris ton histoire de 192.168.1.10 et de 192.168.1.1...

Ce qui est sur c'est que le serveur il n'a pas besoin de connaitre l'ip publique. Il ecoute sur une adresse disponible sur la machine donc 192.168.1.25 d'apres un de tes messages précedents. Apres tous ce passe au niveau du routeur pour rediriger les ports mais tout ca est completement transparent pour le serveur.
Ta machine a normalement 2 IP: 127.0.0.1 et 192.168.1.25 il peut éventuellement y en avoir d'autre si tu a plusieur cartes réseau ou alors que tu est connecté à un VPN, etc...
Mais dans tout les cas tu ne pourra pas précisé ton IP publique dans la méthode Listen sinon tu aura une erreur.

Voila j'espere que ca pourra t'aider,
@++

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 18:45:25

Tout simplement , je pense que "192.168.1.1" c'est l'ip de sont routeur/passerelle et serveur dns, le plus simple pour confirmer serais :
touche Windows + r
cmd + enter
ipconfig / all
et click droit "selectionner", selection tout et appuie sur enter, puis revient ici et fait click droit coller.
Mais encore une fois tu ne me semble trés clair dans tes idées et je pense que tu vas te battre comme dzes moulins a vent lol :-d

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 18:46:42

Je ne parle pas pour Listen, car ça sera toujours local mais pour connect du client Car il doit se connecter à mon ip publique pour le tester en internet et le routage de ma livebox marche pas apparemment.

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 18:52:44

petite erreur , il fallait comprendre "encore une fois tu ne me semble PAS trés clair ...."

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 18:53:45

si je suis clair ^^

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 18:57:44

Redman31100 : j ai peut etre zappé un de tes post, tu cherche a faire unserveur, si tel est le cas, regarde plutot dans ta livebox, sur la page html d'admin, si il y a une notion de serveur ou IP virtuel, dans laquel du vas "forwoarder" toute les requettes entrentes sur le port XX vers l'adresse IP de choix, donc je crois 192.168.1.25

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 19:01:41

rorrrrrrr : lol
http://pagesperso-orange.fr/sunflower/livebox/livebox%20sagem.htm

http://www.siteduzero.com/tutoriel-3-35034-creer-un-serveur-web-avec-la-livebox.html

http://www.commentcamarche.net/forum/affich-1207814-configurer-la-live-box-pour-serveur-dedier-cs

http://www.infos-du-net.com/forum/162482-8-serveur-ftp-livebox

http://www.developpez.net/forums/d321059/webmasters-developpement-web/serveurs-apache-iis/serveur-web-p-livebox-p-dydns-marche/

bon en fait , je vais pas tous les mettre il suffiser de :

http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=serveur+livebox

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 19:44:03

T'inquiète pas j'ai vu plein d'articles pour le routage livebox mais le routage ne marche jamais chez moi.

signaler à un administrateur
Commentaire de Triboutmatthieu le 05/11/2008 20:13:53

Dommage qu'on puisse pas mettre de pseudo! c'est un petit détail qui fait que ça change tout. sinon c'est pas mal mais marche que sur un ordi et pas en local pour ma part chez moi

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 20:14:45

Moi avec mon chat les pseudos sont pris en charge mais j'améliore.

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 21:00:24

Si ton routage ne marche pas c est kil est forcément mal fait, aprés ce n'est pas vraiment un routage, mé une config de ta livebox pour autorisé un service/serveur, c'est plus sur une notion de firewall !

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 21:01:52

Mal fait, je fait comme tout le monde pourtant, autrement dis si on suis ton raisonnement tout le monde se trompe. Et j'ai il y a aucun rapport avec le firewall.

signaler à un administrateur
Commentaire de surfzoid le 05/11/2008 21:55:28

Non, tout le monde ne se trompe, mé jusqu'a aujourdhui je n'est jamais vue quelqun de parfait.
Je suis administrateur réseaux, je touche a des firewall et routeur régulierement, j'ai mis en place et administre notre Domaine Windows, je gere nos serveur mail, ftp, web , samba ....
Et pourtant face a ta situation (ça mé arrivé + d'une foi) je reagi tjr comme je te l ai dit : "quel erreur j'ai commit, j'ai certainement loupé un truc, reprenons ....".
JAMAIS au grand jamais , je n 'irai sortir a mon Boss, " n importe nawak, je l'ai fait nickel chrome, j en suis sur" et le boss qui repliquerer , mé pourkoi ça marche pas alors :-)
donne nous des infos , dabord celle ke je t'é dit + haut (ipconfig/all), la reference, type et model de ta livebox.
A tu une ip fix, si oui ke t affiche la page web : http://www.monip.org/
donne des captures d'écrans de la config de ta livebox.
Ton firewall XP est il activé.....
Pour tout ce qui est des infos au format texte, ne les colle pas forcement ici, ce serait peut etre trop gros, utilises : http://pastebin.com/
Pour les images/screenshot (capture d'écran avec la touche "IMP ecran/syst en haut a droite), meme pas la peine d'esayer ici, utilise donc : http://pastebin.com/

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 23:14:36

livebox sagem IP locale : 192.168.1.10 passerelle : 192.168.1.1 masque réseau : 255.255.255.0

FireWall Vista activé et débloqué sur le logiciel serveur et client.

signaler à un administrateur
Commentaire de babboss le 05/11/2008 23:19:02

Okay je pense savoir d'ou ca vien ^^
A mon avis le routage est bien fait seulement pour tester il faudrait demmander a quelqu'un d'exterieur. Tu ne peux pas tester toi meme en te connectant toi meme en te connectant à ta propre ip publique. J'ai deja expérimenté ce problème.
Il faudrai donc que tu puisse demmander a un amis de se connecter à toi pour tester ou alors utilisé un VPN sur un 2eme PC si tu en a...

signaler à un administrateur
Commentaire de Redman31100 le 05/11/2008 23:20:24

alors je demanderais à un ami, de le faire, je vous tient au courant.

signaler à un administrateur
Commentaire de surfzoid le 06/11/2008 00:12:13

Evidament "infinite loop!" lol

signaler à un administrateur
Commentaire de surfzoid le 06/11/2008 00:18:25

Petit oublit
1, pour ce genre de manip, utilise virtualbox : http://www.virtualbox.org/
tu auras 2 pc en un
2 Ne commence pas par la "fin", commence petit et ensuite quand tu comprends un peut mieux la gestion d'ip , routeur , firewall, puis la notion client/serveur , attaque toi a ton projet, je te sugere vivement, de commencer a te faire la main avec l'example client/serveur de la doc MSDN, je croi de memoire que c'est sur la classe tcplistener et tcpclient :
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(VS.71).aspx
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(VS.71).aspx

signaler à un administrateur
Commentaire de Redman31100 le 06/11/2008 16:51:24

Je m'attaque pas à la fin et au début, et normalement on devrait pouvoir tester ça machine, je sais que certain le font sans virtualbox.

signaler à un administrateur
Commentaire de surfzoid le 07/11/2008 09:55:37

Bon puisque tel est ta décision , je m'arrête la et retire ma notification par Email de ce post !!
Au revoir et bonne prog .....

signaler à un administrateur
Commentaire de Redman31100 le 07/11/2008 21:36:49

C'est ça au revoir ^^

signaler à un administrateur
Commentaire de Redman31100 le 08/11/2008 01:59:14

Bizarrement ça marche plus en local depuis cet après-midi.

signaler à un administrateur
Commentaire de surfzoid le 08/11/2008 12:59:13

Surment que tu n'as fait AUCUNE erreur ou mauvaise manip ! :
http://www.vbfrance.com/recherche.aspx?r=client+serveur&dotnet=1

signaler à un administrateur
Commentaire de Redman31100 le 08/11/2008 13:01:32

Bah j'ai pas touché au programme à la configuration livebox et au système de mon ordi. J'essaye de résoudre le problème mais en vain.

signaler à un administrateur
Commentaire de surfzoid le 08/11/2008 13:26:38

Encore 1 fois, car ds une communication on repond, tu cherche a faire un clien/serveur ?
Cherche d'abords :
http://www.vbfrance.com/recherche.aspx?r=client+serveur&dotnet=1
souvent une erreur ki revien, c'est le risque de re inventer, mé je ne sait pas exactement ce ke tu ve fer

signaler à un administrateur
Commentaire de Redman31100 le 16/11/2008 06:53:12

Ah ça marchait pas car en le serveur en listen fait pas de resolving donc sur les 2 programmes je précise bien l'ip et non pas 127.0.0.1.

J'ai plus de soucis ^^

signaler à un administrateur
Commentaire de Redman31100 le 17/11/2008 04:26:53

Et si je connais réellement l'adresse, c'est utile que dans la DLL BAZ Socket il y es un résolving à chaque fois ? Me demande si on peut le désactiver.

signaler à un administrateur
Commentaire de babboss le 17/11/2008 07:02:43

Nan mais le "resolving" ca ne sert que pour transformer les noms en adresse IP
exemple: www.google.fr -> 216.239.59.104

Si tu rentre une adresse IP directement, il n'y a pas besoin de "resolving"...

Enfin bref je vois pas pourquoi tu veux te prendre la tête à desactiver ca.

signaler à un administrateur
Commentaire de Redman31100 le 17/11/2008 07:04:37

Ben chaque fois que je rentre une IP il fait le résolving, il fait pas la différence avec texte ou IP le programme. Et ça met du temps à résoudre chaque fois.

signaler à un administrateur
Commentaire de babboss le 17/11/2008 07:13:08

Bon quand j'aurai un peu de temps j'arrangerai ca ^^

signaler à un administrateur
Commentaire de surfzoid le 17/11/2008 09:57:10

Cite (Commentaire de babboss le 05/11/2008 17:10:33 ) : "Il y avait effectivement un bug qui empechais d'écouter sur l'adresse que l'on veut en utilisant Listen(Ip as string, Port as integer)
Par contre ca marche avec Listen(LocalEP as IPEndPoint)
En tout j'ai régler le problème normalement."

TRAduction : - IPEndPoint = 192.168.xxx.xxx
             - string, integer = "google.com" , 80

signaler à un administrateur
Commentaire de Redman31100 le 20/11/2008 13:26:05

Depuis ce matin j'ai un souci avec ton programme mais aussi avec d'autre serveur/client

J'ai testé en local : le serveur se connecte sur l'ip locale par exemple au port 11111(j'ai testé d'autres ports) le client se connecte sur la meme ip et port donc au programme serveur, jusque la ca marche, mais des que le client envoi une donnée au serveur ou le serveur au client, cela déconnecte le client qui a envoyé ou reçu la donnée, sans que le client ou le serveur reçoive, donc ca voudrait dire que le client est déconnecté avant meme la reception ou emission comme si quelquechose déconnecté le client mais c'est pas le serveur.

J'ai pas de virus. alors je me demande ce qui se passe. me demande si ça un lien avec la livebox ou l'ordinateur mais j'ai rien changé.

signaler à un administrateur
Commentaire de Redman31100 le 20/11/2008 14:16:36

J'ai trouvé ou ça leve l'exception ca leve l'exception dans le fichier BazSocket.vb

    Private Sub Receive_CallBack(ByVal Ar As IAsyncResult)
        Dim AsyncSocket As Socket = DirectCast(Ar.AsyncState, Socket)
        Dim RecvSize As Integer

        SyncLock RecvSync

            'Regarde si le socket Existe encore, Sinon on quite
            If Not Object.ReferenceEquals(AsyncSocket, m_Socket) Then
                Return
            End If

            Try
                RecvSize = m_Stream.EndRead(Ar)
                If RecvSize <> 0 Then
                    Dim ByteData(RecvSize - 1) As Byte
                    Array.Copy(m_RecvBuffer, ByteData, RecvSize)

                    OnDataArrival(ByteData)


                    If m_Stream.CanRead Then
                        m_Stream.BeginRead(m_RecvBuffer, 0, m_RecvSize, New AsyncCallback(AddressOf Receive_CallBack), m_Socket)
                    Else
                        DisconnectSocket(True)
                    End If

                Else
                    DisconnectSocket(True)
                End If
            Catch ex As Exception
                DisconnectSocket(True)
            End Try
        End SyncLock
    End Sub

ça va dans Catch ex as Exception DisconnectSocket(True) l'erreur est "{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}"

Donc le serveur a fermé la connexion du client mais où et pourquoi, je sais pas.

signaler à un administrateur
Commentaire de Redman31100 le 09/12/2008 05:50:24

Quand je me connecte sur un chat irc et que je tapes la commande irc /list j'ai jamais de réponse et sur les autres serveurs internet public j'ai jamais de réponse.

signaler à un administrateur
Commentaire de Redman31100 le 05/01/2009 18:37:55

Super babboss ! Ça marche nickel !

signaler à un administrateur
Commentaire de babboss le 05/01/2009 19:48:16

De rien ^^

Pour info, le problème venait du fait que le Buffer pour lire les données était de 0 octet. Je ne sais pas trop comment c'est arrivé... Un problème avec la façon dont je gerais le ReceiveBufferSize.

Je n'avais pas tellement le temps pour corriger le problème ces derniers temps :(

En tout cas, Bonne année à tous :)

signaler à un administrateur
Commentaire de Redman31100 le 05/01/2009 22:18:18

Bonne année ! 0 octet lol bizarre.

signaler à un administrateur
Commentaire de Le newbie le 06/01/2009 08:43:40

Salut, et bonne année.

Je viens de m'apercevoir d'une chose. Si je crée plusieurs clients et que je ferme la fenêtre du premier client, tous les autres client se font jeter. Est ce normal ?

Merci d'avance.

signaler à un administrateur
Commentaire de Louu34 le 13/01/2009 14:21:40 10/10

Bravo !!

signaler à un administrateur
Commentaire de casoftware83 le 20/01/2009 19:23:41

Bonjour,
et merci pour cette source qui nous fait gagner beaucoup de temps.
néanmoins j'ai le meme message d'erreur que redman, j'ai pourtant telechargé le zip le 10/01/2009 (apres le post de redman).
Auriez vous une solution pour moi ?
merci d'avance.

signaler à un administrateur
Commentaire de babboss le 20/01/2009 23:06:27

Quel problème exactement ? Je n'ai pas bien compris.

Sinon je viens de mettre à jour la source. J'ai corrigé le problème expliqué par "Le Newbie".
Il suffisait tout simplement de changer les propriétés du projet Client pour que l'application se ferme uniquement quand la dernière fenêtre est fermée.

signaler à un administrateur
Commentaire de Redman31100 le 20/01/2009 23:25:43

Lorsque je veux écouter sur mon IP publique, j'ai ce message d'erreur (application serveur) : "Impossible d'ecouter:L'adresse demandée n'est pas valide dans son contexte"

J'écoute en local avec routage de externe a local par l'ip 11111, personne ne peut me rejoindre.

Comment y remédier ?

signaler à un administrateur
Commentaire de babboss le 21/01/2009 01:24:05

Tu ne peux pas écouté sur ton IP publique. Tu doit écouté sur ton IP local (192.168.x.x) et dire a ton routeur de redirigé le trafic d'un certain port (ou plage de port) vers cette IP local.

Tu ne peux écouter que sur des adresses présente sur une interface réseau de ta machine. Et la plus part du temps tu en a seulement deux:
- La boucle local (127.0.0.1)
- Ton ip sur le réseau local (192.168.x.x)

Pour pouvoir écouter sur l'IP publique il faudrait que la box soit directement connectée à ton PC et qu'elle ne soit PAS en mode routeur. Dans ce cas la tu n'aurais pas d'IP privée genre 192.168.x.x mais directement l'IP publique. Par contre tu ne pourrais pas partager la connexion. Le port forwarding reste donc la meilleur solution (et en plus c'est plus sécurisé)

Mais je ne comprend pas trop pourquoi tu t'embête avec ça car en général on écoute sur toute les adresses disponible. Pour ça il y a la surcharge de Listen() qui ne prend que le port en paramètre. Sinon tu peux toujours mettre 0.0.0.0 comme adresse ou un IPEndPoint avec IPAddress.Any comme IP.

signaler à un administrateur
Commentaire de Redman31100 le 21/01/2009 01:50:01

D'accord, je vais tester 0.0.0.0 et je te tiens au courant

Mais j'ai bien fait le port forwarding et pour l'instant ça a jamais marché ^^

signaler à un administrateur
Commentaire de casoftware83 le 21/01/2009 10:12:24

Bonjour,
malgré le telechargement de version du 5/1/2009, j'ai toujours l'erreur suivante:
"{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}"
D'apres les precedents post redman indique que "ça marche nickel", mais pas chez moi.
Vous indiquez que "le problème venait du fait que le Buffer pour lire les données était de 0 octet", mais je ne comprend pas les modifications qu'il faille apporter a votre source pour que cela marche.
merci pour votre aide

signaler à un administrateur
Commentaire de babboss le 23/01/2009 02:37:46

Hum je ne vois pas trop...
Ça te fait cette erreur quand tu fait le test en local ?
Et dès que tu envoie des données, la connexion est fermée, c'est ça ?

signaler à un administrateur
Commentaire de casoftware83 le 23/01/2009 16:13:42

bonjour,
en detail, je lance l'appli serveur:
depuis un client telnet je me connecte sur l'ip local (192.168.1.11) et le port 8000, la connection s'etabli et le transfert des données s'opere.
en revanche lorsque j'utilise un boitier de geolocalisation qui transfert des donnees en mode TCP IP sur le port 8000, l'appli serveur leve une exception au moment de la reception des données, l'exception etant celle que redman avait signalé dans son post du 20/11/2008 ("{"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."}".
je precise que le serveur ecoute 192.168.1.11 et que le boitier emet vers une ip publique forwarder par le routeur (netasq) vers 192.168.1.11
Il semble qu'apres la mise a jour du code faite par vos soins le 5/01/2009, redman a reglé le probleme. moi je l'ai toujours.
encore merci pour votre aide.

signaler à un administrateur
Commentaire de Redman31100 le 24/01/2009 00:44:01

Oui, je suis content le programme marche quand je met une ip any en écoute sur le serveur, mais je me pose quand meme la question de savoir pourquoi avec l'ip locale ca marchait pas, enfin pas grave si on sait pas répondre, l'essentiel est fait.

signaler à un administrateur
Commentaire de babboss le 24/01/2009 05:55:33

Je ne vois pas vraiment d'où peut venir le problème. Si ça marche avec telnet ça veut dire que c'est bon du coté serveur.
Tu peux me dire sur quel ligne exactement il lève l'exception ?

Sinon essaye de faire un serveur basic avec la class socket du framework pour voir si ça marche.

Le boitier est censé se connecter en TCP, envoyer les données, puis se déconnecté aussi tôt ? Sinon comment est il censé fonctionner ?

signaler à un administrateur
Commentaire de casoftware83 le 26/01/2009 11:34:13

Bonjour,
j'en sais un peu plus:
dans la class BazSocket, la ligne
  m_Sync.BeginInvoke(CallAccepted, New Object() {Request})
leve une System.Reflection.TargetInvocationException
l'exception sous-jacente etant une Socket exception ayant pour message:
"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."

En fait mon boitier se connecte toutes les minutes en TCP/IP a l'adresse de mon serveur sur le port 3000, une fois connecté il envoie un stream contenant des donnees de geolocalisation.

Il se peut que la qualité de ma connection GPRS soit mauvaise et que la connection soit interrompu.

je continue a chercher, si le diagnostique est le bon, l'idée serait de gerer cette erreur proprement.

a+

signaler à un administrateur
Commentaire de casoftware83 le 26/01/2009 11:38:17

REMPLACE LE PRECEDENT (avec mes excuses)
Bonjour,
j'en sais un peu plus:
dans la class BazSocket et dans la methode Private Sub OnAccepted(ByVal Request As AcceptRequest),
la ligne
  m_Sync.BeginInvoke(CallAccepted, New Object() {Request})
leve une System.Reflection.TargetInvocationException
l'exception sous-jacente etant une Socket exception ayant pour message:
"Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l'hôte distant."

le debug me donne :
StackTrace:
à System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state)
à System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
        

En fait mon boitier se connecte toutes les minutes en TCP/IP a l'adresse de mon serveur sur le port 3000, une fois connecté il envoie un stream contenant des donnees de geolocalisation.

Il se peut que la qualité de ma connection GPRS soit mauvaise et que la connection soit interrompu.

je continue a chercher, si le diagnostique est le bon, l'idée serait de gerer cette erreur proprement, malheureusement moi et les thread c'est pas encore ça.

a+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Winsock client qui ne marche qu'une fois! [ par Olivier ] Mon application client serveur fonctionne parfaitement une seule fois.La seconde fois, le client plante sur .connect en annonçant "adresse en cours d' Client et serveur IRC avec Winsock (Aide !!!) [ par KOOK ] Salut, j'ai télécharger plusieurs sources de client et serveur irc mais aucune ne marche, j'ai un problème avec Winsock, pourriez vous m'aider, existe winsock client/serveur [ par Meddah ] je veux réalisé une application qui calcule les tarifs dans un cybercafé je cherche soi un exemple pour base sur lui soi une aide sur winsock car je n winsock client/serveur [ par Meddah ] je veux réalisé une application qui calcule les tarifs dans un cybercafé je cherche soi un exemple pour base sur lui soi une aide sur winsock car je n winsock : [ par Yan ] Voila je code une app client/serveurJe cherche à faire un serveur multi-clientsbon chez mio je lance le machin la connexion s'établit, cool :)Je quitt help me : winsock prob... [ par Hardousss ] Salut tlm !!chui un debutant en vb et c'est ma premiere participation au fameux forum vbfrance.com donc...i trust in ur ingenuity guys to help me sol Fermeture correct socket - (Winsock ) [ par toine21bis ] ben voili,j'ai un serveur et un client.Je veux que lorsque mon client quitte le programme vb et le relance, que la connexion se refasse correctement. Fermeture correct socket - (Winsock ) [ par toine21bis ] ben voili,j'ai un serveur et un client.Je veux que lorsque mon client quitte le programme vb et le relance, que la connexion se refasse correctement. Client/Serveur envoi d'1 image [ par Arnaud01 ] Re-Bonjour à tous,j'aurai souhaité savoir comment il fallait si prendre pour envoyer une image en Client/Serveur avec Winsock.GetData etWinsock.Send Winsock en VB.Net [ par yous ] J'ai bien compris l'utilisation de Winsock en VB6 mais je rencontre un gors pb pour le faire fonctionner en .Net.Au chargement de l'interface, je défi


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