AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET

cs_mahhoura Messages postés 15 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 25 août 2007 - 5 févr. 2004 à 10:10
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005 - 2 sept. 2009 à 21:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20110-autosocket-un-clone-du-controle-winsock-en-net

Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
2 sept. 2009 à 21:50
Je pense pas qu'elle soit très adaptée au mode console, le plus simple serait d'utiliser les classes Socket, TcpServer ou TcpClient du framework. Qu'est ce que tu veux faire en gros?
hussein47 Messages postés 3 Date d'inscription mardi 10 février 2009 Statut Membre Dernière intervention 2 septembre 2009
2 sept. 2009 à 21:40
Y aurai 'il moyen d'utiliser ta classe en mode console, tu peut me montrer un exemple sil te plait, je suis débutant...
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
31 août 2009 à 14:34
Bonjour,

Merci! Et c'est marrant parce qu'en ce moment je suis aussi en train de bosser avec des sockets, mais non bloquants (sous Linux) et avec Python.

Pour être honnête ça fait des années que j'ai pas touché au code et que j'ai pas programmé en VB.NET donc je suis pas sûr d'être d'une grande aide pour trouver le bug.

Mais pour essayer, est ce que les données sont bien envoyées? Est ce que si tu mets un point d'arrêt sur '_socket.Send(data, ...)' dans AutoSocket.Send() il passe dessus? Et sur la ligne 'RaiseEvent DataDeparture' ?
Kardyne Messages postés 1 Date d'inscription mercredi 24 décembre 2008 Statut Membre Dernière intervention 31 août 2009
31 août 2009 à 11:38
Bonjour,
Premièrement, je tiens à dire que ce code est vraiment super !
Ensuite, j'ai un petit problème avec les évènements DataDeparture et SendComplete. L'évènement ne se déclenche pas.
J'ai cherché dans le code de la classe d'où pourrait venir l'erreur, mais sans succès.
Voila, voila...

Merci d'avance.

Kardyne.
Xiu Messages postés 13 Date d'inscription mercredi 28 juin 2006 Statut Membre Dernière intervention 21 juillet 2009
21 juil. 2009 à 12:42
Salut,
Comment mettre dans une variable les données d'un socket precis ?
merci
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 18:28
C'est vrai que les classes de Socket de .NET sont pas pratiques à utiliser avec Windows Forms, parce qu'elle ont été pensées pour être utilisée dans une partie client ou serveur de l'application, et non pas mélangée à la présentation (Forms).

Donc d'un côté c'est moins pratique, mais ça force à bien réfléchir à l'architecture de l'application, le flux de données, les threads, etc. Perso c'est quelque chose que j'adore et que je trouve hyper intéressant, mais ça demande pas mal de temps et de recherches.

Par exemple c'est pas une bonne chose d'appeler des fonctions blocantes (synchrones) sur le thread de l'interface graphique, puisque ça fait freezer l'affichage de tes fenêtres. C'est pour ça que le plus simple c'est d'avoir un thread dédié à ton socket. L'alternative c'est d'utiliser les fonctions asynchrones ou des événements mais c'est plus difficile à bien structurer, enfin c'est mon point de vue.
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 15:21
Hi, ben en fait j'ai laissé de coté .Net durant quelque années je m'obstinai à vouloir resté sur vb6 mais arrive un moment ou on est bien obligé de suivre...

Bref je m'y suis mi et je ne le regrette pas, mais je regrette for mon Mswinsck.ocx... ce bon vieux winsock était si facile d'utilisation...
Je trouve franchement la classe system.Net.Socket très mal faite, j'ai même trouvé des exemple de code socket avec des fonctions non synchrones et des timers !

En ce qui concerne ton code il sera toujours utile jusqu'à modification par MS de System.Net.Socket...
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 14:57
Pas de soucis :)

Ce qui m'étonne un peu c'est que ce bout de code soit toujours utile et utilisé, même 5 ans après que je l'ai écrit !

A+

Xya
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 14:36
Ok, ok !

Merci bien pour toutes ces informations heureusement qu'il y a encore des gens pour partager leur savoir et filer un coup de main sans attendre des choses en retour :) (ce qui fait que le développement évolu plus vite que certaine personnes ou choses de la vie...)

