Problème création serveur

Utilisateur anonyme - 10 nov. 2011 à 14:36
 Utilisateur anonyme - 13 nov. 2011 à 18:46
Bonjour,
je voudrais créer un client serveur pour éteindre les PC de mon réseau.
Mais j'ai un soucis, lorsque je crée mon serveur, le formulaire n'est pas visible alors qu'il est bien lancé et le serveur est bien crée.

        Dim sRemoteAddress As String
        Dim address As IPAddress = IPAddress.Parse("127.0.0.1")
        Dim tcplistener As TcpListener = New TcpListener(address, 8100)

        tcplistener.Start()

        LabelConnecté.Visible = True
        Dim SocketpourClient As Socket = tcplistener.AcceptSocket
        sRemoteAddress = CType(SocketpourClient.RemoteEndPoint, IPEndPoint).Address.ToString
        MsgBox("Un client vient de se connecter." & Microsoft.VisualBasic.Chr(10) & "IP du client : " & sRemoteAddress & "" & Microsoft.VisualBasic.Chr(10) & "")


Lorsque je lance mon client, la connexion se fait mon formulaire réapparait.

Avez vous une explication ?

13 réponses

Utilisateur anonyme
10 nov. 2011 à 22:48
Bonsoir,

La fonction AcceptSocket est bloquante.
Utilise plutôt BeginAcceptSocket.

Bonne prog.
0
Utilisateur anonyme
10 nov. 2011 à 22:52
Autre chose, il est préférable d'écrire ceci :
Dim tcplistener As TcpListener = New TcpListener(System.Net.IPAddress.Any, 8100)
0
Utilisateur anonyme
11 nov. 2011 à 20:45
Bonjour,
merci pour ta réponse rapide, j'ai changé ce que tu m'a dit dans ta deuxième réponse, en revanche je ne voit pas ou je dois utiliser BeginAcceptSocket dans mon code.
Je pensais à
Dim SocketpourClient As Socket = tcplistener.AcceptSocket ' remplacer AcceptSocket par BeginAcceptSocket
mais sa ne marche pas.
Merci de ton aide.
0
Utilisateur anonyme
11 nov. 2011 à 22:05
Apres voir déclaré tcplistener au début de ta classe, il faut faire :
tcplistener.BeginAcceptSocket(New AsyncCallback(AddressOf AcceptSocket), tcplistener)

puis pour le callback :
Private Sub AcceptSocket(ByVal ar As IAsyncResult)
    'là on déclare juste une socket mais il serait préférable d'ajouter
    'à une List(Of Socket) pour obtenir toutes les socket connectées
    'ListeSockets.Add(tcplistener.EndAccpetSocket(ar))
    Dim SocketpourClient As Socket = tcplistener.EndAcceptSocket(ar)
    'et pour de nouvelles connexions ...
    tcplistener.BeginAcceptSocket(New AsyncCallback(AddressOf AcceptSocket), tcplistener)
End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
12 nov. 2011 à 17:54
Il y a des erreurs, j'ai du mal faire quelque chose
0
Utilisateur anonyme
12 nov. 2011 à 19:25
Bonsoir,

Voici un exemple de démonstration.
Je n'ai pas géré les erreurs, les ressources etc... (je vais pas te faire tout le boulot aussi )

