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 6 et antérieur Discussion :

[VB6] Reseau LAN: Server VB6, Client Java.


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut [VB6] Reseau LAN: Server VB6, Client Java.
    Bonjour,

    j'aurais besoin de créer un réseau LAN entre un serveur codé en VB6 et un client codé en Java.

    coté matériel: il s'agit de 2 PC différents, Windows XP, reliés par un câble Ethernet. En utilisant uniquement Java, j'ai pu facilement monter le réseau, en créant un "socket client" sur le PC client et un "socket server" sur le PC serveur. Une fois la connexion effectuée, le client écoute le serveur et réceptionne ce que le serveur envoie. le serveur lui ne fait qu'envoyer des données.

    Mon but est de transcrire la partie serveur en VB6 et de conserver la partie client en java. Le serveur VB6 sera utilisé pour envoyer des chaines de caractères au client java qui exécutera différentes procédures (= méthodes codées en java) selon le contenu de la chaine de caractères réceptionnée...

    Le code VB6 sera écrit intégralement dans un module d'un activeX DLL, j'ai trouvé des exemples de codes dans l'api guide en recherchant "socket", ça ne m'a pas beaucoup éclairé.

    Ensuite sur internet en tapant winSock j'ai trouve ce code :

    Module 1
    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
    Option Explicit
     
    Public Const SOCKET_ERROR = -1
    Public Const AF_INET = 2
    Public Const PF_INET = AF_INET
    Public Const MAXGETHOSTSTRUCT = 1024
    Public Const SOCK_STREAM = 1
    Public Const MSG_PEEK = 2
     
    Public Type SockAddr
        sin_family As Integer
        sin_port As Integer
        sin_addr As String * 4
        sin_zero As String * 8
    End Type
     
    Public Type T_WSA
        wVersion As Integer
        wHighVersion As Integer
        szDescription(0 To 255) As Byte
        szSystemStatus(0 To 128) As Byte
        iMaxSockets As Integer
        iMaxUdpDg As Integer
        lpVendorInfo As Long
    End Type
     
    Public WSAData As T_WSA
     
    Public Type Inet_Address
        Byte4 As String * 1
        Byte3 As String * 1
        Byte2 As String * 1
        Byte1 As String * 1
    End Type
     
    Public IPStruct As Inet_Address
     
    Public Type T_Host
        h_name As Long
        h_aliases As Long
        h_addrtype As Integer
        h_length As Integer
        h_addr_list As Long
    End Type
     
    ' KERNEL32.DLL funtions
    Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb&)
     
    ' WSOCK32.DLL functions
    Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal addr_len As Long, ByVal addr_type As Long) As Long
    Declare Function inet_addr Lib "wsock32.dll" (ByVal addr As String) As Long
    Declare Function GetHostByName Lib "wsock32.dll" Alias "gethostbyname" (ByVal HostName As String) As Long
    Declare Function GetHostName Lib "wsock32.dll" Alias "gethostname" (ByVal HostName As String, HostLen As Long) As Long
    Declare Function WSAStartup Lib "wsock32.dll" (ByVal a As Long, b As T_WSA) As Long
    Declare Function WSACleanUp Lib "wsock32.dll" Alias "WSACleanup" () As Integer
    Declare Function Socket Lib "wsock32.dll" Alias "socket" (ByVal afinet As Integer, ByVal socktype As Integer, ByVal protocol As Integer) As Long
    Declare Function ConnectWinsock Lib "wsock32.dll" Alias "connect" (ByVal sock As Long, sockstruct As SockAddr, ByVal structlen As Integer) As Integer
    Declare Function send Lib "wsock32.dll" (ByVal sock As Long, ByVal msg As String, ByVal msglen As Integer, ByVal flag As Integer) As Integer
    Declare Function recv Lib "wsock32.dll" (ByVal sock As Long, ByVal msg As String, ByVal msglen As Integer, ByVal flag As Integer) As Integer
    Declare Function htonl Lib "wsock32.dll" (ByVal a As Long) As Long
    Declare Function ntohl Lib "wsock32.dll" (ByVal a As Long) As Long
    Declare Function htons Lib "wsock32.dll" (ByVal a As Integer) As Integer
    Declare Function ntohs Lib "wsock32.dll" (ByVal a As Integer) As Integer
    Declare Function closesocket Lib "wsock32.dll" (ByVal sn As Long) As Integer
    Module2:
    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
     
    Function HostByName(sHost As String) As String
        Dim s As String
        Dim p As Long
        Dim Host As T_Host
        Dim ListAddress As Long
        Dim ListAddr As Long
        Dim Address As Long
     
        s = String(64, 0)
        sHost = sHost + Right(s, 64 - Len(sHost))
        p = GetHostByName(sHost)
        If p = SOCKET_ERROR Then
            Exit Function
        Else
            If p <> 0 Then
                CopyMemory Host.h_name, ByVal p, Len(Host)
                ListAddress = Host.h_addr_list
                CopyMemory ListAddr, ByVal ListAddress, 4
                CopyMemory Address, ByVal ListAddr, 4
                HostByName = InetAddrLongToString(Address)
            Else
                HostByName = "No DNS Entry"
            End If
        End If
    End Function
     
    Private Function InetAddrStringToLong(Address As String) As Long
        InetAddrStringToLong = inet_addr(Address)
    End Function
     
    Private Function InetAddrLongToString(Address As Long) As String
        CopyMemory IPStruct, Address, 4
        InetAddrLongToString = CStr(Asc(IPStruct.Byte4)) + "." + CStr(Asc(IPStruct.Byte3)) + "." + CStr(Asc(IPStruct.Byte2)) + "." +   CStr(Asc(IPStruct.Byte1))
    End Function
     
    Function HostByAddress(ByVal sAddress As String) As String
        Dim lAddress As Long
        Dim p As Long
        Dim HostName As String
        Dim Host As T_Host
     
        lAddress = inet_addr(sAddress)
        p = gethostbyaddr(lAddress, 4, PF_INET)
        If p <> 0 Then
            CopyMemory Host, ByVal p, Len(Host)
            HostName = String(256, 0)
            CopyMemory ByVal HostName, ByVal Host.h_name, 256
            If HostName = "" Then HostByAddress = "Unable to Resolve Address"
            HostByAddress = Left(HostName, InStr(HostName, Chr(0)) - 1)
        Else
            HostByAddress = "No DNS Entry"
        End If
    End Function
     
    Private Function ResolveHost(sHost As String) As Long
        Dim lAddress As Long
     
        lAddress = InetAddrStringToLong(sHost)
        If lAddress = SOCKET_ERROR Then
            ResolveHost = inet_addr(HostByName(sHost))
        Else
            ResolveHost = lAddress
        End If
    End Function
     
    Public Function WinsockConnect(ByVal m_RemoteHost As String, m_RemotePort As Long, iSocket As Long) As Boolean
        Dim sock As SockAddr
        Dim sRemoteIP As String
        Dim x As Long
        Dim bAddr(0 To 3) As Byte
        Dim i As Integer
     
        iSocket = Socket(AF_INET, SOCK_STREAM, 0)
        If iSocket < 1 Then
            WinsockConnect = False
            Exit Function
        End If
        sRemoteIP = ""
        sock.sin_family = AF_INET
        x = ResolveHost(m_RemoteHost)
        CopyMemory bAddr(0), x, 4
        For i = 0 To 3
            sRemoteIP = sRemoteIP & Chr(bAddr(i))
        Next
        sock.sin_addr = sRemoteIP
        sock.sin_port = htons(m_RemotePort)
        sock.sin_zero = String(8, 0)
        If ConnectWinsock(iSocket, sock, Len(sock)) Then
            WinsockConnect = False
            Exit Function
        End If
        WinsockConnect = True
    End Function
     
    Public Sub WinsockInit()
        WSAStartup &H101, WSAData
    End Sub
    mais je n'ai pas réussi a l'adapter pour créer mon "Socket server" en VB...Il me semble d'ailleurs que le code ci dessous correspond a un client plus qu'a un serveur, n'est-ce pas?

    J'ai jeté un œil aux tutoriels de créations de chat en ligne sur developpez.com, ils utilisent les winSock dans des "Form" (formulaire je présume) mais je n'arrive pas a intégrer ça a mon activeX DLL (il faut dire qu'il est teigneux le bougre...)

    Sauriez vous m'aider?
    Merci d'avance pour vos réponses.

    Remy.

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Il me semble que les Winsock permettent d'arriver a une solution, aussi je précise ci-dessous en quoi leur utilisation me pose probleme:

    1/ J'ai bien ajouté le composant Winsock dans mon projet (menu: projet->components->Microsoft Winsock control 6.0), pas de soucis jusqu'ici.

    2/ le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim ws As Winsock
    ws.localPort = 100
    génère l'erreur suivante:
    Object variable or With block variable not set
    en fait tous les appels génèrent la meme erreur...

    Merci pour vos réponses.
    Remy.

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim ws As Winsock
    Set ws = New Winsock
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  4. #4
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Heu, pourquoi ne pas déposer un controle winsock sur ta feuille. tout simplment.
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup pour vos reponses,

    Thierry, effectivement l'objet winsock n'était pas initialisé,
    le code suivant permet de s'en rendre compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Test()
        Dim ws As Winsock
        If ws Is Nothing Then
            MsgBox "NOTHING"
        End If
    End Function
    cependant, aucune des deux suggestions que tu m'as proposé ne compile.

    Les codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function Test()
        Dim ws As Winsock
        Set ws = New Winsock
    End Function
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function Test()
        Dim ws As New Winsock
    End Function
    génèrent l'erreur suivante:
    Invalide use of New keyword
    dans les deux cas c'est la partie du code qui est surlignée par le compilateur...

    Lorsque j'écris un New dans mon module, un menu déroulant s'ouvre me proposant des choix comme Collection, ErrObject, Global, ... mais pas Winsock. Pourtant lorsque j'écris Dim ws As le choix Winsock est bien présent...

    Sauriez vous me dire ce qui ne va pas?

    Delbeke, est il possible de faire ceci dans un activeX dLL? le programme que je code sera compilé en DLL et executé par le logiciel Metamorph (logiciel de traitement d'image et de control de materiel de laboratoire comme microscpoe, camera, lumiere fluorescente, XYZ motorized stages, ... ).
    Si c'est possible, merci de me tuyauuter sur la marche a suivrre.

    Comme vous l'avez remarqué je sais a peine me servir de ce langage , il m'est imposé par le fait qu'il est le seul capable de rendre le logiciel Metamorph programmable.

    Merci d'avance pour vos réponses.

  6. #6
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Je vois pas ce qui pourrait l'empecher.
    Dans ton projet activeX, tu ajoutes une feuille avec sa propriété visible = false et tu y déposes un controle Winsock. Finalement, tu ajoutes le code adequat pour répondre aux événements.
    Heu, une question cependant, pourqoui veux tu absolument que le serveur soit une dll activex ? Pourquoi pas un exe simple?
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse,

    1/pourquoi pas un exe au lieu du DLL: parce que je n'ai pas le choix, Metamorph permet d'exécuter du code VB compilé en DLL (en DLL uniquement). Je veux controler Metamorph afin de pouvoir utiliser ses fonctions dans un processus automatisé d'acquisition et de traitement d'image.

    2/Ca n'a pas resolu mon probleme: j'ai crée un fichier Form1.frm, et j'y ais écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Dim ws As Winsock
     
    Public Function Test()
        ws.LocalPort = 100
    End Function
    En appelant ma fonction Form1.Test, je retombe sur l'erreur
    Object variable or With block variable not set
    et en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Dim ws As New Winsock
     
    Public Function Test()
        ws.LocalPort = 100
    End Function
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Dim ws As Winsock
     
    Public Function Test()
        Set ws = New Winsock
        ws.LocalPort = 100
    End Function
    je retombe sur l'erreur
    Invalide use of New keyword

    c’est quand meme bizarre et assez embetant que je ne puisse pas initialiser ces controles directements, j'ai le meme probleme avec les controles MSComm que je souhaite utiliser pour commander un controleur...

    Je vous joins les 2 pages du manuel d'utilisation de Metamorph qui expliquent comment creer le projet ActiveX DLL, j'ai suivi a la lettre ce "tutoriel" pour créer le projet, ensuite j'y ais ajouté des modules qui contiennent mes programmes de traitement d'image. Il me reste a ajouter le module "Network LAN" qui utilisera les controles Winsock, et le module "RS232Control" qui utilisera des controles MSComm...

    Merci de m'aider si vous voyez une solution.
    Images attachées Images attachées   

  8. #8
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Si on utilise la techique du controle winsock, pas d'initialisation par programme. On dépose un controle winsock sur la form , c'est tout.
    Comme tu veux un serveur. il faut commencer par mettre le controle en ecoute. Ceci peut être fait au chargement de la feuille.
    Ce qui donnerait un code comme le suivant

    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
     
    Option Explicit
     
    Private Sub Form_Load()
      Winsock1.LocalPort = 100
      Winsock1.Listen
    End Sub
     
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
      Winsock1.Close
      Winsock1.Accept requestID
    End Sub
     
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
      Dim Buffer As String
      Winsock1.GetData Buffer
      If InStr(LCase(Buffer), "quit") Then
        Winsock1.SendData "Bye"
        Winsock1.Close
        Winsock1.Listen
      Else
        Winsock1.SendData "Ok"
      End
    End Sub
    (je l'ai écrit à la volée et pas été testé.)
    En général, on ne demande de conseils que pour ne pas les suivre ou, si on les a suivis, reprocher à quelqu'un de les avoir donnés
    (ALEXANDRE DUMAS)

    N'hésitez pas à visiter ma page de contributions

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Merci pour tes conseils, je vais essayer lundi matin

    juste pour préciser:

    1/déposer un controle winsock dans le .form revient à:
    aller dans: Projet->Composants puis cocher Microsoft Winsock control 6
    Je ne me trompe pas?

    2/Dans ton exemple de code, je ne vois pas où tu définis que la variable
    winsock1
    contient un objet Winsock.
    Il faut bien écrire un
    Dim winsock1 As Winsock
    ou
    Private winsock1 As Winsock
    quelque part non?

    Si oui j'ai bien peur d'avoir déjà essayé (cf précédent message)

    Quoi qu'il en soit, je retente le coup demain matin, comme je suis a Tokyo il y a 8h de décalage mais je vous tiendrai informé. Merci pour vos messages.

    Rémy.

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    non,

    Il s'agit de déposer le contrôle sur ta form ...


    http://grafikm.developpez.com/vbreseau/Lecon1/

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Ça marche à présent merci à tous pour votre aide et pour votre temps
    Rémy A.

  12. #12
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    et elles sont comment les Tokyoïtes ?? désolé .....
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion à IOM server depuis client java en sso
    Par cscerim3 dans le forum Administration et Installation
    Réponses: 0
    Dernier message: 10/07/2013, 10h01
  2. probleme d'application client-serveur en vb6 et SQL server
    Par maxtin dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/08/2006, 14h19
  3. [VB6] [Réseau] Connexion et partage de données
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/10/2002, 18h12

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