Merci encore @+
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 14:27
Tu peux utiliser n'importe quel contrôle comme SynchronizingObject.

Par exemple imaginons que tu crées le socket dans le constructeur de ta form:

Public Sub New()
'...
Me.socket = New AutoSocket()
Me.socket.SynchronizingObject = Me
End Sub

et après dans tes gestionnaires d'événements t'as plus à te soucier de Invoke/BeginInvoke (cad les événements sont automatiquement exécutŽs dans le thread principal):

Private sub Control_Disconnect (sender as Object, e as System.EventArgs) Handles Control.Disconnect
'Je veu par exemple afficher "déconnecté" dans un label
label.Text = "Déconnecté"
End sub
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 13:18
Heuu... au fait, qu'est ce qui défini la valeur de "syncObj" c'est tout la le problème ?
Car si on gère le code normalement au niveau du formulaire on n'a qu'a faire :

Private sub Control_Disconnect (sender as Object, e as System.EventArgs) Handles Control.Disconnect
'Je veu par exemple afficher "déconnecté" dans un label
If (Label.InvokeRequired) Then
Label.Invoke(New DelegSub(AddressOf e_Connexion), Sender, e)
Else
Label.Text = "Déconnecté"
End If
End sub

Et la on obtient l'état de l'objet de synchronisation du label, mais dans le cas ou le code est géré par ma classe comment transmettre ce paramètre à "syncObj" ???
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 12:57
Hééé ! Bien vu !
Je vais tester ca de suite, encore Merci ;)
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 12:44
L'idé c'est de rajouter une propriété à la classe:

Protected syncObj As ISynchronizeInvoke 'objet de synchronisation Windows Forms

Public Property SynchronizingObject() As ISynchronizeInvoke
Get
Return syncObj
End Get
Set(ByVal Value As ISynchronizeInvoke)
syncObj = Value
End Set
End Property

Pour chaque événment tu dois ajouter une méthode OnXXX qui détermine si on doit utiliser BeginInvoke ou pas:

Public Event Disconnected(ByVal sender As Object, ByVal e As EventArgs)

Protected Overridable Sub OnDisconnected(ByVal e As EventArgs)
If Not syncObj Is Nothing AndAlso syncObj.InvokeRequired Then
Dim deleg As New EventHandler(AddressOf SyncDisconnected)
syncObj.BeginInvoke(deleg, New Object() {Me, e})
Else
SyncDisconnected(sender, e)
End If
End Sub

Et une øéthode SyncXXX qui déclenche juste l'événement:

Protected Sub SyncDisconnected(ByVal sender As Object, ByVal e As EventArgs)
RaiseEvent Disconnected(sender, e)
End Sub

La version VB.NET est un peu lourde, comme je pense pas qu'on puisse récupérer le délégué de l'événement contrairement à C#, sinon on pourrait faire (dans OnXXX):

syncObj.BeginInvoke(Me._delegue_Disconnected, New Object() {Me, e})

et se passer de SyncXXX.

Pas de soucis :p J'espère que ca te øettra sur la voie.
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 11:48
je pense que tu as entièrement raison d'ailleurs aurais-tu une idée ou une ressource pour implémenter ISynchronizeInvoke ?

Je suis en train de faire une classe de dialogue TCP avec un protocole intégré et des fonctions qui utilise les sockets.
Cette classe permettra entre autre de gérer les connexions Client/serveur, l'envoi de message simplifié avec paramètres et gèrera directement l'envoi de fichier avec événements (Start, Finish, Progress...).

J'aimerais pourvoir faire des événements (un peut comme dans ta classe), en ce qui concerne les sockets sans avoir à chaque fois à appeler BeginInvoke/Invoke... :/

J'ai recherché partout mais j'ai pas trouvé grand chose, de plus je ne suis pas un expert en ce qui concerne le multithreading.

ET Merci pour ta disponibilité :p
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 08:29
Pt'être que pour des raisons de performances cette règle n'est vérifiée que quand tu lance ton programme dans un débogueur comme Visual Studio? De toute qu'elle soit vérifiée ou pas vaut mieux la suivre, ssurtout pour une appli réseau. Je me souviens avoir eu des bugs vraiment bizarre/aléatoires quand je le faisais pas
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 avril 2009 à 08:20
Merci pour ces commentaires détaillés ;)
J'ai pu trouver quelques explications en faisant des recherches hier,

