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

Threads & Processus C++ Discussion :

Probleme de socket dans un thread


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7
    Par défaut Probleme de socket dans un thread
    Bonjour à tous, j'ai réaliser un petit programme de discution entre une camera et un logiciel par TCP. Les fonctions de connections sont appelées dans un thread qui est lancer par un bouton start. Je réussi la connection, reçoie les données de plusieurs acquisition: c'est à dire qu'entre chaque acquisition je ferme la conncetion puis relance la connection quand la camera envoie les donnée. J'appuie sur le bouton stop, le thread semble s'arreté mais si je rappuis sur le bouton start le program plante. Après un débug j'ai trouvé que la fonction suivante n'attandait plus l'envoie de la socket par la camera (la premiere fois que j'appuis sur start le debug fait une pause sur la fonction accept en attendant la connection de la camera, mais plus une fois que le thread est arreté puis relancer). Si je stop le thread, stop le programme et le relance puis relance une acquisition (bouton start) tout marche bien.
    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
     
    void WComm::waitForClient()
    {
     
                AcceptSocket = accept( m_backup, NULL, NULL );
     
            m_socket = AcceptSocket;
    }
     
    //voila mon constructeur de class et destructeur
     
    WComm::WComm()
    {
     
        // Initialize Winsock.
        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
        if ( iResult != NO_ERROR )
            printf("Error at WSAStartup()\n");
     
        // Create a socket.
        m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
     
        if ( m_socket == INVALID_SOCKET ) {
            printf( "Error at socket(): %ld\n", WSAGetLastError() );
            WSACleanup();
            return;
        }
     
    	m_backup = m_socket;
     
     
    }
    WComm::~WComm(){WSACleanup();}
    Cela vient-il du thread ou de la fonction accept qui est ma réinitialisé?
    Merci de votre aide ça fait deux jour que je bloque j'ai le cerveau qui commence à surchauffer...Juste une petite précision, je programme sous Visual C++.

    Nico

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    normal... tu écrase le m_socket de listening par un autre socket (de transmission) dès la première occurence...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7
    Par défaut
    Tu parle de cette ligne de code la?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AcceptSocket = accept( m_backup, NULL, NULL );
    ou de celle la?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_socket = AcceptSocket;
    Peus tu me donner une piste sur la marche à suivre car je ne vois pas se que je fait de travers et pourquoi je ne doit pas écraser cette variable?

    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7
    Par défaut probleme de thread
    En fait mon thread ne ferme pas la connection quand il s'arrete et mon proc monte à 100% si je relance le thread. La boucle de wait for client tourne à l'infini.
    Comment faire pour arreter toutes les fonction ou dll utilisé par un thread, j'ai implémenté un truc à partir des FAQ mais rien n'y fait....

    merci

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Heu....
    On peu prendre le code ligne par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void WComm::waitForClient()
    {
                AcceptSocket = accept( m_backup, NULL, NULL );
    La variable membre (ou globale 'AcceptSocket' de type SOCKET) contiendra le socket (tunnel) contenant la connection qui est arrivée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            m_socket = AcceptSocket;
    et... on copie le socket dans la variable (membre ?) m_socket.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WComm::WComm()
    {
     
        // Initialize Winsock.
        int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
        if ( iResult != NO_ERROR )
            printf("Error at WSAStartup()\n");
     
        // Create a socket.
        m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    m_socket contient donc le socket "d'écoute"....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        if ( m_socket == INVALID_SOCKET ) {
            printf( "Error at socket(): %ld\n", WSAGetLastError() );
            WSACleanup();
            return;
        }
        m_backup = m_socket;
    Maintenant m_backup contient *aussi* le socket d'écoute...

    Maintenant je ne sais pas ce que fait ton code....
    J'imagine un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WSAComm newComm;
    while (1) {
        newComm.waitForClient();
        newComm.readData();
    }
    Du coup....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WSAComm newComm;
    // ici... newComm.m_backup et newComm.m_socket contiennent le socket d'écoute
    // BOUCLE 1
    newComm.waitForClient();
    // ici... newComm.m_socket contient le socket de connection
    newComm.readData();
    // probablement depuis m_socket
    // BOUCLE 2
    newComm.waitForClient(); // VA FAIRE UN ACCEPT SUR UNE CONNECTION !!!!

    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
     
    class WSAComm
    {
        SOCKET  m_listener;
        SOCKET  m_connection;
        public:
            /** Initialise la communication. */
            void init() { m_listener = socket(...); listen(m_listener); }
            /** Désinitialise la communication. */
            void uninit() { socketclose(m_listener); }
     
            /** Attends un client. */
            void waitForClient() { m_connection = accept(m_listener); }
            /** Lis les données. */
            void readData() { // from m_connection }
            /** Ferme le client. */
            void closeClient() { socketclose(m_connection); }
    };
     
    // avec en utilisation:
    int main()
    {
         WSAComm comm;
         comm.init();
         while (1) {
             comm.waitForClient();
             comm.readData();
             comm.closeClient();
          }
    }

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/04/2011, 10h20
  2. fermeture socket dans un thread
    Par adrien1 dans le forum Débuter
    Réponses: 0
    Dernier message: 20/04/2010, 14h45
  3. probleme avec un Form dans un Thread
    Par cyrille37 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/02/2008, 11h45
  4. [CCom]Probleme avec SendMessage dans le thread
    Par homeostasie dans le forum Visual C++
    Réponses: 7
    Dernier message: 18/06/2007, 16h13
  5. Probleme de passage d'arguments dans un thread
    Par TheBAT dans le forum POSIX
    Réponses: 4
    Dernier message: 05/02/2007, 19h58

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