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] Probleme de socket


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Par défaut [VB6] Probleme de socket
    Bonjour,

    Je developpe une petite application qui doit, par l'intermediaire d'une
    liaison ethernet, échanger des fichiers.
    J'utilise ainsi des sockets avec une lecture du fichier juste avant,
    voici mon code source :


    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
    Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" 
    (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal 
    dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal 
    dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, 
    ByVal hTemplateFile As Long) As Long 
     
     
    Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, 
    lpbuffer As Any, ByVal nNumberOfBytesToRead As Long, 
    lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long 
     
     
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As 
    Long) As Long 
     
     
    Public Const FILE_SHARE_READ = &H1 
    Public Const GENERIC_READ = &H80000000 
    Public Const FILE_ATTRIBUTE_NORMAL = &H80 
     
     
    Public Const OPEN_EXISTING = 3 
    Public Const OPEN_ALWAYS = 4 
     
     
    Public Sub MyReadFile(NewFile As String, Taille As Long) 
        Dim sec As SECURITY_ATTRIBUTES 
        Dim h1 As Long 
        Dim ReadBuffer As String 
        Dim BytesRead As Long 
        Dim rc As Long 
        Dim paquet As Long 
        paquet = 1024 
        Dim Nbr_lu As Long 
        Dim CR As Long 
        Dim wsadata As WSA_DATA 
        Dim sock As Long 
        Dim CR1 As Long 
        Dim Result As String 
        Dim Nbr_total As Long 
        Nbr_total = 0 
     
     
        sec.bInheritHandle = True 
        sec.lpSecurityDescriptor = 0 
        sec.nLength = Len(sec) 
     
     
        h1 = CreateFile(NewFile, GENERIC_READ, 0, sec, OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL, 0) 
     
     
    CR = WSAStartup(&H101, wsadata) 
    If CR <> 0 Then 
        MsgBox "Mauvaise version de Winsock.dll" 
        Exit Sub 
    Else: MsgBox ("WSA ok") 
    End If 
     
     
    sock = Socket(AF_INET, SOCK_STREAM, 0) 
    If sock < 0 Then 
       MsgBox "Erreur sur la creation du socket = " & WSAGetLastError() 
       FermerSocket sock 
       Exit Sub 
    End If 
     
     
    rmtserver.sin_family = AF_INET 
    rmtserver.sin_port = htons(8686) 
    rmtserver.sin_addr.S_addr = inet_addr("127.0.0.1") 
    rmtserver.sin_zero(0) = 0 
     
     
    CR = connect(sock, rmtserver, Len(rmtserver)) 
    If CR < 0 Then 
        MsgBox "Erreur sur Connect : " & WSAGetLastError() 
        FermerSocket sock 
        Exit Sub 
    End If 
     
     
    If CR = 0 Then MsgBox ("Connexion ok") 
     
     
    While (Nbr_total < Taille) 
    rc = ReadFile(h1, ReadBuffer, paquet, Nbr_lu, 0) 
    CR1 = send(sock, ReadBuffer, paquet, 0) 
    Nbr_total = Nbr_total + Nbr_lu 
    Wend 
     
     
    CloseHandle (h1) 
     
     
    Result = closesocket(sock) 
    If Result = SOCKET_ERROR Then 
       MsgBox "Erreur sur la fermeture du socket" 
    End If 
    End Sub

    Voyez vous une/des erreur(s) dans mon programme ?
    Est t-il possible de mélanger deux langage de programmation c'est a
    dire de faire un client en VB et un serveur en C++ ?


    Merci de votre aide
    Johnson

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Par défaut
    Salut,

    J'ai moi aussi regarder les sockets sur vb et j'ai essayer de faire un envoye de fichier. Désolé mais je croi que tu te complique un peu la vie lol.
    VB gère les soket avec un composent internet appellé "Microsoft Winsock control" et la c'est assez simple.
    winsock.localport = 1500 ' par exemple
    winsock.listen
    Cela pour le coté serveur
    winsock.connect 127.0.0.1, 1500 pour se connecté en local avec le client

    Pour envoyer des fichier pas mal de methode :
    Soit tu ouvre ton fichier en totalité et tu envoye tout sur le socket distant mais cette methode est lente et surcharge le socket

    ou alors tu envoyer progressivement le fichier dès que le socket distant a fini de recevoir avec les événement winsock_sendcomplet (c'est qqch comme ca) du winsock.

    si tu as d'autre question

    leo

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Par défaut
    En fait, j'ai deja essayé cette méthode mais lorsque j'envoi des données avec Winsock.datasend(buffer) j'ai l'erreur 40006 (avec une erreur de protocol) il me semble que pour utiliser cette méthode on ne peut pas utiliser le TCP et plutot UDP (ou qq chose comme ca non ?)

    Voici mon code source :
    Mon client est en C++ :

    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
    // Declaration de variables
      WSADATA initialisation_win32;  // Variable permettant de récupérer la structure d'information sur l'initialisation
      int erreur;  // Variable permettant de récupérer la valeur de retour des fonctions utilisées
      char buffer[1024];  // Tampon contenant les données reçues ou envoyées
      SOCKET id_de_la_socket;	// Identifiant de la socket
      SOCKET transf_sock;
      SOCKADDR_IN information_sur_la_source;  // Déclaration de la structure des informations lié à l'écoute
      FILE *file2;
      int nbr_recv,i,j;
     
    void main(int argc, char* argv[])
    {
      // Initialisation de Winsock
      erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
     
      // Ouverture d'une Socket
      id_de_la_socket=socket(AF_INET,SOCK_STREAM,0);
     
      //  Lire la socket à une ip et un port d'écoute
      information_sur_la_source.sin_family=AF_INET;    
      information_sur_la_source.sin_addr.s_addr=INADDR_ANY; // Ecoute sur toutes les IP locales
      information_sur_la_source.sin_port=htons(8686); // Ecoute sur le port 8686
     
      erreur=bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source));
      erreur = listen(id_de_la_socket,1);
      printf("\nlisten");
      transf_sock = accept(id_de_la_socket,(struct sockaddr*)&information_sur_la_source.sin_addr,NULL);
      printf("\naccept");
     
      nbr_recv = recv(transf_sock,(char *)buffer,1024,NULL);
      printf("\n nbr_recv = %d", nbr_recv);
     
      file2 = fopen("test","w+");
     
      for(i=0; i<nbr_recv-1; i++)
      {
        fputc((char)buffer[i], file2);
      }
     
      system("pause");
    }

    Pour le serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Essai As Integer
    Dim Essai1 As Integer
    Dim Essai2
    Dim buffer As String
    buffer = "hello world" & vbCrLf
    Winsock1.connect "127.0.0.1", "8686"
    sock_Connect
    Winsock1.SendData (buffer)
    Winsock1.Close
    Hors lorsque j'essaye d'envoyer les données j'ai l'erreur 40006 (erreur de protocole)
    Il y a t'il une erreur dans mon code source client ou serveur ?

    Merci de votre aide
    Johnson

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Par défaut [VB6] Probleme de socket
    Bonjour,

    Je développe une petite application utilisant les sockets mais j'ai
    une erreur qui m'embete un peu (mais tous d'abord voici le morceau de
    code que j'utilise , je vous ai simplement mi la ligne qui me pose des
    problemes)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Déclaration de la fonction 
    Declare Function send Lib "wsock32" (ByVal s As Long, buffer As Any, 
    ByVal length As Long, ByVal flags As Long) As Long 
     
     
    // mon prog principal avec les déclarations des variables 
    Dim sock As Long 
    Dim CR1 As Long 
    Dim Buffer_ack(4) As String 
     
     
    CR1 = send(sock, Buffer_ack, 4, 0)

    Alors mon probleme est qu'il n'accepte pas d'envoyer un tableau ?
    il me met une erreur concernant un mauvais type de variable...

    Je pense que l'erreur vient tu fait que je n'ai pas mi les () aprés
    buffer dans la déclaration de la fonction mais je voudrais avoir une
    fonction qui me permette d'envoyer tous types de données (tableau,
    string...)
    Est ce possible ?


    ou faut t'il que je crée une autre fonction send1 par exemple avec le
    protoype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Declare Function send1 Lib "wsock32" (ByVal s As Long, buffer() As Any, 
    ByVal length As Long, ByVal flags As Long) As Long

    Ainsi je garde send pour envoyer des variables de type string et je
    prend send1 pour envoyer des tableaux.


    Qu'en pensez vous ?
    Connaissez vous un autre moyen ?
    Ma solution proposée est t'elle bonne ?

    Merci
    Johnson

  5. #5
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    1. N'ouvre pas une nouvelle discussion alors que tu en as déjà une sur ce sujet. J'ai fusionné les 2.
    2. Utilise les balises [code]. Je l'ai fait pour toi les autres fois. A toi maintenant.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 256
    Par défaut
    Oh merci !

Discussions similaires

  1. Direct8X/Direct3D sous VB6, probleme de récup d'animations
    Par John Blobsmith dans le forum DirectX
    Réponses: 3
    Dernier message: 28/04/2004, 10h32
  2. [VB6]Problème de fonction
    Par mustang-ffw02 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/03/2004, 15h09
  3. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36
  4. [VB6] Problèmes avec ListView
    Par FlopErik dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/03/2003, 16h33
  5. [VB6] Problème d'addition de dates et de nombres
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/11/2002, 21h12

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