Par contre... c'est bizard car quand je démarre le programme compilé ça fonctionne ?
l'exception n'est pas prise en compte ???
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 avril 2009 à 00:24
Si je me souviens bien (j'ai écrit ce code y'a 5 ans quand même :p et pas le courage de le télécharger et de le regarder), le socket doit utiliser un thread d'arrière plan pour gérer les différents événements.

Le problème, c'est que tout les contrôle windows forms (namespace System.Windows.Forms.*) doivent être impérativement utilisés sur le thread principal (c'est à dire tout code qui accède à leur méthodes et propriétés). Il n'y avait aucune vérification dans le Framework 1.1, par contre je crois que c'est à partir du 2.0 que cette "règle est vérifiée", et si elle n'est pas respectée, tu obtiens l'exception que tu as copié-collé.

La solution la plus rapide, c'est d'appeller BeginInvoke/Invoke dans tous les événements du socket, de sorte à exécuter le code qui accède à Windows Forms dans le thread principal. Exemple:

Private Sub socket_DataArrival( sender As Object, data As Byte() )
Me.BeginInvoke(ma_fonction_windows_forms, New Object[] {data}) ' synatxe VB?
End Sub

Private Sub ma_fonction_windows_forms(data As Byte())
txtClientInput.Text = Encoding.UTF8.GetString(data)
End Sub

Ca fait des années que j'ai pas fait de VB.NET (et pas de compilateur sous la main), donc je me souviens plus de la syntaxe, surtout pour la création de tableau et le passage du délégué (voir commentaire).
L'idée c'est tu passe un délégué de ta fonction (ici ma_fonction_windows_forms) comme 1er paramètre, et un tableau contenant la liste des paramètres de ta fonction comme 2ième paramètre. Ca c'est la solution rapide, bête et méchante, et pas hyper propre.

La solution plus "clean" serait de rajouter une propriété SynchronizingObject (de type ISrynchronizeInvoke -- interface implémentée par tous les contrôles Windows Forms) à la classe de Socket. Ensuite tu dois utiliser la méthode BeginInvoke de ton objet SynchronizingObject pour déclencher les événements.

Je pense qu'avec ça tu dois avoir pas mal de pistes pour régler le problème (je pense que tu devrais trouver sur le net le code pour utiliser BeginInvoke/Invoke et les événements VB.NET). J'espère que ça t'aidera!

Greetings from Norway
Xya
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
28 avril 2009 à 23:18
Une petite erreur à la connexion...

Opération inter-threads non valide : le contrôle 'txtClientInput' a fait l'objet
d'un accès à partir d'un thread autre
que celui sur lequel il a été créé.

Suis-je le seul à qui cette erreur est survenue ?
terbeh Messages postés 1 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 26 février 2008
26 févr. 2008 à 17:28
Bonjour, je suis débutant et ton code m'intéresse vraiment. Par contre je n'arrive pas à démarrer le serveur. Il reste toujours en état "Déconnecté". Je souhaite que tu m'aide avec un peu plus de commentaire dans le code.

Merci
FLLM Messages postés 4 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 novembre 2007
8 sept. 2007 à 23:28
J'ai pas testé mais l'idée est génial et rien que pour sa tu mérite un 10 !

Merci bcp sa va me débloquer dans un de mes projets !!
VPNVB Messages postés 58 Date d'inscription dimanche 7 août 2005 Statut Membre Dernière intervention 20 août 2008
8 sept. 2007 à 14:23
Salut

C'est un Source tré tré util
merci pour la Class !

Je souaite développer un Serveur SMTP, IMAP et POP3
S'a peux M'aider ?

Merci de Me Contacter par Email ou Directe...
kamikazlolo Messages postés 1 Date d'inscription jeudi 6 mars 2003 Statut Membre Dernière intervention 11 juillet 2006
11 juil. 2006 à 19:09
Marche tres bien pour le TCP, mais tu as testé pour l'UDP ?
Dans tous les cas TCP ou UDP, tu l'instancie la socket avec cette commande :
_socket = New Socket(af, SocketType.Stream, prot)

SocketType.Stream pour de l'UDP -> plantage

