IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Se connecter a une adresse ip et l'écouter


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut Se connecter a une adresse ip et l'écouter
    Bonjour,

    Pour un projet futur je vais avoir a me brancher a une adresse ip d'une machine industrielle et l'écouter.

    Celle-ci devra me renvoyer des chaines de caractere du style E50321256.

    J'ai l'intention de mettre cela dans un service WCF ou bien un service windows qui va aller se connecter a intervalle régulier sur ces adresse ip pour les écouter.

    Je voudrais donc savoir deux choses :
    1. Je n'ai jamais eu a me connecter a des adresse ip, donc j'aimerais avoir une petite indication sur comment faire pour me connecter a l'adresse ip en question et l'ecouter pour recevoir la chaine de caractère
    2. Est-ce une bonne pratique de mettre cela dans un service Windows?


    Framework 3.5

    Merci d'avance

    P.S

    J ai downloader des tutoriel de programmation réseau sur le forum.
    1. Programation Asyncrone via Socket
    2. Programmation réseau : Remoting

    j'aimerais savoir sur quel tuto m'enligner entre ces deux la ou bien si je suis totalement dans le champs.

    Encore une fois Merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    .net remoting et wcf sont des surcouches de tcp/ip
    .net remoting n'est compatible qu'avec .net remoting
    wcf n'est compatible qu'avec des webservices

    ta machine industrielle fait surement tu tcp/ip classique donc ces classes ne seront pas utiles
    il faudrait voir la doc, mais à priori ta machine sera server, il faut donc te connecter en tant que client, et une fois la connexion tcp faite, les 2 peuvent envoyer des données et en recevoir
    des machines qui ne font qu'envoyer tous les tant de temps ca existe, il te suffira donc de lire les données qui arrivent

    pour te connecter le plus simple est d'utiliser system.net.sockets.tcpclient
    cette classe a des méthodes synchrones bloquantes ou des méthodes asynchrones

    sur un service windows ca conviendra, mais un service ne peut rien afficher à l'écran
    un service nécessite un thread pour survivre, dans lequel tu peux mettre des while true et des montcpclient.receive

    il faudra vérifier le format de la trame

    etc... des tutos et quelques tests devraient suffire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut
    Merci beaucoup,

    Je testerai cela en début de semaine prochaine.

    Cordialement,

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    il faudra vérifier le format de la trame
    Bien prévoir qu'un message peut être reçu en plusieurs "receive" et que plusieurs messages peuvent être reçu en un seul "receive".

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut Que voulez vous dire par format de la trame
    Je crois bien que mon probleme est un probleme de format :

    Mon patron m'a donnée une adresse ip sur un port 23.
    Il me dis que si j'envois un carriage return sur comme message je devrais recevoir login comme message hors je recois plutot un message du style ??#

    Pour faire mon test j'ai utiliser la classe ClientClass du tuto (Fonctions asynchrones et sockets en .NET
    par Lainé Vincent) sur les socket que j'ai trouvé sur ce site.

    J'ai modifier la partie displaymessage pour qu'elle affiche dans la console au lieux d'un listBox

    Client Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    Imports System
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
    Imports System.Windows.Forms
    Public Class ClientClass
        Private SocketClient As Socket
        Private LocalsocketClientIsShutingDown As Boolean
        Private readbuf As Byte()
        Private sendbuf As Byte()
        Private listBox As ListBox
     
        Private Delegate Sub DelegateDisplay(ByVal message As String)
        Private dlgDisplay As DelegateDisplay = New DelegateDisplay(AddressOf DisplayMessage)
     
        Public Sub New(ByVal list As System.Windows.Forms.ListBox)
            Me.listBox = list
            readbuf = New Byte(100) {}
        End Sub
        Public Sub New()
            readbuf = New Byte(100) {}
        End Sub
     
        Public Sub ConnectToServer(ByVal ServerAdress As String)
            If Me.SocketClient Is Nothing OrElse Not Me.SocketClient.Connected Then
                Me.SocketClient = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                Dim ipadress As IPAddress()
                'Dim he As IPHostEntry = Dns.GetHostByName(ServerName)
                ipadress = Dns.GetHostAddresses(ServerAdress)
                'ipadress = he.AddressList
                Me.SocketClient.BeginConnect(New IPEndPoint(ipadress(0), 23), AddressOf ConnectCallback, Me.SocketClient)
            Else
                Dim obj As String() = New String() {"Déjà connecté un serveur"}
                Me.listBox.Invoke(dlgDisplay, obj)
            End If
        End Sub
     
        Private Sub ConnectCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Me.SocketClient = socket
                socket.EndConnect(asyncResult)
                obj = New String() {"Connecté  un serveur"}
                DisplayMessage(obj(0))
                Me.LocalsocketClientIsShutingDown = False
                Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
            Catch ex As SocketException
                obj = New String() {ex.Message}
                Me.listBox.Invoke(dlgDisplay, obj)
            End Try
        End Sub
     
        Public Sub SendMessage(ByVal message As String)
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.sendbuf = Encoding.ASCII.GetBytes(message)
                Me.SocketClient.BeginSend(Me.sendbuf, 0, Me.sendbuf.Length, SocketFlags.None, AddressOf SendCallback, Me.SocketClient)
            Else
                DisplayMessage("Non connecté au serveur.")
            End If
        End Sub
     
        Private Sub SendCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim send As Integer = socket.EndSend(asyncResult)
                obj = New String() {"Message envoyé (" + send.ToString() + " bytes envoyés )"}
                DisplayMessage(obj(0))
            Catch ex As SocketException
                obj = New String() {ex.Message}
                Me.listBox.Invoke(dlgDisplay, obj)
            End Try
        End Sub
     
        Public Sub ReceiveMessage()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                'Me.SocketClient.BeginReceiveMessageFrom(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
            Else
                DisplayMessage("Non connecté au serveur.")
            End If
        End Sub
     
        Private Sub ReceiveCallback(ByVal asyncResult As IAsyncResult)
            Dim obj As String()
            Try
                Dim socket As Socket = CType(asyncResult.AsyncState, Socket)
                Dim read As Integer = socket.EndReceive(asyncResult)
                If read > 0 Then
                    obj = New String() {"Serveur dit :" + Encoding.ASCII.GetString(Me.readbuf)}
                    DisplayMessage(obj(0))
                    Me.SocketClient.BeginReceive(Me.readbuf, 0, Me.readbuf.Length, SocketFlags.None, AddressOf ReceiveCallback, Me.SocketClient)
                End If
                If read = 0 AndAlso Not Me.LocalsocketClientIsShutingDown Then
                    Me.SocketClient.Close()
                    obj = New String() {"Fermeture socket distante"}
                    DisplayMessage(obj(0))
                End If
                Buffer.SetByte(Me.readbuf, 0, 0)
            Catch ex As SocketException
                obj = New String() {ex.Message}
                DisplayMessage(obj(0))
            End Try
        End Sub
     
        Public Sub Close()
            If Not (Me.SocketClient Is Nothing) AndAlso Me.SocketClient.Connected Then
                Me.LocalsocketClientIsShutingDown = True
                Me.SocketClient.Shutdown(SocketShutdown.Both)
                Me.SocketClient.Close()
                Dim obj As String() = New String() {"Connexion fermée"}
                DisplayMessage(obj(0))
            End If
        End Sub
     
        Private Sub DisplayMessage(ByVal message As String)
            'Me.listBox.Items.Add(message)
            'Me.listBox.SelectedIndex = Me.listBox.Items.Count - 1
            Console.WriteLine(message)
        End Sub
    End Class
    Appel de clientClass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Module Module1
        Private c As ClientClass
        Sub Main()
     
            c = New ClientClass()
            c.ConnectToServer("MagicIP.MagicIP.MagicIP.MagicIP")
            c.SendMessage("test" + vbCrLf)
            c.ReceiveMessage()
     
            c.Close()
     End Sub
    Aussi il faut systématiquement que je soit en débug(a coup de F11, F11, etc) de mon appli console pour faire fonctionner sinon il me dis non connecter au server.

    Merci

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par pascalwick Voir le message
    Il me dis que si j'envois un carriage return sur comme message je devrais recevoir login comme message hors je recois plutot un message du style ??#
    Ca, ça respire un truc style "double connectique" avec RS-232C + TCP/IP et transmission sur ASCII 7 Bits avec les bits de parités conservés (inutilement) dans les trames TCP-IP; ou quelque chose d'approchant.

    Donne le message traduit en hexadécimal, on y verra peut être plus clair.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut
    Donc toujours avec le meme code je suis aller ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim hex As String = BitConverter.ToString(Me.readbuf).Replace("-", "")
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim hex As String = BitConverter.ToString(Me.sendbuf).Replace("-", "")
    Ce qui me donne le résultat suivant
    SendBuffer : Message que j'envois en hexa
    746573740D0A
    ReadBuffer : Message que je recois en hexa
    00FD250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    et voici une copie du texte dans la console
    • Connecté au server
    • Serveur dit : ??% (moi je voudrais avoir login)
    • Message envoyé (6 bytes envoyés )
    • Connexion fermée



    Merci

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Plus qu'étrange; même en masquant le bit de poids fort on obtient "}%" ce qui n'aide pas beaucoup.

    Il faudrait voir la doc, là.

    EDIT : par contre, il y un problème avec ton code (à vue de nez, car le VB ça me pique un peu les yeux) : la longueur du buffer n'est pas initialisé.

    Je ne sais même pas comment VB gère ça .....

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut
    J'ai aussi essayé avec cette méthode shared directement prise du msdn et puis j'ai le meme résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Shared Sub Connect(server As [String], message As [String])
            Try
                ' Create a TcpClient.
                ' Note, for this client to work you need to have a TcpServer 
                ' connected to the same address as specified by the server, port
                ' combination.
                Dim port As Int32 = 23
                Dim client As New TcpClient(server, port)
     
                ' Translate the passed message into ASCII and store it as a Byte array.
                Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)
     
                ' Get a client stream for reading and writing.
                '  Stream stream = client.GetStream();
                Dim stream As NetworkStream = client.GetStream()
     
                ' Send the message to the connected TcpServer. 
                stream.Write(data, 0, data.Length)
     
                Console.WriteLine("Sent: {0}", message)
     
                ' Receive the TcpServer.response.
                ' Buffer to store the response bytes.
                data = New [Byte](256) {}
     
                ' String to store the response ASCII representation.
                Dim responseData As [String] = [String].Empty
     
                ' Read the first batch of the TcpServer response bytes.
                Dim bytes As Int32 = stream.Read(data, 0, data.Length)
                responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
                Console.WriteLine("Received: {0}", responseData)
     
                ' Close everything.
                stream.Close()
                client.Close()
            Catch e As ArgumentNullException
                Console.WriteLine("ArgumentNullException: {0}", e)
            Catch e As SocketException
                Console.WriteLine("SocketException: {0}", e)
            End Try
     
            Console.WriteLine(ControlChars.Cr + " Press Enter to continue...")
            Console.Read()
        End Sub 'Connect
    Encore une fois Merci

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Par défaut
    La longueur du read buffer est initialiser dans le constructeur a 100

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub New()
            readbuf = New Byte(100) {}
        End Sub
    petite précision. J'ai vu le terminal qui affiche le mot login: et ceci semble etre un server unix ou linux.

    Cela semble aussi etre le login d'authentification. Peut etre faut-il etre authentifier pour recevoir des résultat.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2011, 12h59
  2. une adresse IP dans un connect ?
    Par webasso dans le forum Installation
    Réponses: 3
    Dernier message: 18/09/2007, 14h38
  3. VB6 Connection à une base de données dont la source est une adresse url
    Par yangoal25 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/11/2006, 18h47
  4. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  5. Réponses: 3
    Dernier message: 22/05/2002, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo