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

WinDev Discussion :

Problème : Socket et thread (communication automate) [WD16]


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut Problème : Socket et thread (communication automate)
    Bonjour ,

    Je suis actuellement entrain de concevoir une application pour pouvoir établir une connexion avec un scanner relié en réseau tcp/ip et afin de pouvoir récupérer des codes barres scanner.

    J'utilise donc les sockets et thread pour réaliser se projet.
    Mon scanner par défaut utilise un port : "2001" et une adresse IP : "192.168.1.118".

    Le problème c'est que je voudrais créer une socket serveur qui serait mon scanner.
    Mais lorsque je crée cette socket avec les adresses ip et port nécessaire, il me renvoie un code d'erreur (wsaeaddrnotavail).


    Ma première étape serait de pouvoir créer la socket permettant une connexion entre mon poste et le scanner (serveur).

    Je vous fourni mon code, pouvaient vous m'éclairer svp.


    CODES Serveur :

    CServeur est une classe
    PUBLIC
    sNameSocket est une chaîne
    iport est un entier
    nbClient est un entiers
    sEtatServeur est une chaîne
    sEtatEnvoie est une chaîne
    sCanal est une chaîne
    sinfo est une chaîne
    sip est une chaîne
    FIN

    //Création du socket
    PROCEDURE PUBLIC CreeServer(sIdSocket,idport)
    :sNameSocket=sIdSocket
    :iport=idport
    :sip = "192.168.1.118" "ip du scanner"
    sIpTest est une chaîne = NetAdresseIP() //""Marche avec l'ip du poste""

    Trace("Socket " ,:sNameSocket)
    SI SocketCrée(:sNameSocket,:iport,:sip) = Faux ALORS
    Erreur("Erreur création " + ErreurInfo(errMessage))
    :sEtatServeur="Serveur Eteint ! "
    SINON
    :sEtatServeur="Serveur Démarré ! "
    ThreadExécute("Thread1", threadNormal,Accepte)

    Trace("Thread 1 exécuté")
    Trace("Etat connexion server : ",:sEtatServeur)



    //Acepte les connexions côtés Client
    PROCEDURE PUBLIC Accepte()

    BOUCLE
    Trace("Attente-Connexion ------>")

    SI SocketAttendConnexion(:sNameSocket,4000) ALORS
    Trace("Demande du Client")
    // Si la connexion est acceptée, la gestion de cette connexion est réalisée dans un thread spécifique
    :sCanal = SocketAccepte(:sNameSocket)
    ThreadExécute("Thread2"+DonneIdentifiant(), threadNormal, GereConnectClient) //Permet d'établir le lien avec le client
    :nbClient++
    FIN
    Trace("Tread 1 ok ET nbClientEnCour ->",nbClient)
    ThreadPause(100)
    FIN
    FIN

    //Si connexion établie et accepter on gères les connexion :

    PROCEDURE PUBLIC GereConnectClient() //Lecture / Ecriture des échanges!
    bTest est un booléen
    BOUCLE
    bTest = Faux

    SI(:sinfo<> "")ALORS
    SI PAS SocketEcrit(:sCanal,:sinfo) ALORS
    :sEtatEnvoie="Le message n'a pas était transmis"
    SINON
    :sEtatEnvoie="Le message à étais transmis avec succès"
    bTest=Vrai
    :sinfo=""
    FIN
    FIN
    ThreadPause(200)
    Trace("Thread 2 OK")
    Trace("Envoie Donnée",bTest)
    FIN
    // + méthode déconnecter serveur..
    CODES Client:

    Cclient est une classe
    PUBLIC
    sNameSocketClient est une chaîne
    iport est un entiers
    sdonne est une chaîne
    sEtatConnect est une chaîne
    sEtatEchange est une chaîne
    sip est une chaîne
    FIN

    //Connexion géré dans un thread
    PROCEDURE Connecter()

    ThreadExécute("Threadc1",threadNormal,GereConnexion)

    //Gerer les connexion entre le client et le serveur
    PROCEDURE PUBLIC GereConnexion()

    //:sIp = NetAdresseIP() //Adresse Ip clientt : "192.168.1.98"
    sIptest est une chaîne = "192.168.1.118"

    BOUCLE
    SI PAS(SocketExiste(:sNameSocketClient))ALORS
    SI PAS SocketConnecte(:sNameSocketClient,:iport,sIptest) ALORS
    Erreur("erreur de connexion au server " + ErreurInfo(errMessage))
    :sEtatConnect="Connexion refusé ! "
    SINON
    :sEtatConnect="Connexion établi"
    FIN
    SINON
    DonneeLecture()
    FIN
    Trace("Thread C 1 OK ")
    ThreadPause(100)
    FIN

    //Lecture des échange entre le client et serveur
    PROCEDURE PUBLIC DonneeLecture()

    :sdonne = SocketLit(:sNameSocketClient,Faux,20)

    SI :sdonne <> "" ALORS
    ListeAjoute(FEN_mere.LISTE_cb,:sdonne)
    sEtatEchange="Donnèe reçu"
    SINON
    sEtatEchange="Donnèe non reçu"
    FIN

    +méthode déconnecter
    ...
    Test de l'application

    L'utilisation de c'est code sont gérer global à la fenêtre et utiliser dans des champ de saisie et bouton...

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 445
    Par défaut
    Bonjour,
    Je ne comprends pas pourquoi tu crées un socket serveur, surtout avec l'adresse IP de ton scanner.
    Vu que tu veux te connecter à un équipement réseau, tu n'as besoin que du socket client.

    Tatayo.

  3. #3
    Membre actif
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut
    Comment peux tu créer un canal de communication entre le clients et le scanner si tu créer seulement un stocket client??

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 445
    Par défaut
    C'est simple: le socket client se connecte au socket serveur.
    Si tu crées un socket client ET un socket serveur sur le même poste, tu vas connecter le poste en question à lui-même, et non au scanner...

    Dans ton cas la partie "serveur" se trouve sur le scanner, tu n'as besoin que de la partie cliente.

    Tatayo.

  5. #5
    Membre actif
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut Socket
    Dans ces cas là, comment se connecter au socket server? et comment le trouver?

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 445
    Par défaut
    Le "socket serveur" est sur le scanner !
    Ton scanner est sur le réseau, et tu veux t'y connecter sur le port 2001.
    Donc tu dois créer un socket client qui va se connecter à l'adresse de ton scanner (192.168.1.118) sur le port 2001.

    Tatayo.

  7. #7
    Membre actif
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Par défaut Socket et thread
    Voici ma méthode de créer seulement un socket Client


    Cclient est une classe
    PUBLIC
    sNameSocket est une chaîne
    iport est un entiers
    sip est une chaîne
    sdonne est une chaîne
    sinfo est une chaîne
    sEtatServeur est une chaîne
    sEtatConnect est une chaîne
    sEtatEchange est une chaîne
    sEtatEnvoie est une chaîne
    scanal est une chaîne
    nbClient est un entier

    //VERIFICATION CREATION ET ECOUTE SERVER
    bServCreer est un booléen
    FIN

    //CRÉATION DU SOCKET CLIENT
    PROCEDURE CreeServer(sIdSocket,idport)
    :sNameSocket=sIdSocket
    :iport=idport
    :sip =NetAdresseIP() // "192.168.1.118"

    Trace("Socket " ,:sNameSocket)
    SI SocketCrée(:sNameSocket,:iport,:sip) = Faux ALORS
    Erreur("Erreur création " + ErreurInfo(errMessage))
    :sEtatServeur="Serveur Eteint ! "
    bServCreer=Faux
    SINON
    SI SocketChangeModeTransmission(:sNameSocket, SocketSansMarqueurFin)= Vrai ALORS
    :sEtatServeur="Serveur Démarré ! "
    bServCreer=Vrai
    ThreadExécute("Thread1", threadNormal,Accepte)

    Trace("Thread 1 exécuté")
    Trace("Etat connexion server : ",:sEtatServeur)
    FIN
    FIN

    //ATTENTE DE LA CONNEXION AU SERVEUR
    PROCEDURE Accepte()
    BOUCLE
    Trace("Attente-Connexion ------>")

    //JE NE PASSE PAS DANS SocketAttendConnexion DONC MON CANAL N AIT PAS CREER
    SI SocketAttendConnexion(:sNameSocket,4000) ALORS
    Trace("Demande du Client")
    // Si la connexion est acceptée, la gestion de cette connexion est réalisée dans un thread spécifique
    :scanal = SocketAccepte(:sNameSocket)
    :nbClient++
    FIN
    Trace("Tread 1 ok ET nbClientEnCour ->",nbClient)
    Trace("Canal ------> ",:scanal)
    ThreadPause(200)
    FIN

    //CONNEXION LANCER DANS UN THREAD
    PROCEDURE Connecter()
    SI(:bServCreer) ALORS
    ThreadExécute("Threadc1",threadNormal,GereConnexion)
    FIN


    //CONNEXION AU SERVEUR
    PROCEDURE GereConnexion()

    //:sIp = NetAdresseIP() //Adresse Ip clientt : "192.168.1.98"
    sIptest est une chaîne = "192.168.1.118"
    iPorttest est une entier = 2001

    BOUCLE

    SI PAS(SocketExiste(:sNameSocket))ALORS
    SI PAS SocketConnecte(:sNameSocket,iPorttest,sIptest) ALORS
    Erreur("erreur de connexion au server " + ErreurInfo(errMessage))
    :sEtatConnect="Connexion refusé ! "
    SINON
    :sEtatConnect="Connexion établi"
    FIN
    SINON
    DonneeLecture()
    FIN
    Trace("Thread C 1 OK ")
    Trace("Etat-Connect",:sEtatConnect)
    ThreadPause(200)
    FIN

    //LECTURE DES DONNES DE LA SOCKET SERVEUR
    PROCEDURE DonneeLecture()


    TANTQUE(:scanal<>"")
    :sdonne = SocketLit(:scanal ,Faux,20)
    FIN

    SI :sdonne <> "" ALORS
    ListeAjoute(FEN_mere.LISTE_cb,:sdonne)
    sEtatEchange="Donnèe reçu"
    SINON
    sEtatEchange="Donnèe non reçu"
    FIN
    Trace("canal lecture ===",:scanal)
    Trace("Données ===",:sdonne)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/04/2011, 01h30
  2. [Linux] Problème Socket + Thread
    Par PoZZyX dans le forum Réseau
    Réponses: 0
    Dernier message: 25/03/2010, 15h06
  3. Problème de conception Thread et Socket
    Par NeqO55 dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 15/10/2009, 09h57
  4. problème socket et thread
    Par dc.sara dans le forum C
    Réponses: 2
    Dernier message: 12/03/2008, 07h58
  5. Sockets et threads...
    Par Kiff dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 27/07/2004, 17h35

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