Mais sinon vraiment tres pratique comme appli, bravo ;)
psycho81 Messages postés 84 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 17 février 2008
16 mars 2006 à 08:14
Bonjour,

Je vous explique mon problème. Je souhaite faire un peer2peer privé. Donc arriver à joindre directement une personne sur internet via son ip pour lu itransmettre des paquets. jusque la, rien de bien difficile. Si bien sur les 2 clients sont les passerelles internet.

Supposons maintenant un reseau X1 ou il y a les ordinateur A1, B1 et C1 et A1 est la passerelle.

Supposons aussi un reseau X2 ou il y a les ordinateur A2, B2 et C2 et A2 est la passerelle.

Comment faire pour que C2 puisse directement communiquer avec C (ou B1) sans faire de serveur sur A1 ou A2.

Car mon application marche que de passerelle à passerelle. J'ai essayé le multicast par desespoir mais celà ne apsse pas dans Internet.

Si vous pouviez m'aiguiller dans mon problème par un bout de code .... j'en serai plus que ravi !

Bernard
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
19 févr. 2006 à 23:42
J'arrive pas à avoir la bonne FrameWork 2.0 moi j'ai la FrameWork 2.0 Bêta et ca marche pas.

Redman
Sebounet69 Messages postés 1 Date d'inscription mardi 8 novembre 2005 Statut Membre Dernière intervention 1 février 2006
1 févr. 2006 à 17:09
Je dois faire un chat en VB et je désire utiliser les sockets... Il faut que kje le fasse le plus rapidement possible... Est ce que le code est bien commenté histoire que je comprenne comment ça marche et comment on l'utilise... Et est-ce que vous connaissez des adresses qui explique correctement les sockets.

Merci d'avance

Salutations
casnic Messages postés 11 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 3 janvier 2012
17 janv. 2006 à 08:21
Enfin de compte l'erreur se produit encore même si beaucoup plus rarement.

Aurais-tu une idée ?

Merci encore ...
casnic Messages postés 11 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 3 janvier 2012
16 janv. 2006 à 09:36
Merci, ça fonctionne nickel !!!

par contre j'ai du placer cette boucle dans la boucle suivante. Sinon l'erreur se produisait encore de temps en temps.

Merci pour ton aide précieuse !
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
13 janv. 2006 à 12:51
Une petite correction, dans la ligne While ... Socket.Poll, il faut remplacer '!' par 'Not ', petite erreur de conversion VB.NET de ma part :)
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
13 janv. 2006 à 12:49
Cela fait un bout de temps que je n'ai pas mis à jour cette source, comme la version actuelle est en C# où cette erreur est corrigé !

Voilà le code à rajouter dans AutoSocket.Send:

Dim bytesLeft As Integer = data.Length
Dim sendTotalBytes As Integer = data.Length
Dim sendCurrentBytes As Integer = 0
'<==== Code à rajouter

'attend que le socket soit prêt, il se peut que le buffer d'envoi
'soit plein, ce qui lève une exception puisque le socket n'est pas bloquant
While !Socket.Poll(0, SelectMode.Write)
System.Threading.Thread.Sleep(0)
End While
' Code à rajouter ====>

While bytesLeft > 0
casnic Messages postés 11 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 3 janvier 2012
12 janv. 2006 à 12:12
Très bon boulot, merci !

Ce code m'a permis de faire un bon dans l'avancement de mon projet. Par contre, l'erreur suivante se produit de temps en temps lorsque j'appelle la méthode Send de ta classe AutoSocket :

"System.InvalidOperationException : Impossible de bloquer un appel sur ce socket, pendant qu'un appel asynchrone antérieur est en cours."

Pour le moment mon application n'envoie qu'une seule trame, mais en reçois plusieurs.

Mes connaissances dans les Socket étant limitées pour l'instant, j'aimerais que tu m'aides à ce sujet.

Merci pour ton aide !
COlive Messages postés 91 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 3 décembre 2011
2 janv. 2006 à 13:03
Très bonne source.

Je suis depuis peu sous VB 2005 et le framework 2. J'essaie en vain, de réaliser un composant similaire en utilisant les classes suivnates : TcpListener, TcpClient et BackGroundWorker.
Malheureusement, mes compétences dans le domaines des sockets (TcpListener, TcpClient étant des dérivées) sont limitées et font que je n'y arrive pas. (Héhé on peut tout savoir faire non plus.)

