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

Discussion: Winsock2 et pthread

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    juin 2012
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2012
    Messages : 250
    Points : 316
    Points
    316

    Par défaut Winsock2 et pthread

    Bonjour,

    J’ai une fonction appelée par un thread qui écoute et attends une connexion client.
    La fonction est bloquée par accept() .

    A la première fois tout se passe bien mais lorsque l’attente est trop longue : je tue le thread pour le redémarrer plus tard.
    Les nouveaux threads débutent bien mais on ne réalise plus le listen ni l’attente client.
    J’imagine que c’est parce que la socket n’a pas été fermée proprement et que j’ai alors un INVALID_SOCKET ou un SOCKET_ERROR.
    Est-ce bien cela ?
    Merci pour vos réponses et si vous pouvez me proposer une solution de contournement.

    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
    void * fn_Rxc(void * p_data)        // Serveur
    {
        printf("Début tread Rx \n");
        WSADATA wsa;
        WSAStartup(MAKEWORD(2,0),&wsa);
     
        SOCKET sock_attente;
        SOCKET sock_dialogue;
        SOCKADDR_IN csin;
        int len;
        // int port= xx;    // affecté en variable globale
        csin.sin_family=AF_INET;
        csin.sin_addr.s_addr=htonl(INADDR_ANY);
        csin.sin_port=htons(port);
        sock_attente = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if (sock_attente == INVALID_SOCKET)
            return NULL;
        if (bind(sock_attente,(SOCKADDR*)&csin,sizeof(csin)) == SOCKET_ERROR)
            return NULL;
        printf("Listen...\n");
        if (listen(sock_attente, 1) == SOCKET_ERROR)
            return NULL;
        len = sizeof(csin);
        printf("Attente client...\n");
        sock_dialogue = accept(sock_attente, (SOCKADDR *)&csin, &len);
        if (sock_dialogue==INVALID_SOCKET)
            return NULL;
        printf("Connection en Serveur :\n");
     
        return NULL;
    }

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 5 521
    Points : 24 058
    Points
    24 058

    Par défaut

    Ton socket n'est pas libéré, donc le système le garde. Donc quand tu recrées un socket sur le même port, le système râle, puisqu'il n'est pas disponible.
    La question c'est : pourquoi créer un socket dans un thread, et surtout pourquoi tuer ce thread ?!?
    T'es quand même conscient que si tu libères ton socket, tous les clients connectés ne le seront plus ??!
    C'est sencée être quoi la logique derrière ça ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    juin 2012
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2012
    Messages : 250
    Points : 316
    Points
    316

    Par défaut

    Salut Bousk,
    Pour l’instant je ne tue le thread que lorsque je n’ai pas de connexion au bout d’un certain temps.
    En cas de connexion j’avais imaginé de tuer aussi ce thread et d’en ouvrir un autre pour le dialogue. Cela devrait pouvoir marcher puisque apparemment donc le socket n’est pas libéré ?

    Je suis conscient que si je libère le socket, tous les clients connectés ne le seront plus mais puis-je tuer ce thread sans libérer le socket ? C’est ce qui se passe actuellement, non ?

    Mon idée et la logique sont :
    - Pas de connexion au bout d’un certain temps : on tue le thread ET on libère le socket
    - Connexion : on tue le thread sans libérer et on ouvre un autre thread sur le même socket qui gère le dialogue.
    Est-ce possible ?

    Je pense que pour libérer le thread en l’absence de connexion je devrais utiliser select() pour éviter d’être bloqué.
    Si je n’ai plus de fonction bloquante, ni trop longue, je pourrais peut-être tout faire dans le même thread comme tu le suggères mais j’en doute.
    Je ne suis pas familiarisé avec les sockets non bloquants, j’ai vu ton cours mais si me lance là-dedans je crains d’y passer beaucoup de temps.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    juin 2012
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2012
    Messages : 250
    Points : 316
    Points
    316

    Par défaut

    Alors j’ai trouvé une solution simple :
    En même temps que je tue le thread, je libère le socket avec
    Lorsque il y a connexion, le thread se termine tout seul à la fin de la fonction (sans libérer) et j’en ouvre un autre pour gérer le dialogue.
    Cela fonctionne.

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

Discussions similaires

  1. Pthread et semaphores
    Par Yabo dans le forum Linux
    Réponses: 9
    Dernier message: 30/03/2008, 01h09
  2. Des problemes avec ces threads <pthread.h>
    Par nasamad dans le forum GTK+ avec C & C++
    Réponses: 26
    Dernier message: 07/07/2006, 13h46
  3. Utilisation des nombres dans Winsock2
    Par DeusXL dans le forum MFC
    Réponses: 14
    Dernier message: 01/12/2004, 18h36
  4. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 02h17
  5. Réponses: 4
    Dernier message: 27/08/2003, 22h34

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