Application serveur :
Option Strict On
Imports System.Net
Imports System.Net.Sockets

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'démarrage du serveur
        Dim Listener As New TcpListener(IPAddress.Any, 8001)
        'et ecoute
        Listener.Start()
        'accepte les connexions
        Listener.BeginAcceptSocket(New AsyncCallback(AddressOf AcceptSocket), Listener)
    End Sub

    Private Sub AcceptSocket(ByVal ar As IAsyncResult)
        'un client se connecte
        'récupération de l'objet Listener
        Dim Listener As TcpListener = DirectCast(ar.AsyncState, TcpListener)
        'récupération du socket
        Dim SocketPourClient As Socket = Listener.EndAcceptSocket(ar)
        'accepte d'autres connexions éventuelles
        Listener.BeginAcceptSocket(New AsyncCallback(AddressOf AcceptSocket), Listener)
        'préparation d'un buffer
        Dim buff() As Byte
        'dimmensionnement du buffer selon la taille du buffer du socket
        ReDim buff(SocketPourClient.ReceiveBufferSize)
        'réception des données
        SocketPourClient.BeginReceive(buff, 0, buff.Length, SocketFlags.None, New AsyncCallback(AddressOf Receive), SocketPourClient)
        'encodage en string
        Dim Recu As String = System.Text.Encoding.Default.GetString(buff)
        Debug.Print("Recu : " & Recu)
        'préparation d'un message à envoyer
        Dim message As String = "Message recu"
        'encodage 
        buff = System.Text.Encoding.Default.GetBytes(message)
        'envoi du message
        SocketPourClient.BeginSend(buff, 0, buff.Length, SocketFlags.None, New AsyncCallback(AddressOf Send), SocketPourClient)
        Debug.Print("Envoyé : " & message)
    End Sub

    Private Sub Receive(ByVal ar As IAsyncResult)
        Dim SocketPourClient As Socket = DirectCast(ar.AsyncState, Socket)
        SocketPourClient.EndReceive(ar)
    End Sub

    Private Sub Send(ByVal ar As IAsyncResult)
        Dim SocketPourClient As Socket = DirectCast(ar.AsyncState, Socket)
        SocketPourClient.EndSend(ar)
    End Sub
End Class


Application de test :

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim tcp As New System.Net.Sockets.TcpClient("localhost", 8001)
        Dim buff() As Byte = System.Text.Encoding.Default.GetBytes("coucou")
        tcp.Client.Send(buff, 0, buff.Length, Net.Sockets.SocketFlags.None)
        ReDim buff(tcp.ReceiveBufferSize)
        tcp.Client.Receive(buff)
        Debug.Print(System.Text.Encoding.Default.GetString(buff))
    End Sub
End Class


Bonne prog.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 231
12 nov. 2011 à 20:00
Ah !
banana32
"aussi" = "non plus" ?
Allez : pardonne-moi de rire lorsque j'ai un peu bu (et c'est le cas)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
12 nov. 2011 à 23:10
Ok, merci du code ! Jespère être un jour fort comme toi !
Et pour pouvoir utiliser mon appli en LAN, je dois mettre quoi comme IP car 127.0.0.1 ou localhost en LAN ou même sur internet ... ^^
Merci vraiment pour ton aide en tous cas...
0
Utilisateur anonyme
13 nov. 2011 à 13:47
Fais un essai avec leurs noms DNS ou leurs adresses IP.
0
Utilisateur anonyme
13 nov. 2011 à 17:06
Je vous pas ce que tu veux dire, j'ai essayé avec une IP de même forme qu'une IP de PC LAN, j'ai essayé avec l'IP de lan de ma box avec l'IP externe de ma box mais rien ne marche.
0
Utilisateur anonyme
13 nov. 2011 à 18:13
Sur chaque poste, lance cmd.exe et à l'invite, tape :
ipconfig /all

Le nom de l'hôte de la machine est sur la première ligne en principe.
Tu trouveras également son adresse Ipv4 un peu plus bas.
0
Utilisateur anonyme
13 nov. 2011 à 18:18
Et donc je remplace 127.0.0.1 par mon adresse Ipv4 ?
0
Utilisateur anonyme
13 nov. 2011 à 18:46
Le seul moyen de réaliser ton système est de placer l'application serveur en écoute sur chaque poste. Le client, sur ton poste de commande, va contacter les serveurs distants des autres machines. Et ce serveur exécutera la commande shutdown. (pas si sûr que ça marche d'ailleurs)

Quoi qu'il en soit, il te faudra veiller à "ouvrir" le port concerné (8100) sur les machines de ton réseau. (firewalls, anti-virus etc...)

Peut-être que quelqu'un de plus compétant que moi dans ce domaine pourra prendre mon relais pour la suite. Mon aide s'arrête donc là.

Bonne continuation dans ton projet.
0