Ton code est très bien fait, et devrait m'en apprendre beaucoup.

Il faut continuer !!!
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
14 oct. 2005 à 21:35
Beau travail ! Félicitations ! 10/10
Cela me servira beaucoup ! Merci !


Bonne continuation !
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
25 avril 2005 à 18:22
c'est beau j'ai trouvé, c'était le localhot du serveur qui devait être changer pour l'IP

je comprend pas trop pourquoi, puisque c'est lui le serveur, mais bon.
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
25 avril 2005 à 18:20
j'ai un problème lorsque je l'appel d,un autre IP que 127.0.0.1 ???

ks.Connect(New IPEndPoint(IPAddress.Parse(addresse), Int32.Parse(port)))

je fais ça pour me connecter dont addresse = 127.0.0.1 ou mon IP

mais dès que je tombe sur _socket.Connect(remoteEP) là ça plante avec un "Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée"

pourtant mon serveur est bien sur Nom: localhost et port est bien le même.

j'ai fermé tout les firewall et antivirus, donc c'est pas ça non plus

je fais les tests sur un même ordi
jeoff Messages postés 8 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 9 février 2006
8 avril 2005 à 09:11
ca m'a l'air un peu complexe à mettre en place vu mon niveau actuel.

Je vais commencer par me documenter sur les événements parceque je ne connais pas vb.net; juste vba pour l'instant donc forcèment je suis hyper limité sur le coté "événementiel" de la chose :/
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
7 avril 2005 à 19:15
Je n'ai pas du tout d'expérience en ce qui concerne les serveurs multi-clients, c'est pour ça que cette classe est prévue pour un client se connctant à un serveur (le serveur ferme la connexion en écoute dès qu'un client se connecte).

Pour connecter plusieurs clients, voilà où modifier le code:

dans AutoSocket.vb, dans la région "Evénéments"

Private Sub eventSink_Accept(ByVal sender As Object, ByVal status As Integer) Handles eventSink.Accept
Dim newSocket As Socket = Socket.Accept()

If closeServer Then
_socket.Close()
Else
_baseServer = CloneSocket()
End If
_socket = newSocket
'crée un nouveau dispatcheur: le handle du socket a changé
ResetEventSink(_socket.Handle)
_state = SocketState.Connected
RaiseEvent Connected(Me, EventArgs.Empty)
End Sub

Je pense qu'il faudrait ajouter un événement ClientConnected à AutoSocket avec comme paramètre le nouveau socket qui est connecté au client à la place de l'événement Connected.
Dans eventSink_Accept, le serveur ne fermerait pas le socket sur lequel il écoute, créerait un nouveau AutoSocket avec le Socket retourné par Accept - donc ajouter un constructeur Private qui prend comme paramètre un Socket et qui initialiserait ce socket (voir NewSocket) - ne réinitialiserait pas le dispatcheur d'événement (ResetEventSink), laisserait l'état du socket sur SocketState.Listening et lancerait l'événement ClientConnected.

Voilà, j'espère que ça pourra t'aider sur ton projet.
jeoff Messages postés 8 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 9 février 2006
7 avril 2005 à 10:48
merci beaucoup ! super boulot !

Ca m'aide pas mal pour mon projet.

Par contre je cherche un moyen de connecter plusieurs clients.

Comment puis-je modifier le code pour celà ?

Merci
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
23 janv. 2005 à 14:27
Réessaye, pour moi ça le télécharge sans problème.
yissine Messages postés 1 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 22 janvier 2005
22 janv. 2005 à 21:11
j arrive pas a telecharger le zip c est normal?
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
21 déc. 2004 à 13:57
D'abord merci pour le commentaire et la note :)
En effet il manque le serveur multithread, comme je n'ai jamais fait de serveur multithread :)
En fait j'ai fait cette source pour les programmes "de bureau", qui ne tournent pas sur un serveur, genre client mail, client FTP, chat, envoi de fichiers ...
cs_Oueb Messages postés 18 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 19 septembre 2008
21 déc. 2004 à 10:02
Excelent travail !!! 10/10 manque juste le serveur multithread ... ou alors suis trop con pour trouver :)
magloui Messages postés 8 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 3 octobre 2007
26 juil. 2004 à 11:02
Bonjour,
Tres bonne source, Pour moi qui suit un grand debutant, cela me fait progresser.
Comme deja demander, comment faire pour que le serveur accepte, plusieur connection.
Et comment faire pour que le serveur continue d'ecouter quand le client se deconnecte.

