SendData, GetData avec Winsock VB6

Signaler
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010
-
cs_booba27100
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010
-
Bonjour, j'ai un soucis au niveau de winsock pour les applications client - serveur.

Client :

Private Sub Command3_Click()
WS.SendData "cmd1" 'envoie la commande cmd1 au serveur
End Sub


Serveur :

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Dim data As String

Call WS.GetData(data, vbString) 'recois la commande envoyée par le client
If data = "cmd1" Then 

Call Cmd1 'appel de la fonction Cmd1
text1.Text = Cmd1 'affichage de la fonction Cmd1 dans text1.text sur le serveur

End If
End Sub



Mon probleme, c'est que j'aimerais qu'il me renvoie le resultat de la fonction Cmd1 (serveur) dans un textbox (client)

Je crois qu'il faut utiliser Getdata mais pas sur ! Si quelqu'un pouvait me mettre un tuto, aide !

Merci beaucoup

11 réponses

Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
24
Salut,

Quel est ton problème avec le code ci-dessus ? Il ne fonctionne pas ?

Tu rencontre un message d'erreur ?

Es-tu sûr que les sockets son connectés entre-eux ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010

En fait :

PC1 -> envoie une commande au PC2

PC2 -> exécute la commande

Et je veux que le PC2 retourne le resultat de la commande au PC1



Je me fais comprendre ou pas du tout ?
Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
24
Le serveur et le client sont composé tous deux de winsock, a ce titre, une fois connectés, les deux peuvent émettre et recevoir.

Lors ce que ton serveur à terminé l'exécution de sa fonction, utilise la fonction 'SendData' du winsock serveur pour envoyer le résultat à ton client.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
24
Autre chose,

Call Cmd1 'appel de la fonction Cmd1
text1.Text = Cmd1 'affichage de la fonction Cmd1 dans text1.text sur le serveur


Pas besoin d'appeler 2 fois ta fonction.

Call Cmd1

Va appelé ta fonction mais aucun résultat ne sera retourné, de ce fait ta fonction s'exécute pour rien.

text1.Text = Cmd1 'affichage de la fonction Cmd1 dans text1.text sur le serveur

Cette ligne exécutera ta fonction et placera le résultat dans ton textbox 'text1'.

C'est cette valeur que tu souhaites envoyer ?

Dans ces cas la il te suffit de faire :

Call WS.SendData(Text1.Text)


Tu peux aussi envoyer le résutat dirrectement sans passer par un textbox

Call WS.SendData(Cmd1)


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
tentes :

WS.SendData "cmd1" & vbCrLf



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010

Vos solutions fonctionnent ! Le soucis, c'est que :

Le serveur me renvoie pas le resultat de la fonction au client

Le client envoie une demande d'exécution au client ( fonction cmd1 )

Le serveur exécute la demande, et affiche le resultat de la fonction Cmd1 dans Text1.Text


Je veux maintenant que le serveur renvoie le resultat de la fonction Cmd1 affiché dans le Text1.Text, au client dans un client.Text par exemple.
Messages postés
2811
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
26 novembre 2013
24
Je veux maintenant que le serveur renvoie le resultat de la fonction Cmd1 affiché dans le Text1.Text, au client dans un client.Text par exemple.


Tu es sûr d'avoir lu ma réponse ?


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
on ne dois vraiment pas se comprendre...

je tentes de reposer le probleme:

A envoie la donnée "CMD1" à B
B execute la procédure demandée, Cmd1
B renvoie la réponse à A
A affiche ce résultat dans une zone de Texte

Donc, dans ton client, places un Winsock, nommé WS
un bouton de commande nommé Command1
une zone de texte nommée Text1 :
Option Explicit

'# Chargement de la form cliente
Private Sub Form_Load()
    Command1.Enabled = False
    '# Un seul Winsock est requis ici, pas de groupe de controles, donc
    '# On demande la connection au port 456
    WS.Connect "127.0.0.1", 456
End Sub

Private Sub Command1_Click()
    '# Envoi de la requete
    WS.SendData "WinDir"
End Sub

Private Sub WS_Close()
    '# Le serveur a fermé la connection, on grise le bouton d'envoi de la requete
    WS.Close
    Command1.Enabled = False
End Sub

Private Sub WS_Connect()
    '# Le serveur a accepté notre demande de connection, on active le bouton de requete
    Command1.Enabled = True
End Sub

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Dim sBuffer As String
Dim sQuery As String
Dim sAnswer As String
Dim nPos As Long
    '# Reception de données
    WS.GetData sBuffer, vbString, bytesTotal
    nPos = InStr(sBuffer, "|")
    If nPos Then
        '# On sépare la requete et la reponse
        sQuery = Left$(sBuffer, nPos - 1)
        sAnswer = Mid$(sBuffer, nPos + 1)
        Select Case sQuery
            Case "WinDir"
                '# Il s'agit là de notre réponse a la demande WinDir formulée...
                Text1.Text = sAnswer
        End Select
    End If
End Sub



Dans la Form Serveur, places un Winsock nommé WS, donne lui l'Index 0 (TRES IMPORTANT)

et ajoutes :
Option Explicit

'# Chargement de la form serveur
'# Nous allons écouter le port 456 à l'aide du Winsock dont l'index est 0
Private Sub Form_Load()
    WS(0).LocalPort = 456
    WS(0).Listen
End Sub

Private Sub WS_Close(Index As Integer)
    WS(Index).Close
    '# S'il s'agit du dernier contrôle du groupe, on le décharge
    If Index > 0 And Index = WS.UBound Then
        Unload WS(Index)
    End If
End Sub

Private Sub WS_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long
    '# On parcours la liste des Winsock
    For i = 1 To WS.UBound
        '# Celui-ci est libre ? très bien, il gèrera le dialogue avec notre nouveau client
        If WS(i).State = sckClosed Then
            WS(i).Accept requestID
            Exit Function
        End If
    Next
    '# Aucun controle libre n'ayant été trouvé, nous en créons un nouveau, pour notre client
    Load WS(i)
    WS(i).Accept requestID
End Sub

Private Sub WS_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim sQuery As String
Dim sAnswer As String
    '# On récupère la ligne de requete
    WS(Index).GetData sQuery, vbString, bytesTotal
    '# En fonction de l'information demandées
    Select Case sQuery
        Case "WinDir"
            '# On renseigne la variable sAnswer
            '# Ici, un bête exemple, le client peu demander le chemin du repertoire Windows
            sAnswer = Environ$("WINDIR")
    End Select
    '# On renvoie la requete et la réponse
    WS(Index).SendData sQuery & "|" & sAnswer
End Sub




Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010

Ca marche ! Je vais étudier un peu plus ton code pour l'adapter au mien ! Sinon
Exit Function
dans le serveur m'affiche une erreur, je l'ai juste mit en commentaire pour delete l'erreur.

Autre question : a quoi sert l'index 0 ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
Exit Function ?
devrait être un Exit Sub, faut a un copier coller ...
VB aurait du me le transformer.... bref.

ne le met pas en commentaire, ce serait une erreur, remet un Exit Sub

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
40
Date d'inscription
mercredi 27 décembre 2000
Statut
Membre
Dernière intervention
1 octobre 2010

D'accord, c'est fait =)