B@Z SOCKET V 1.4 - CLASS DE SOCKET AVEC ÉVÉNEMENTS, MULTI-CONNEXION, CROSS-THRE
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006
-
16 févr. 2006 à 03:58
cs_Jeromedu79
Messages postés4Date d'inscriptiondimanche 9 janvier 2011StatutMembreDernière intervention24 juin 2013
-
24 juin 2013 à 19:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Jeromedu79
Messages postés4Date d'inscriptiondimanche 9 janvier 2011StatutMembreDernière intervention24 juin 2013 24 juin 2013 à 19:09
Ta source a beaucoup servi pour certains, mais pas vraiment dans le bon sens ^^
lunnorey
Messages postés39Date d'inscriptiondimanche 11 octobre 2009StatutMembreDernière intervention 9 mai 20153 6 mars 2012 à 11:28
Bonjour,
Lors du lancement du serveur, le pare feu Windows 7 ne me demande pas d'autorisé la connexion ?
Résultat cela bloque la connexion ! Il y a t-il un moyen d'afficher cette page de confirmation ?
Sinon j'ai tester en désactivant le pare feu Windows 7 mais un message d'erreur s'affiche sur le client :
" -- Impossible de se connecter:Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée 90.xxx.xxx.xxx.:1234 . "
Mon routeur est correctement configurer, j'ai ouvert le port 1234.
Merci d'avance pour votre aide.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 8 août 2011 à 15:55
Mettre en place un protocole d'authentification, de jeton, d'index, de plage, de passphrase, de mot de passe enfin la liste est longue
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 8 août 2011 à 14:26
@Guilleto
Lorsqu'un client envoie un socjet seul le serveur le récupe.
Pour ce qui est de refuser un client déèja connecté, il est normalement impossible pour un client de se connecter 2 fois, sauf a utiliser si ce client utilise une adresse Ip différente pour chaque connexion
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 2 août 2011 à 14:12
Merci SurfZoid pour ta réponse.
Ce que je souhaites faire c'est que lorsqu'un Client envoie un socket, seul le Serveur récupère ce socket !
Est-ce que cela est possible ?
Pour envoyer un message uniquement à un client c'est dans le source mais je ne l'avais pas vu !
Et pour ce qui est de refuser un Client déjà connecté, je penses avoir trouvé !
Par avance merci
Olivier
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 2 août 2011 à 12:35
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 2 août 2011 à 12:34
Il te faut gérer une pile, ou une collection
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 2 août 2011 à 10:26
Bonjour à toutes et tous,
J'ai réussi à faire fonctionner l'application : juste un problème de droit !
En revanche je voudrais savoir comment refuser un client si celui-ci existe déjà ?
Et de la même manière lorsque j'ai un socket qui est reçu par le serveur en provenance du Client n°1, comment envoyer une réponse uniquement à ce Client et non à tout les clients indiqués dans la liste ?
Par avance merci
Olivier
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 6 juil. 2011 à 10:16
Bonjour BabBoss
Je me pose quelques questions au niveau du code.
Private Sub OnAcceptFailed(ByVal ex As Exception)
Try
If InvokeRequired() Then
If m_AsyncEvent Then
m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
Else
m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
End If
Else
Sync_AcceptFailed(ex)
End If
Catch exp As Exception
OnThreadException(exp)
End Try
End Sub
Ici je me demande s'il n'y a pas une erreur. En effet on fait la meme chose quand m_async_event est vrai ou faux.
Il ne me couterait rien de virer le test mais je me dis que tu devais vouloir faire quelque chose de different.
D'autre part j'ai l'impression que les 2 fonctions suivantes ne sont pas utilisées :
Private Sub OnSendProgress
et
Private Sub OnSendComplete
ThonyBoy
cs_rapha35
Messages postés1Date d'inscriptionmercredi 15 juillet 2009StatutMembreDernière intervention20 juin 2011 20 juin 2011 à 17:55
Bonjour tout le monde !
Je recontre un problème dans l'utilisation du B@zSocket :
System.ObjectDisposedException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
at System.Net.Sockets.NetworkStream.EndWrite(IAsyncResult asyncResult)
ce qui fait crash immédiatement le software ... (ligne 847)
Merci de votre aide.
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 18 juin 2011 à 00:06
Merci pour ces précisions !
Je vais tester cela dès que possible !
Encore merci.
Olivier
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 17 juin 2011 à 17:53
En complement de ma réponse précédente, il faut également que tu t'assure que le port que tu utilise est bien ouvert et non bloqué par un parefeu ou autre
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 17 juin 2011 à 17:35
@Guilleto
Tu fais erreur sur la config du serveur il ne faut pas mettre l'adresse IP du client (car il peut y avoir plusieurs client qui se connectent au serveur).
Tu dois mettre l'adresse IP du PC Serveur.
Et les ports doivent etre le meme coté client et coté serveur
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 17 juin 2011 à 17:23
Bonjour babboss,
Je n'arrive toujours pas à faire fonctionner ce soft.
Sur le PC serveur je mets le serveur.exe avec la DLL et je configure l'adresse IP avec l'IP du PC client.
Sur le PC client je mets le client.exe avec la DLL et je configure l'adresse IP avec l'IP du PC serveur.
Je clique sur Connect et voici le message :
-- Impossible de se connecter:Une tentative de connexion a échoué car le parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car l’hôte de connexion n’a pas répondu 192.168.1.136:11111
Que dois-je faire pour que cela fonctionne ?
Par avance merci
Olivier
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 8 juin 2011 à 00:30
@thonyboy
En effet quand tu fait un send pour envoyer un paquet de donner rien ne garantie qu'il va arriver tel quel dans le Client_DataArrival. Si il y a des problèmes sur le réseau il peut arriver en 2fois. Si tu envoie un gros paquet de données (plus de 8k si ma mémoire est bonne) il va également arriver en plusieurs fois. Si tu fais plusieurs petits send à la suite, ils vont arriver en une foi. Etc...
La solution la plus propre c'est de définir un protocole pour envoyer tes données. Par exemple tu définis que tous tes paquet finisse par CRLF. Ensuite dans ton Client_DataArrival tu rajoutes ces données dans un buffer. Et ensuite tu "parse" ton buffer pour récupérer les paquets un par un et les analyser. Si un paquet n'est pas encore fini d'arriver il reste dans le buffer jusqu'au prochain appel de Client_DataArrival. En gros le principe c'est d'avoir un système de queue ou tu analyse les paquets dans l'ordre ou il arrive et tu attends que le paquet soit complètement arrivé pour l'analyser.
Je ne sais pas si c'est très clair. J'essayerai de faire un bout de code si j'ai le temps.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 7 juin 2011 à 21:03
Faire une pile avec des index!
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 7 juin 2011 à 19:29
@baboss
tu es toujours là ?
J'ai un petit soucis au niveau du serveur avec Private Sub Client_DataArrival(ByVal sender As Object, ByVal data() As Byte)
En effet lorsque les données sont envoyée avec un certains laps de temps, pas de soucis.
Mais lorsque le serveur recoit (trop?) de Data à un instant T, Data contient plusieurs lignes de données envoyé par plusieurs send.
Ex: si je fais une boucle au niveau du client qui fait un Send
Les lignes recues, sont alors numérotées dans la chaine Data de DataArrival (sans CRLF)
Qu'elle est (ou était ta vision pour gerer cela) ?
Il est vrai que mon sub Client_DataArrival traite et interperte les données ce qui met un certain temps.
La solution est elle dans un nouveau thread pour le traitement des données afin de ne pas retarder le DataArrival ?
D'avance merci
ThonyBoy
angelblood
Messages postés46Date d'inscriptionsamedi 6 novembre 2010StatutMembreDernière intervention19 mai 2011 14 avril 2011 à 20:40
Bonjour,
Est-il possible d'envoyer une image entière xD (j'ai réussi que une partie) du client au serveur ? :)
Merci
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 6 avril 2011 à 15:08
Bonjour.
Cette source fonctionne parfaitement sur plusieurs PC je l'utilise au quotidien.
Vérifie tes params réseau, et assures toi que le port utilisé n'est pas bloqué
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 6 avril 2011 à 14:46
Bonjour à toutes et tous,
Je n'arrive pas à faire fonctionner la source sur 2 postes faisant parti du même réseau !
J'arrive seulement à la faire fonctionner sur le même PC avec les Adresses IP de base.
Est-ce que quelqu'un a déjà rencontré ce problème ?
Par avance merci.
Olivier
cs_Jeromedu79
Messages postés4Date d'inscriptiondimanche 9 janvier 2011StatutMembreDernière intervention24 juin 2013 24 févr. 2011 à 10:53
Très belle source.
achtouf
Messages postés15Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention10 décembre 2007 6 déc. 2010 à 15:25
Hello !
J'utilise toujours ton source parce qu'il est toujours aussi bien fait :)
Par contre, je me demande s'il n'y a pas un bug ici :
Public Sub Close()
If m_State <> BazSocketState.Disconnected AndAlso m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End Sub
Ca ne devrait pas être ce code ??
Public Sub Close()
If m_State <> BazSocketState.Disconnected Then
If m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End If
End Sub
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 6 nov. 2010 à 23:46
Un autre problème :(
A la place de la listBox je veux utiliser une listView
donc dans RefreshSockList j'ai :
Private Sub RefreshSockList()
ListView1.Items.Clear()
For Each i As KeyValuePair(Of BazSocket, Client) In ClientList
' Ajoute le client a la liste
ListView1.Items.Add(i.Value.ToString)
Next
End Sub
Et dans mon bouton Send :
If ListView1.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
Dim sock As BazSocket = CType(ListView1.Items(ListView1.SelectedIndices(0)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.text)
Une valeur de type 'System.Windows.Forms.ListViewItem' ne peut pas être convertie en 'MonProjet.Client'
et sa souligne : ListView1.Items(ListView1.SelectedIndices(0))
J'ai essayé plein de modification mais l'erreur persiste encore ! :s
Merci de m'aider svp !
PS : Je veux absolument la ListView car on peut mettre la propriété Details dans View
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 6 nov. 2010 à 22:32
Merci bcp !! Je vais enfin pouvoir m'attaquer a mon projet ! :)
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 6 nov. 2010 à 22:26
Encore plus court:
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
End If
If lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
For i = 0 To lstClient.SelectedItems.Count - 1
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
Next
txtSend.Focus()
End If
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 6 nov. 2010 à 22:13
Merciii beaucoup sa marche ! :p
Voici mon code :
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
'Puis là on l'envoie à tous
For i = 0 To lstClient.Items.Count - 1
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
End If
Next
txtSend.Focus()
ElseIf lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
For i = 0 To lstClient.SelectedItems.Count - 1
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
Next
txtSend.Focus()
End If
Est ce qu'il y a des modifications pour que sa soit mieu?
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 6 nov. 2010 à 22:01
Tu as oublié un " - 1" dans ta boucle:
For i = 0 To lstClient.SelectedItems.Count -1
Sinon Pour simplifier ton code:
- Pas la peine de faire un cas particulier pour 1 client sélectionné. Un "ElseIf lstClient.SelectedItems.Count >= 1" est suffisant et ça fait du code en moins ^^
- La boucle qui envoie à tous les client est redondante avec celle qui envoie à plusieurs clients. Une fois que tu as sélectionné tous les clients tu peux te servir du "ElseIf lstClient.SelectedItems.Count >= 1"
- Le "If lstClient.GetSelected(i) = True" ne sert à rien car tu boucle déjà sur les éléments sélectionnés.
- Remettre le focus sur la zone texte après la boucle (et non pas dedans)
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 6 nov. 2010 à 21:09
Alors voilà j'ai adapté le code avec la nouvelle version de B@ZSocket et sa donne sa
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
'Puis là on l'envoie à tous
For i = 0 To lstClient.Items.Count - 1
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Focus()
End If
End If
Next
ElseIf lstClient.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(0)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
ElseIf lstClient.SelectedItems.Count > 1 Then ' Si plusieurs client séléctionnés mais pas tous
For i = 0 To lstClient.SelectedItems.Count
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Focus()
End If
End If
Next
End If
End Sub
Quand je veux envoyer qu'à un client sa marche niquel, quand je veux envoyer a tout les clients sa marche aussi, quand je veux envoyer un message au client 1 et au client 2 niquel encore ! Mais quand je veux envoyer un message au client 1 ET au CLIENT 3 ou au client 2 ET au client 3 sa me met
L'index se trouve en dehors des limites du tableau.
A la ligne :
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
Merci de m'aider !
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 1 nov. 2010 à 17:32
Trop fort et maintenant le corrigé !
Et ca tombe plutot bien car découvrant le "dictionary" j'étais parti dans un truc un peu compliqué.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 1 nov. 2010 à 12:33
Je viens de mettre à jour l'exemple serveur avec ce que je t'ai expliquer.
En faite j'avais déjà fait ces modifications il y a plusieurs mois mais je ne les avaient pas postées
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 1 nov. 2010 à 11:51
Ouais, ben un énorme merci, parce que ta réponse est claire, pédagogique et complete.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 1 nov. 2010 à 11:40
Le mieux au niveau du serveur c'est d'avoir une class Client qui représente chaque client connecté.
Ensuite au lieu d'utiliser une liste de BazSocket tu utilise un Dictionary (équivalent des tableau associatif) avec comme clé la BazSocket et comme valeur ton objet Client.
Dim ClientList As New Dictionary(Of BazSocket, Client)
Dans l'event Accepted tu crée un nouveau client, tu lui passe dans son constructeur la BazSocket, et tu l'ajoute au Dictionary(au lieu de simplement ajouter la BazSocket a la liste).
Dim c As New Client(AcceptSock)
ClientList.Add(AcceptSock, c)
A partir de la dans ta class Client tu stocke ce que tu veux comme par exemple l'adresse IP du client(que tu récupères quand il est connecter, pour l'avoir au moment ou il se déconnecte)
L’intérêt du Dictionary c'est de pouvoir récupéré simplement le Client à partir de la BazSocket:
Dim sock As BazSocket = CType(sender, BazSocket) ' Récupère le socket concerné par l’évènement
Dim client As Client = ClientList.Item(sock) ' Récupère le client qui correspond à la socket
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 1 nov. 2010 à 10:31
Bonjour Babbboss
Pour ma part, je seche sur un point.
J'aimerais que le serveur, m'affiche l'IP du client qui s'est déconnecté au lieu du banal
txtRecv.AppendText("-- Un Client s'est deconnecté --" & vbCrLf)
Mais je n'arrive pas a trouver. Dés que l'on est dans le sub client_close alors sock.RemoteEP vaut déjà nothing !!!
Peux tu m'indiquer une piste ?
Merci
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 29 oct. 2010 à 23:09
Hum, juste un petit conseil d'ordre général: évitez de faire des boucles sur les items de votre ListBox pour parcourir la liste d'utilisateurs. C'est plus propre d'avoir une liste de clients en mémoire dans une structure de données adaptée et de faire une boucle dessus.
Regardez par exemple l'evénènement Client_DataArrival dans Form1.vb du projet Server qui transmet les données reçu d'un client à tous les autres clients.
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 19:03
Passons par la massegrie car on pourri le thread
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 18:38
Tu as fais une petite faute if lstClient.Selected(i) = True then
c'est pas Selected mais GetSelected
Bon je viens d'essayer mais sa me fait comme tout a l'heure se n'envoie le message qu'au Client 1 :( !
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 17:03
ps ne prend pas la fin en compte (aprés voila ca devrait résoudre....) c'est du reste de copier/coller
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 17:02
Mince. J'avais pas vu.
Bon ecoute ce n'est pas trés beau mais voila une solution rapide :
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
End If
' On lance la commande sur tous ceux qui sont sélectionné (soit quelques un par l'utisateur, soit tous si aucun)
For i = 0 To lstClient.Items.Count - 1
if lstClient.Selected(i) = True then
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
End if
Next
Voila ca devrait résoudre ton probleme si tu en selectionne 2, et si tu en selectionne aucun ca envoie a tous.
End If
End Sub
Dim i As Integer
For i = 0 To Me.ListBox1.Items.Count - 1
Me.ListBox1.SetSelected(i, True)
Next i
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 16:41
Sa marche toujours pas sa me met :
La conversion de la chaîne "Client 1 (127.0.0.1)" en type 'Integer' n'est pas valide.
A la ligne Dim sock As BazSocket = CType(SockList.Item(lstClient.Items.Item(i)), BazSocket)
J'ai méme essayé en ne mettant que Items sans le .Item sa fais pareil :(
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 16:25
a premiere vu le probleme vient de là (encore une fois je te répond en direct a la va vite, donc oui je fais quelques fautes...)
For i = 0 To lstClient.Items.Count - 1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
le lstclient.selectedindice.item(i) n'est pas bon puisque ca prend tu ceux sélectionné or tu n'en a aucun.
il faut changer pour lstclient.items(i)
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 15:52
Oui oui j'ai rien oublié j'ai bien mis le i mais sa ne marche toujours pas :s et pour le
lstClient.ITEMS.Count - 1
tu avais mis lstClient.Count - 1 sans le items ^^
Mais bon le problème n'est toujours pas résolu :/
Jviens de voir un truk illogique !
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
Mais alors que la c'est écrit
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
Comment tu veux envoyer aux clients séléctionner alors que juste avant on dis que si il y a pas de client séléctioné c'est qu'on veut l'envoyer a tous ?!! xD
Voici mon code enfait :
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
For i = 0 To lstClient.Items.Count - 1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
Next
Else
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
End If
End Sub
Quand je séléctionne mes 2 client sa n'envoie le message qu'a un client et quand je ne séléctionne aucun client sa me met cette exception :
L'index se trouve en dehors des limites du tableau.
puis sa surligne ce code :
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
^^'
Donc je sais plus trop quoi faire xD
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 15:30
"T'a oublié un End if et lstClient.ITEMS.Count - 1 ^^"
Autant le Endif oui, mais le lstclient.Items.count -1 je ne vois pas.
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 15:15
J'attendais que tu reflechisses un peu avant de poster.... pour ne pas perdre du temps comme ce midi ;-)
Je suis étonné que la solution ne fonctionne pas.
Est tu sur de bien avoir écris dans la boucle :
' bien mettre i dans item(i)
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 15:06
HELP svp !! :(
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 13:08
Lol 1 min avant que tu le dise j'ai essayé de moi meme exactement le méme code mais sa ne marche pas ^^' sa ne l'envoie qu'au Client 1 et dans le serveur sa écrit
Envoyé: Je test !
Envoyé:
Y aurait il une autre solution j'en ai vraiment besoin svp j'ai essayé plein de chose :s
PS : T'a oublié un End if et lstClient.ITEMS.Count - 1 ^^
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 29 oct. 2010 à 13:02
Bonjour BLEACH
Coté serveur tu as ce morceau de code qui vérifie si tu a sélectionné un destinataire
If lstClient.SelectedItems.Count <> 1 Then
MsgBox("Veuillez sélectionner un client.", MsgBoxStyle.Information)
Return
End If
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
tu peux donc facilement le remplacé par un truc du genre
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
for i = 0 to lstClient.Count -1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
next
PS : Il y a peut etre une faute ou deux, car je tape directement la réponse sans tester sous VisualStudio
bleach59800
Messages postés13Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention 6 novembre 2010 29 oct. 2010 à 12:45
Bonjour ! Cette classe est énorme !! Mais j'ai un petit problème comment faire pour que le serveur puisse envoyé des données à tout les clients à la fois svp ?!
Merci !
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 25 oct. 2010 à 06:59
Désolé je viens de trouver. Je cherchais dans la librairie et en fait c'est le serveur.
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 24 oct. 2010 à 13:04
J'ai un souci avec cette excellente source.
Si quelqu'un peut m'aider ?
J'observe que quand un client envoie des données, tous les autres les recoivent.
Afin d'économiser la bande passante j'aimerais supprimer ce comportement.
C'est a dire que si un client envoie des données seul le serveur les recoit.
J'ai beau fouiller le source je n'arrive pas a trouver comment modifier ce comportement.
thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011 24 oct. 2010 à 06:11
C'est excellent !
BRAVO et MERCI
deagle15
Messages postés1Date d'inscriptionlundi 10 décembre 2007StatutMembreDernière intervention27 juillet 2010 27 juil. 2010 à 11:28
J'espère recevoir une réponse malgré la date originale, mais bon :)
Voila j'essaye d'apprendre sur les sockets un peu en analysant tes demo (Client et Server), et que personne me disent d'aller voir des tutos j'apprend que en analysant e sources. Mais bon sur mon server (Je l'ai fait en console par contre) dans l'event de fermeture de connection avec le client :
Private Sub Client_Close(ByVal sender As Object, ByVal e As System.EventArgs)
Dim sock As BazSocket = CType(sender, BazSocket) 'Recupere le socket concerné par l'evenement
sock.Close() 'On close car on a plus besoin de ce socket.
SockList.Remove(sock) 'On supprime le socket de la list
Console.WriteLine("- Un Client s'est deconnecté")
End Sub
Bien a CType, pour transformer le socket en BazSocket et bien sa me donne.
Impossible d'effectuer un cast d'un objet de type 'System.Net.Sockets.Socket' en type 'System.Net.Sockets.BazSocket'.
Je sais pas trop quoi faire, quelqu'un peux m'aider svp ?
Merci
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 1 avril 2010 à 10:41
Salut BABBOSS,
Très beau travail que celui que tu nous a fais la, même si tu t'es fait aidé pour l'cross-threading, c'etait pas si évident, j'ai moi même tenté de refaire un clône parfait de ce bon vieu Winsock mais sans succès (par manque de temps...).
Le code est propre, fonctionnel, aucun bug pour ma part (j'arrive peut être alors qu'ils sont tous corrigés). Perso je met 10 pour cette source !
J'aurais juste une chose à te demander en MP...
++ Mayzz.
ianis24
Messages postés87Date d'inscriptiondimanche 20 août 2006StatutMembreDernière intervention13 janvier 2011 25 oct. 2009 à 14:35
Des que tu a le temps essaie de corriger les quelques bugs.
Ta classe est très intéressante et ton niveau plutôt élevé, Je pense que tu peut créer le Socket Parfait.
Bonne Chance et encore Merci.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 19 oct. 2009 à 03:35
Bonjour,
Désolé, je n'est plus trop le temps de m'occuper de cette source en ce moment.
Pour respondre au questions:
- On ne peut pas (à ma connaissance) recupérer l'ip avant de faire le Accept. Il faut Accept et ensuite Close si l'ip ne vous plait pas.
- Pour l'ip de la personne qui se deconnecte une des solution est de maintenir une liste de Client aulieu de la liste de Socket dans l'exemple. Client etant une class que vous créer avec comme attribut l'objet Socket, l'ip du client, etc...
- Pour l'exemple en mode console je ne vois pas ou est le problème ? Il suffit d'utilisé le constructeur par defaut aulieu de celui qui accepte un ISynchronizeInvoke
casoftware83 > en ce qui conserne ton bug je pense que ca vien du fait que la connexion est fermer juste apres qu'on l'ai accepter mais avant que l'on commence a recevoir les données. Du coup le BeginRead plante car la connexion est deja fermer.
Je vais voir si je peut faire quelque chose. Un simple Try... Catch ne serai pas l'idéale car la connexion serait fermer avant que l'on ai pu faire AddHandler sur l'event Close et du coup on ne serait pas notifier que la connexion est déja fermée.
Je vais voir ce que je peut faire.
ianis24
Messages postés87Date d'inscriptiondimanche 20 août 2006StatutMembreDernière intervention13 janvier 2011 18 oct. 2009 à 20:05
HUSSEIN7 => Et je voudrais savoir comment récupérer l'ip de quelqu'un qui ce déconnecte du serveur.
Pareil Pour moi.
Car la ça me cause un gros problème et mes connaissance ne sont pas suffisante pour le régler.
Merci.
hussein47
Messages postés3Date d'inscriptionmardi 10 février 2009StatutMembreDernière intervention 2 septembre 2009 2 sept. 2009 à 11:57
Moyen d'utiliser ta classe en mode console, tu pourrais faire un petit exemple.
Et je voudrais savoir comment recuperer l'ip de quelqu'un qui ce deconnect du server.
cs_Tropic
Messages postés90Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention 1 février 2011 2 août 2009 à 14:46
Comment fait-on pour récupérer l'adresse IP hôte
avant de faire un SocketClient.LaSocket = LaSocket.EndAccept(async)
En fait, avant d'accepter la connexion
casoftware83
Messages postés5Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 janvier 2009 26 janv. 2009 à 11:38
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+
casoftware83
Messages postés5Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 janvier 2009 26 janv. 2009 à 11:34
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+
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 24 janv. 2009 à 05:55
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 ?
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 24 janv. 2009 à 00:44
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.
casoftware83
Messages postés5Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 janvier 2009 23 janv. 2009 à 16:13
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.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 23 janv. 2009 à 02:37
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 ?
casoftware83
Messages postés5Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 janvier 2009 21 janv. 2009 à 10:12
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 21 janv. 2009 à 01:50
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é ^^
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 21 janv. 2009 à 01:24
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 20 janv. 2009 à 23:25
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 ?
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 20 janv. 2009 à 23:06
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.
casoftware83
Messages postés5Date d'inscriptionjeudi 1 juillet 2004StatutMembreDernière intervention26 janvier 2009 20 janv. 2009 à 19:23
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.
Louu34
Messages postés2Date d'inscriptionmercredi 21 novembre 2007StatutMembreDernière intervention20 janvier 2009 13 janv. 2009 à 14:21
Bravo !!
Le newbie
Messages postés200Date d'inscriptionmardi 17 octobre 2006StatutMembreDernière intervention24 mars 20122 6 janv. 2009 à 08:43
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 janv. 2009 à 22:18
Bonne année ! 0 octet lol bizarre.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 5 janv. 2009 à 19:48
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 :)
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 janv. 2009 à 18:37
Super babboss ! Ça marche nickel !
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 9 déc. 2008 à 05:50
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 20 nov. 2008 à 14:16
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 20 nov. 2008 à 13:26
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é.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 17 nov. 2008 à 09:57
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."
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 17 nov. 2008 à 07:13
Bon quand j'aurai un peu de temps j'arrangerai ca ^^
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 17 nov. 2008 à 07:04
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.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 17 nov. 2008 à 07:02
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 17 nov. 2008 à 04:26
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 16 nov. 2008 à 06:53
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 ^^
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 8 nov. 2008 à 13:26
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 8 nov. 2008 à 13:01
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.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 8 nov. 2008 à 12:59
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 6 nov. 2008 à 00:12
Evidament "infinite loop!" lol
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 23:20
alors je demanderais à un ami, de le faire, je vous tient au courant.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 5 nov. 2008 à 23:19
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...
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 23:14
FireWall Vista activé et débloqué sur le logiciel serveur et client.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 21:55
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/
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 21:01
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.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 21:00
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 !
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 20:14
Moi avec mon chat les pseudos sont pris en charge mais j'améliore.
Triboutmatthieu
Messages postés206Date d'inscriptionlundi 26 septembre 2005StatutMembreDernière intervention 9 juillet 2012 5 nov. 2008 à 20:13
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 19:44
T'inquiète pas j'ai vu plein d'articles pour le routage livebox mais le routage ne marche jamais chez moi.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 19:01
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 18:57
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 18:53
si je suis clair ^^
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 18:52
petite erreur , il fallait comprendre "encore une fois tu ne me semble PAS trés clair ...."
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 18:46
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.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 5 nov. 2008 à 18:45
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
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 5 nov. 2008 à 17:10
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,
@++
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 11:19
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 5 nov. 2008 à 11:13
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 28 oct. 2008 à 15:56
C'est bien joli mais ceux qu'ils disent correspondent pas à ma LiveBox il y a pas de menu NAT.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 28 oct. 2008 à 15:49
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 27 oct. 2008 à 16:06
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)
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 27 oct. 2008 à 09:31
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 27 oct. 2008 à 02:37
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.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 26 oct. 2008 à 14:18
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.
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 24 oct. 2008 à 11:58
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.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 24 oct. 2008 à 09:10
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 24 oct. 2008 à 03:13
Oui j'ai internet, tout le temps. Si tu veux tu peux me passer ton MSN par MP pour m'aider ^^
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 23 oct. 2008 à 23:00
tu as internet, ?
donc tout les paquets de ton ip public passe bien par ton ip privée avant d'arrivé sur ton écran !
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 23 oct. 2008 à 22:06
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.
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 23 oct. 2008 à 21:12
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
Redman31100
Messages postés167Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention11 février 2009 23 oct. 2008 à 19:11
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
psykocrash
Messages postés240Date d'inscriptionvendredi 14 juin 2002StatutMembreDernière intervention17 mars 2009 18 juin 2008 à 15:44
Si si ça fonctionne :)
Merci pour l'info !
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 17 juin 2008 à 23:53
Quand tu lance VS 2008, fait ouvrir une solution, celle ci, l'outil de conversion ne se lance pas ?
psykocrash
Messages postés240Date d'inscriptionvendredi 14 juin 2002StatutMembreDernière intervention17 mars 2009 17 juin 2008 à 23:15
Est ce que tu pourrais uploader une version 2008 ? Ce serait sympa ;)
achtouf
Messages postés15Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention10 décembre 2007 19 déc. 2007 à 12:28
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)
geraldbeaulieu
Messages postés1Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention30 juin 2007 30 juin 2007 à 03:12
Bravo, j'ai fais beaucoup de recherche afin de trouver un code comme celui-ci 10/10.
Bye
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 28 févr. 2007 à 13:36
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.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 27 févr. 2007 à 19:43
La version 1.1 est en ligne (1 ans aprés la première version, mais mieu vaut tard que jamais :D )
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 27 févr. 2007 à 16:35
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 :)
jpsarot
Messages postés3Date d'inscriptionmercredi 1 janvier 2003StatutMembreDernière intervention27 février 2007 27 févr. 2007 à 15:49
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
cs_eldim
Messages postés956Date d'inscriptionlundi 30 mai 2005StatutMembreDernière intervention21 août 20141 10 janv. 2007 à 09:53
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...
surfzoid
Messages postés463Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention21 avril 2010 28 nov. 2006 à 19:28
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
Le newbie
Messages postés200Date d'inscriptionmardi 17 octobre 2006StatutMembreDernière intervention24 mars 20122 14 nov. 2006 à 14:10
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.
Le newbie
Messages postés200Date d'inscriptionmardi 17 octobre 2006StatutMembreDernière intervention24 mars 20122 14 nov. 2006 à 14:08
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
teo770
Messages postés2Date d'inscriptionmardi 14 novembre 2000StatutMembreDernière intervention27 août 2006 27 août 2006 à 19:17
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
cs_raptorz
Messages postés1Date d'inscriptionsamedi 15 avril 2006StatutMembreDernière intervention11 août 2006 11 août 2006 à 19:43
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 ?)
mallett
Messages postés12Date d'inscriptionlundi 1 septembre 2003StatutMembreDernière intervention16 juin 2008 28 juin 2006 à 16:36
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+
psycho81
Messages postés84Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention17 février 2008 11 mars 2006 à 10:49
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é ....
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 11 mars 2006 à 00:48
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... ;)
psycho81
Messages postés84Date d'inscriptionmardi 4 mai 2004StatutMembreDernière intervention17 février 2008 9 mars 2006 à 16:40
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
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 17 févr. 2006 à 17:28
merci,
j'espere que ca pourra servir a des gens ^^
magloui
Messages postés8Date d'inscriptionvendredi 2 avril 2004StatutMembreDernière intervention 3 octobre 2007 16 févr. 2006 à 16:17
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.
cs_babboss
Messages postés121Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention29 novembre 2006 16 févr. 2006 à 03:58
Ca fait longtemps que je n'avais pas poster de sources sur VBFrance ^^
Ca fait tout drole ^^
24 juin 2013 à 19:09
6 mars 2012 à 11:28
Lors du lancement du serveur, le pare feu Windows 7 ne me demande pas d'autorisé la connexion ?
Résultat cela bloque la connexion ! Il y a t-il un moyen d'afficher cette page de confirmation ?
Sinon j'ai tester en désactivant le pare feu Windows 7 mais un message d'erreur s'affiche sur le client :
" -- Impossible de se connecter:Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée 90.xxx.xxx.xxx.:1234 . "
Mon routeur est correctement configurer, j'ai ouvert le port 1234.
Merci d'avance pour votre aide.
8 août 2011 à 15:55
8 août 2011 à 14:26
Lorsqu'un client envoie un socjet seul le serveur le récupe.
Pour ce qui est de refuser un client déèja connecté, il est normalement impossible pour un client de se connecter 2 fois, sauf a utiliser si ce client utilise une adresse Ip différente pour chaque connexion
2 août 2011 à 14:12
Ce que je souhaites faire c'est que lorsqu'un Client envoie un socket, seul le Serveur récupère ce socket !
Est-ce que cela est possible ?
Pour envoyer un message uniquement à un client c'est dans le source mais je ne l'avais pas vu !
Et pour ce qui est de refuser un Client déjà connecté, je penses avoir trouvé !
Par avance merci
Olivier
2 août 2011 à 12:35
http://plasserre.developpez.com/cours/vb-net/
http://www.google.fr/search?q=collection+vb+net&ie=utf-8&oe=utf-8&aq=t&rls=com.mandriva:en-US:unofficial&client=firefox-a
2 août 2011 à 12:34
2 août 2011 à 10:26
J'ai réussi à faire fonctionner l'application : juste un problème de droit !
En revanche je voudrais savoir comment refuser un client si celui-ci existe déjà ?
Et de la même manière lorsque j'ai un socket qui est reçu par le serveur en provenance du Client n°1, comment envoyer une réponse uniquement à ce Client et non à tout les clients indiqués dans la liste ?
Par avance merci
Olivier
6 juil. 2011 à 10:16
Je me pose quelques questions au niveau du code.
Private Sub OnAcceptFailed(ByVal ex As Exception)
Try
If InvokeRequired() Then
If m_AsyncEvent Then
m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
Else
m_Sync.BeginInvoke(CallAcceptFailed, New Object() {ex})
End If
Else
Sync_AcceptFailed(ex)
End If
Catch exp As Exception
OnThreadException(exp)
End Try
End Sub
Ici je me demande s'il n'y a pas une erreur. En effet on fait la meme chose quand m_async_event est vrai ou faux.
Il ne me couterait rien de virer le test mais je me dis que tu devais vouloir faire quelque chose de different.
D'autre part j'ai l'impression que les 2 fonctions suivantes ne sont pas utilisées :
Private Sub OnSendProgress
et
Private Sub OnSendComplete
ThonyBoy
20 juin 2011 à 17:55
Je recontre un problème dans l'utilisation du B@zSocket :
System.ObjectDisposedException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
at System.Net.Sockets.NetworkStream.EndWrite(IAsyncResult asyncResult)
ce qui fait crash immédiatement le software ... (ligne 847)
Merci de votre aide.
18 juin 2011 à 00:06
Je vais tester cela dès que possible !
Encore merci.
Olivier
17 juin 2011 à 17:53
17 juin 2011 à 17:35
Tu fais erreur sur la config du serveur il ne faut pas mettre l'adresse IP du client (car il peut y avoir plusieurs client qui se connectent au serveur).
Tu dois mettre l'adresse IP du PC Serveur.
Et les ports doivent etre le meme coté client et coté serveur
17 juin 2011 à 17:23
Je n'arrive toujours pas à faire fonctionner ce soft.
Sur le PC serveur je mets le serveur.exe avec la DLL et je configure l'adresse IP avec l'IP du PC client.
Sur le PC client je mets le client.exe avec la DLL et je configure l'adresse IP avec l'IP du PC serveur.
Je clique sur Connect et voici le message :
-- Impossible de se connecter:Une tentative de connexion a échoué car le parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car l’hôte de connexion n’a pas répondu 192.168.1.136:11111
Que dois-je faire pour que cela fonctionne ?
Par avance merci
Olivier
8 juin 2011 à 00:30
En effet quand tu fait un send pour envoyer un paquet de donner rien ne garantie qu'il va arriver tel quel dans le Client_DataArrival. Si il y a des problèmes sur le réseau il peut arriver en 2fois. Si tu envoie un gros paquet de données (plus de 8k si ma mémoire est bonne) il va également arriver en plusieurs fois. Si tu fais plusieurs petits send à la suite, ils vont arriver en une foi. Etc...
La solution la plus propre c'est de définir un protocole pour envoyer tes données. Par exemple tu définis que tous tes paquet finisse par CRLF. Ensuite dans ton Client_DataArrival tu rajoutes ces données dans un buffer. Et ensuite tu "parse" ton buffer pour récupérer les paquets un par un et les analyser. Si un paquet n'est pas encore fini d'arriver il reste dans le buffer jusqu'au prochain appel de Client_DataArrival. En gros le principe c'est d'avoir un système de queue ou tu analyse les paquets dans l'ordre ou il arrive et tu attends que le paquet soit complètement arrivé pour l'analyser.
Je ne sais pas si c'est très clair. J'essayerai de faire un bout de code si j'ai le temps.
7 juin 2011 à 21:03
7 juin 2011 à 19:29
tu es toujours là ?
J'ai un petit soucis au niveau du serveur avec Private Sub Client_DataArrival(ByVal sender As Object, ByVal data() As Byte)
En effet lorsque les données sont envoyée avec un certains laps de temps, pas de soucis.
Mais lorsque le serveur recoit (trop?) de Data à un instant T, Data contient plusieurs lignes de données envoyé par plusieurs send.
Ex: si je fais une boucle au niveau du client qui fait un Send
Les lignes recues, sont alors numérotées dans la chaine Data de DataArrival (sans CRLF)
Qu'elle est (ou était ta vision pour gerer cela) ?
Il est vrai que mon sub Client_DataArrival traite et interperte les données ce qui met un certain temps.
La solution est elle dans un nouveau thread pour le traitement des données afin de ne pas retarder le DataArrival ?
D'avance merci
ThonyBoy
14 avril 2011 à 20:40
Est-il possible d'envoyer une image entière xD (j'ai réussi que une partie) du client au serveur ? :)
Merci
6 avril 2011 à 15:08
Cette source fonctionne parfaitement sur plusieurs PC je l'utilise au quotidien.
Vérifie tes params réseau, et assures toi que le port utilisé n'est pas bloqué
6 avril 2011 à 14:46
Je n'arrive pas à faire fonctionner la source sur 2 postes faisant parti du même réseau !
J'arrive seulement à la faire fonctionner sur le même PC avec les Adresses IP de base.
Est-ce que quelqu'un a déjà rencontré ce problème ?
Par avance merci.
Olivier
24 févr. 2011 à 10:53
6 déc. 2010 à 15:25
J'utilise toujours ton source parce qu'il est toujours aussi bien fait :)
Par contre, je me demande s'il n'y a pas un bug ici :
Public Sub Close()
If m_State <> BazSocketState.Disconnected AndAlso m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End Sub
Ca ne devrait pas être ce code ??
Public Sub Close()
If m_State <> BazSocketState.Disconnected Then
If m_AlwaysRaiseClose Then
CloseSocket()
OnClosed()
Else
CloseSocket()
End If
End If
End Sub
6 nov. 2010 à 23:46
A la place de la listBox je veux utiliser une listView
donc dans RefreshSockList j'ai :
Private Sub RefreshSockList()
ListView1.Items.Clear()
For Each i As KeyValuePair(Of BazSocket, Client) In ClientList
' Ajoute le client a la liste
ListView1.Items.Add(i.Value.ToString)
Next
End Sub
Et dans mon bouton Send :
If ListView1.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
Dim sock As BazSocket = CType(ListView1.Items(ListView1.SelectedIndices(0)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.text)
txtRecv.AppendText("Envoyé : " & txtSend.text & vbCrLf)
txtSend.Text = ""
End If
End If
txtSend.Focus()
Puis sa me met l'erreur :
Une valeur de type 'System.Windows.Forms.ListViewItem' ne peut pas être convertie en 'MonProjet.Client'
et sa souligne : ListView1.Items(ListView1.SelectedIndices(0))
J'ai essayé plein de modification mais l'erreur persiste encore ! :s
Merci de m'aider svp !
PS : Je veux absolument la ListView car on peut mettre la propriété Details dans View
6 nov. 2010 à 22:32
6 nov. 2010 à 22:26
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
End If
If lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
For i = 0 To lstClient.SelectedItems.Count - 1
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
Next
txtSend.Focus()
End If
6 nov. 2010 à 22:13
Voici mon code :
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
'Puis là on l'envoie à tous
For i = 0 To lstClient.Items.Count - 1
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
End If
Next
txtSend.Focus()
ElseIf lstClient.SelectedItems.Count >= 1 Then ' Si 1 ou plusieurs clients séléctionné
For i = 0 To lstClient.SelectedItems.Count - 1
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
End If
Next
txtSend.Focus()
End If
Est ce qu'il y a des modifications pour que sa soit mieu?
6 nov. 2010 à 22:01
For i = 0 To lstClient.SelectedItems.Count -1
Sinon Pour simplifier ton code:
- Pas la peine de faire un cas particulier pour 1 client sélectionné. Un "ElseIf lstClient.SelectedItems.Count >= 1" est suffisant et ça fait du code en moins ^^
- La boucle qui envoie à tous les client est redondante avec celle qui envoie à plusieurs clients. Une fois que tu as sélectionné tous les clients tu peux te servir du "ElseIf lstClient.SelectedItems.Count >= 1"
- Le "If lstClient.GetSelected(i) = True" ne sert à rien car tu boucle déjà sur les éléments sélectionnés.
- Remettre le focus sur la zone texte après la boucle (et non pas dedans)
6 nov. 2010 à 21:09
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count < 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
'Puis là on l'envoie à tous
For i = 0 To lstClient.Items.Count - 1
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Focus()
End If
End If
Next
ElseIf lstClient.SelectedItems.Count = 1 Then ' Si 1 client séléctionné
Dim sock As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(0)), Client).Socket
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
ElseIf lstClient.SelectedItems.Count > 1 Then ' Si plusieurs client séléctionnés mais pas tous
For i = 0 To lstClient.SelectedItems.Count
If lstClient.GetSelected(i) = True Then
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
If sockall IsNot Nothing AndAlso sockall.State = BazSocketState.Connected Then
sockall.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Focus()
End If
End If
Next
End If
End Sub
Quand je veux envoyer qu'à un client sa marche niquel, quand je veux envoyer a tout les clients sa marche aussi, quand je veux envoyer un message au client 1 et au client 2 niquel encore ! Mais quand je veux envoyer un message au client 1 ET au CLIENT 3 ou au client 2 ET au client 3 sa me met
L'index se trouve en dehors des limites du tableau.
A la ligne :
Dim sockall As BazSocket = CType(lstClient.Items(lstClient.SelectedIndices.Item(i)), Client).Socket
Merci de m'aider !
1 nov. 2010 à 17:32
Et ca tombe plutot bien car découvrant le "dictionary" j'étais parti dans un truc un peu compliqué.
1 nov. 2010 à 12:33
En faite j'avais déjà fait ces modifications il y a plusieurs mois mais je ne les avaient pas postées
1 nov. 2010 à 11:51
1 nov. 2010 à 11:40
Ensuite au lieu d'utiliser une liste de BazSocket tu utilise un Dictionary (équivalent des tableau associatif) avec comme clé la BazSocket et comme valeur ton objet Client.
Dim ClientList As New Dictionary(Of BazSocket, Client)
Dans l'event Accepted tu crée un nouveau client, tu lui passe dans son constructeur la BazSocket, et tu l'ajoute au Dictionary(au lieu de simplement ajouter la BazSocket a la liste).
Dim c As New Client(AcceptSock)
ClientList.Add(AcceptSock, c)
A partir de la dans ta class Client tu stocke ce que tu veux comme par exemple l'adresse IP du client(que tu récupères quand il est connecter, pour l'avoir au moment ou il se déconnecte)
L’intérêt du Dictionary c'est de pouvoir récupéré simplement le Client à partir de la BazSocket:
Dim sock As BazSocket = CType(sender, BazSocket) ' Récupère le socket concerné par l’évènement
Dim client As Client = ClientList.Item(sock) ' Récupère le client qui correspond à la socket
1 nov. 2010 à 10:31
Pour ma part, je seche sur un point.
J'aimerais que le serveur, m'affiche l'IP du client qui s'est déconnecté au lieu du banal
txtRecv.AppendText("-- Un Client s'est deconnecté --" & vbCrLf)
Mais je n'arrive pas a trouver. Dés que l'on est dans le sub client_close alors sock.RemoteEP vaut déjà nothing !!!
Peux tu m'indiquer une piste ?
Merci
29 oct. 2010 à 23:09
Regardez par exemple l'evénènement Client_DataArrival dans Form1.vb du projet Server qui transmet les données reçu d'un client à tous les autres clients.
29 oct. 2010 à 19:03
29 oct. 2010 à 18:38
c'est pas Selected mais GetSelected
Bon je viens d'essayer mais sa me fait comme tout a l'heure se n'envoie le message qu'au Client 1 :( !
29 oct. 2010 à 17:03
29 oct. 2010 à 17:02
Bon ecoute ce n'est pas trés beau mais voila une solution rapide :
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
' Du coup on les sélectionne tous
For i = 0 To lstClient.Items.Count - 1
lstClient.SetSelected(i, True)
Next
End If
' On lance la commande sur tous ceux qui sont sélectionné (soit quelques un par l'utisateur, soit tous si aucun)
For i = 0 To lstClient.Items.Count - 1
if lstClient.Selected(i) = True then
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
End if
Next
Voila ca devrait résoudre ton probleme si tu en selectionne 2, et si tu en selectionne aucun ca envoie a tous.
End If
End Sub
Dim i As Integer
For i = 0 To Me.ListBox1.Items.Count - 1
Me.ListBox1.SetSelected(i, True)
Next i
29 oct. 2010 à 16:41
La conversion de la chaîne "Client 1 (127.0.0.1)" en type 'Integer' n'est pas valide.
A la ligne Dim sock As BazSocket = CType(SockList.Item(lstClient.Items.Item(i)), BazSocket)
J'ai méme essayé en ne mettant que Items sans le .Item sa fais pareil :(
29 oct. 2010 à 16:25
For i = 0 To lstClient.Items.Count - 1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
le lstclient.selectedindice.item(i) n'est pas bon puisque ca prend tu ceux sélectionné or tu n'en a aucun.
il faut changer pour lstclient.items(i)
29 oct. 2010 à 15:52
lstClient.ITEMS.Count - 1
tu avais mis lstClient.Count - 1 sans le items ^^
Mais bon le problème n'est toujours pas résolu :/
Jviens de voir un truk illogique !
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
Mais alors que la c'est écrit
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
Comment tu veux envoyer aux clients séléctionner alors que juste avant on dis que si il y a pas de client séléctioné c'est qu'on veut l'envoyer a tous ?!! xD
Voici mon code enfait :
Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
For i = 0 To lstClient.Items.Count - 1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
Next
Else
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
End If
End Sub
Quand je séléctionne mes 2 client sa n'envoie le message qu'a un client et quand je ne séléctionne aucun client sa me met cette exception :
L'index se trouve en dehors des limites du tableau.
puis sa surligne ce code :
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
^^'
Donc je sais plus trop quoi faire xD
29 oct. 2010 à 15:30
Autant le Endif oui, mais le lstclient.Items.count -1 je ne vois pas.
29 oct. 2010 à 15:15
Je suis étonné que la solution ne fonctionne pas.
Est tu sur de bien avoir écris dans la boucle :
' bien mettre i dans item(i)
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
29 oct. 2010 à 15:06
29 oct. 2010 à 13:08
Envoyé: Je test !
Envoyé:
Y aurait il une autre solution j'en ai vraiment besoin svp j'ai essayé plein de chose :s
PS : T'a oublié un End if et lstClient.ITEMS.Count - 1 ^^
29 oct. 2010 à 13:02
Coté serveur tu as ce morceau de code qui vérifie si tu a sélectionné un destinataire
If lstClient.SelectedItems.Count <> 1 Then
MsgBox("Veuillez sélectionner un client.", MsgBoxStyle.Information)
Return
End If
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(0)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
tu peux donc facilement le remplacé par un truc du genre
If lstClient.SelectedItems.Count <> 1 Then ' Si pas de client sélectionné c'est que tu veux l'envoyé a tous
for i = 0 to lstClient.Count -1
Dim sock As BazSocket = CType(SockList.Item(lstClient.SelectedIndices.Item(i)), BazSocket)
If sock IsNot Nothing AndAlso sock.State = BazSocketState.Connected Then
sock.Send(txtSend.Text)
txtRecv.AppendText("Envoyé: " & txtSend.Text & vbCrLf)
txtSend.Text = ""
txtSend.Focus()
End If
next
PS : Il y a peut etre une faute ou deux, car je tape directement la réponse sans tester sous VisualStudio
29 oct. 2010 à 12:45
Merci !
25 oct. 2010 à 06:59
24 oct. 2010 à 13:04
Si quelqu'un peut m'aider ?
J'observe que quand un client envoie des données, tous les autres les recoivent.
Afin d'économiser la bande passante j'aimerais supprimer ce comportement.
C'est a dire que si un client envoie des données seul le serveur les recoit.
J'ai beau fouiller le source je n'arrive pas a trouver comment modifier ce comportement.
24 oct. 2010 à 06:11
BRAVO et MERCI
27 juil. 2010 à 11:28
Voila j'essaye d'apprendre sur les sockets un peu en analysant tes demo (Client et Server), et que personne me disent d'aller voir des tutos j'apprend que en analysant e sources. Mais bon sur mon server (Je l'ai fait en console par contre) dans l'event de fermeture de connection avec le client :
Private Sub Client_Close(ByVal sender As Object, ByVal e As System.EventArgs)
Dim sock As BazSocket = CType(sender, BazSocket) 'Recupere le socket concerné par l'evenement
sock.Close() 'On close car on a plus besoin de ce socket.
SockList.Remove(sock) 'On supprime le socket de la list
Console.WriteLine("- Un Client s'est deconnecté")
End Sub
Bien a CType, pour transformer le socket en BazSocket et bien sa me donne.
Impossible d'effectuer un cast d'un objet de type 'System.Net.Sockets.Socket' en type 'System.Net.Sockets.BazSocket'.
Je sais pas trop quoi faire, quelqu'un peux m'aider svp ?
Merci
1 avril 2010 à 10:41
Très beau travail que celui que tu nous a fais la, même si tu t'es fait aidé pour l'cross-threading, c'etait pas si évident, j'ai moi même tenté de refaire un clône parfait de ce bon vieu Winsock mais sans succès (par manque de temps...).
Le code est propre, fonctionnel, aucun bug pour ma part (j'arrive peut être alors qu'ils sont tous corrigés). Perso je met 10 pour cette source !
J'aurais juste une chose à te demander en MP...
++ Mayzz.
25 oct. 2009 à 14:35
Ta classe est très intéressante et ton niveau plutôt élevé, Je pense que tu peut créer le Socket Parfait.
Bonne Chance et encore Merci.
19 oct. 2009 à 03:35
Désolé, je n'est plus trop le temps de m'occuper de cette source en ce moment.
Pour respondre au questions:
- On ne peut pas (à ma connaissance) recupérer l'ip avant de faire le Accept. Il faut Accept et ensuite Close si l'ip ne vous plait pas.
- Pour l'ip de la personne qui se deconnecte une des solution est de maintenir une liste de Client aulieu de la liste de Socket dans l'exemple. Client etant une class que vous créer avec comme attribut l'objet Socket, l'ip du client, etc...
- Pour l'exemple en mode console je ne vois pas ou est le problème ? Il suffit d'utilisé le constructeur par defaut aulieu de celui qui accepte un ISynchronizeInvoke
casoftware83 > en ce qui conserne ton bug je pense que ca vien du fait que la connexion est fermer juste apres qu'on l'ai accepter mais avant que l'on commence a recevoir les données. Du coup le BeginRead plante car la connexion est deja fermer.
Je vais voir si je peut faire quelque chose. Un simple Try... Catch ne serai pas l'idéale car la connexion serait fermer avant que l'on ai pu faire AddHandler sur l'event Close et du coup on ne serait pas notifier que la connexion est déja fermée.
Je vais voir ce que je peut faire.
18 oct. 2009 à 20:05
Pareil Pour moi.
Car la ça me cause un gros problème et mes connaissance ne sont pas suffisante pour le régler.
Merci.
2 sept. 2009 à 11:57
Et je voudrais savoir comment recuperer l'ip de quelqu'un qui ce deconnect du server.
2 août 2009 à 14:46
avant de faire un SocketClient.LaSocket = LaSocket.EndAccept(async)
En fait, avant d'accepter la connexion
26 janv. 2009 à 11:38
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+
26 janv. 2009 à 11:34
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+
24 janv. 2009 à 05:55
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 ?
24 janv. 2009 à 00:44
23 janv. 2009 à 16:13
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.
23 janv. 2009 à 02:37
Ç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 ?
21 janv. 2009 à 10:12
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
21 janv. 2009 à 01:50
Mais j'ai bien fait le port forwarding et pour l'instant ça a jamais marché ^^
21 janv. 2009 à 01:24
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.
20 janv. 2009 à 23:25
J'écoute en local avec routage de externe a local par l'ip 11111, personne ne peut me rejoindre.
Comment y remédier ?
20 janv. 2009 à 23:06
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.
20 janv. 2009 à 19:23
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.
13 janv. 2009 à 14:21
6 janv. 2009 à 08:43
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.
5 janv. 2009 à 22:18
5 janv. 2009 à 19:48
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 :)
5 janv. 2009 à 18:37
9 déc. 2008 à 05:50
20 nov. 2008 à 14:16
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.
20 nov. 2008 à 13:26
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é.
17 nov. 2008 à 09:57
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
17 nov. 2008 à 07:13
17 nov. 2008 à 07:04
17 nov. 2008 à 07:02
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.
17 nov. 2008 à 04:26
16 nov. 2008 à 06:53
J'ai plus de soucis ^^
8 nov. 2008 à 13:26
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
8 nov. 2008 à 13:01
8 nov. 2008 à 12:59
http://www.vbfrance.com/recherche.aspx?r=client+serveur&dotnet=1
8 nov. 2008 à 01:59
7 nov. 2008 à 21:36
7 nov. 2008 à 09:55
Au revoir et bonne prog .....
6 nov. 2008 à 16:51
6 nov. 2008 à 00:18
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
6 nov. 2008 à 00:12
5 nov. 2008 à 23:20
5 nov. 2008 à 23:19
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...
5 nov. 2008 à 23:14
FireWall Vista activé et débloqué sur le logiciel serveur et client.
5 nov. 2008 à 21:55
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/
5 nov. 2008 à 21:01
5 nov. 2008 à 21:00
5 nov. 2008 à 20:14
5 nov. 2008 à 20:13
5 nov. 2008 à 19:44
5 nov. 2008 à 19:01
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
5 nov. 2008 à 18:57
5 nov. 2008 à 18:53
5 nov. 2008 à 18:52
5 nov. 2008 à 18:46
5 nov. 2008 à 18:45
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
5 nov. 2008 à 17:10
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,
@++
5 nov. 2008 à 11:19
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.
5 nov. 2008 à 11:13
28 oct. 2008 à 15:56
28 oct. 2008 à 15:49
27 oct. 2008 à 16:06
27 oct. 2008 à 09:31
Sinon pour faire ce que tu veux il serait plus simple d'utilisé l'existant :
Wireshark / etherall
27 oct. 2008 à 02:37
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.
26 oct. 2008 à 14:18
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.
24 oct. 2008 à 11:58
24 oct. 2008 à 09:10
Desoler
24 oct. 2008 à 03:13
23 oct. 2008 à 23:00
donc tout les paquets de ton ip public passe bien par ton ip privée avant d'arrivé sur ton écran !
23 oct. 2008 à 22:06
23 oct. 2008 à 21:12
23 oct. 2008 à 19:11
Seulement j'ai cette erreur : -- Impossible d'ecouter:L'adresse demandée n'est pas valide dans son contexte
18 juin 2008 à 15:44
Merci pour l'info !
17 juin 2008 à 23:53
17 juin 2008 à 23:15
19 déc. 2007 à 12:28
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)
30 juin 2007 à 03:12
Bye
28 févr. 2007 à 13:36
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.
27 févr. 2007 à 19:43
27 févr. 2007 à 16:35
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 :)
27 févr. 2007 à 15:49
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
10 janv. 2007 à 09:53
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...
28 nov. 2006 à 19:28
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
14 nov. 2006 à 14:10
Merci de le préciser.
14 nov. 2006 à 14:08
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
27 août 2006 à 19:17
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
11 août 2006 à 19:43
Je t'aurais mis 10 étoiles si la classe aurait été encapsulée dans un composant. (est-ce faisable ?)
28 juin 2006 à 16:36
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+
11 mars 2006 à 10:49
11 mars 2006 à 00:48
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... ;)
9 mars 2006 à 16:40
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
17 févr. 2006 à 17:28
j'espere que ca pourra servir a des gens ^^
16 févr. 2006 à 16:17
Continue comme ca c'est exelent.
16 févr. 2006 à 03:58
Ca fait tout drole ^^