Un grand merci, pour ton tarvail, continue a nous envoyer de bonne source.
Focalizer Messages postés 76 Date d'inscription dimanche 19 mai 2002 Statut Membre Dernière intervention 8 mai 2006
19 juil. 2004 à 19:44
Bonjour,

J'ai ajouté le controle à mon projet, je me connecte à un serveur irc, lorsque le me "whois" sur celui ci, je suis bien connecté.

Lorsque je tente d'utiliser la méthode "Send", il me renvoit une erreur signalant que je suis déconnecté.

J'ai mit un point d'arrêt sur Sock_Closed, mais le programme ne s'arrête jamais sur ce point.

Que faire ?
Focalizer Messages postés 76 Date d'inscription dimanche 19 mai 2002 Statut Membre Dernière intervention 8 mai 2006
17 juil. 2004 à 16:48
Très bonne source, génial. Merci
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
10 mai 2004 à 16:17
Cooooooool ca !

Merci Xya, là comme ca c'est un génial remplaçant de Winsock pour .net !

Je vais tester chez moi (je suis au bureau là) en modifiant un peu le prg pour voir si on sait facilement envoyer des fichiers et voir si progression OK.
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
10 mai 2004 à 13:15
Voilà, suite à ta demande TigerFab j'ai ajouté les événements DataDeparture (envoi en cours) et SendComplete (envoi terminé).

Enjoy!



Xya
TigerFab Messages postés 115 Date d'inscription samedi 15 février 2003 Statut Membre Dernière intervention 18 mai 2008
9 mai 2004 à 23:32
Très très belle source et très bon travail !

Mais j'ai 2 questions ;

- System.net.socket remplace bien winsock de VB6 ? pq ils ont pas prévu les évènements (indispensables) de Winsock alors ? ou faut-il pour ca utiliser une autre classe ?
- tu n'as pas fait l'évènement SendProgress disponible dans WinSock. C'est facile à ajouter ?
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
21 avril 2004 à 17:47
Je pense que tu devrais faire un mini serveur web qui puisse répondre aux reqêtes simples (GET) et générer du html pour la liste des processus en cours. Il y a quelques exemples de serveurs web en VB sur VBFRance, tu pourais t'en inspirer.
Après tu peux facilement acceder à ta liste avec un navigateur.

http://[ip ou nom de l'ordi]:[port ouvert par le serveur web]/[page web à générer]

Par exemple:

http://dionysos:80/listprocess.html
http://dionysos:80/lkillprocess.html?pid=123


J'espère que ça peut t'aider.


Xya
dionysos6868 Messages postés 310 Date d'inscription jeudi 4 septembre 2003 Statut Membre Dernière intervention 9 juin 2005 1
21 avril 2004 à 15:13
Merci de ton aide.

Saurais tu egalement svp comment je pourrais fair pour envoyer des information sur une ecoute de socket apartire d'un page web et avoir un retour

Par exemple sur une page web avoir le listing des processus en route sur mon ordi et d'envoyer l'ordre de fermer tel ou tel processus.

merci
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
21 avril 2004 à 06:24
Ce que tu peux faire c'est créer un projet VB.NET appellé AutoSocket avec les paramètres suivants:

Type: bibliothèque de classes
Espace de noms racine: System.Net.Sockets
Objet de démarrage: aucun
Option Explicit On
Option Strict Off

et tu ajoutes à ce projet les fichiers sources .vb présents dans le zip.
Ca devrait marcher.


Xya
dionysos6868 Messages postés 310 Date d'inscription jeudi 4 septembre 2003 Statut Membre Dernière intervention 9 juin 2005 1
20 avril 2004 à 15:00
perso ca ne marche pas soit disant que ma version de .net n'est pas assez ressente pour ouvrire ton projet

si tu a une idée a me propose merci de m'en faire part msn dionysos6868@hotmail.com

merci de ton aide
dionysos6868 Messages postés 310 Date d'inscription jeudi 4 septembre 2003 Statut Membre Dernière intervention 9 juin 2005 1
20 avril 2004 à 14:32
Merci a toi je cherche a mettre mon ordi en ecoute sur le net d'en voyer une page html au client pour transmettre des ordre a l'ordi serveur je pense que ton zip va mettre utilie j'espere

merci
djmoha2000 Messages postés 1 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 13 avril 2004
13 avril 2004 à 14:00
ca fais plus de 3 jours que je cherche un code pareil,surtout que j'avais l'habitude de travailler avec vb6(qui est différent).
cependant ca serait interssant de permettre plrs con vers serveur(comme suggéré par cognicasse),ds ce cas soit il faut résoudre le prob des index(groupe de control en vb6),soit utiliser des thread(chaque requéte entrante sera un nouvel thread) sinon creer des instances(à chaque reéception coté serveur) d'un objet socket(par exemple).je travaille actuellement la dessus.
sinon,bon courage et merçi
cognicase Messages postés 63 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 13 juillet 2005
26 mars 2004 à 02:11
C'est super bien ... moi j'aime bien ..
Un petit ajout serait de permettre plusieurs connection sur le serveur avec un nom d'usager comme le fait MSN pis ca y est tu aurais refait MSN .... avec .net ...
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
8 mars 2004 à 21:59
Voilà j'ai mis à jour le zip avec la version simplifiée de SocketEventSink (utilisation de la classe AutoResetEvent au lieu des APIs Winsock et disparition du thread de travail). J'ai aussi changé l'espace de noms, les classes sont maintenant dans System.Net.Sockets au lieu de Sockets.



Xya
irchk Messages postés 11 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 12 mars 2004
8 mars 2004 à 16:48
Autant pour moi, j'avais pas vu qu'il y'avait un zip...dur dur le lundi
irchk Messages postés 11 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 12 mars 2004
8 mars 2004 à 16:09
Arf, bon moi je suis un sti nouveau concernant .net, et je dois retranscrire ce que faisiait le controle winsock....

Ca tombe bien, le post qu'il me fallait MAIS...j'arrive pas a trouver le namespace de la classe autosocket...surtout que je trouve null part un sti renseignement sur cette classe...

Merci pour toutes infos sup !
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
29 févr. 2004 à 20:13
Ben tant que le Framework .NET ne propose pas des classes de remplacement à toute l'API de Windows il faudra faire comme ca, en attendant Indigo de Longhorn.

Sinon si tu décompile le code du Framework tu vois qu'un grand nombre de classes sont juste des wrappers qui utilisent massivement les appels à l'API de Windows (Socket, FileStream, System.Windows.Forms, System.Threading, System.Security.Cryptography, Microsoft.Win32 (là c'est normal :p), GDI+, etc), mais je suis d'accord avec toi qu'il faut plutot écrire du code portable, par exemple pour pouvoir être exécuté sur Mono.

Sinon pour la classe AutoSocket j'ai réussi à un peu l'améliorer, à savoir se débarasser du thread qui dispatche les événements, en utilisant les événements de Windows (les classes Auto/Manual-ResetEvent) et RegisterWaitForSingleObject de ThreadPool: en fait, j'avais pas remarqué que les events WinSock étaient des bêtes events de Windows :)

Faut que je mette à jour le zip.


Xya
Kitsu Messages postés 1 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 29 février 2004
29 févr. 2004 à 01:55
C'est plutot bien monté, mais je regrette qu'il y est des appels sur ws2_32.dll ca va un peu à l'encontre du système de prog. .NET.

Comme c'est dit dans la Classe d'ailleurs :) "Unsafe"

Je pense qu'une autre version du Composant pourrait se contenter de ce qu'offre le Framework en standard et offrir des interfaces plus sympa pour la gestion du stream.

Sinon c bien :)
Xya Messages postés 103 Date d'inscription lundi 8 juillet 2002 Statut Membre Dernière intervention 24 novembre 2005
5 févr. 2004 à 13:33
Merci de mettre un commentaire avec la note, c'est toujours frustrant d'avoir une note sans commentaire, de pas savoir ce qui doit être amélioré/changé/ajouté :)


Xya
cs_mahhoura Messages postés 15 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 25 août 2007
5 févr. 2004 à 10:10
Voila 10 points :) continue!
Rejoignez-nous