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

Réseau C Discussion :

Winsock et multithreading en C


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut Winsock et multithreading en C
    J'ai posé une question liée à celle-ci sur le forum réseau, mais étant donné qu'il n'y a personne (ou du moins presque) sur ce forum, je repose ma question ici. Veuillez m'excuser par avance si vous avez déjà été faire un tour sur le forum réseau. De toute façon, mon programme est essentiellement en C.

    Y-a-t-il des précautions particulières à prendre avec les fonctions Winsock (socket, connect, send, etc...) lorsque le programme est multithread?
    Si je pose la question, c'est parce que je rencontre des problèmes avec un programme qui lance plusieurs threads en parallèle, chacun d'eux tentant d'ouvrir une connexion vers un serveur. Les connect() ont tendance à échouer avec le message d'erreur "The specified address is already in use".
    Si vous voulez davantage de détails, https://www.developpez.net/forums/showthread.php?t=284857

    Merci d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Je n'ai pas la solution mais peut être une piste. Il me semble que le systeme met du temps à liberer la ressource. En d'autres termes, meme si tu fermes la socket dans ton programme, le systeme ne va pas liberer le port tout de suite (seulement au bout de qqs seconds, voir qqs minutes).
    Je crois que le comportement est à peu pres le meme sous linux.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Je pense que ce doit être (mais peut-être l'avez-vous déjà dans votre code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       /*
        *On arrete toute emission et reception sur le socket
        */
       shutdown(sockno,2);
     
       /*
        * On ferme le socket
        */
       close(sockno);
    ce code n'est pas testé en multi-threading, mais marche fort bien en mono.. Par contre jamais testé sous Windows.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    Je pense que ce doit être (mais peut-être l'avez-vous déjà dans votre code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       /*
        *On arrete toute emission et reception sur le socket
        */
       shutdown(sockno,2);
     
       /*
        * On ferme le socket
        */
       close(sockno);
    ce code n'est pas testé en multi-threading, mais marche fort bien en mono.. Par contre jamais testé sous Windows.
    Extrait de http://emmanuel-delahaye.developpez....#projet_reseau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                         shutdown (csock, 2);
                         printf ("closing client socket %d...\n", csock);
                         closesocket (csock), csock = INVALID_SOCKET;

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tiens je ne connaissais pas closesocket.....

    Quelle est la principale différence avec close, Emmanuel ?

    Et pourquoi ça passe une écriture comme ça à la compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          sock_err = closesocket (sock), sock = INVALID_SOCKET;
    ??

    Faut pas un ";" entre les 2 ??

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34
    tiens je ne connaissais pas closesocket.....

    Quelle est la principale différence avec close, Emmanuel ?
    C'est une windowserie. Il n'y a pas de close() sous Windows.

    Tu n'as pas regardé le début des fichiers sources de mon article sur mon site ?

    Et pourquoi ça passe une écriture comme ça à la compile :
    Parce que c'est du C correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          sock_err = closesocket (sock), sock = INVALID_SOCKET;
    ??

    Faut pas un ";" entre les 2 ??
    pas ici. c'est exprès. C'est l'opérateur , (comma operator) que tu utilises dans for()...

    Il me sert surtout à préserver l'aspect 'insécable' malgré l'indentation automatique...

Discussions similaires

  1. winsock + multithreading
    Par chonos dans le forum Développement
    Réponses: 5
    Dernier message: 11/09/2006, 12h03
  2. [Winsock] Envoi et recupération d'une image
    Par arnolanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/11/2002, 08h49
  3. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36
  4. [VB6] [Winsock] Trouver un port libre
    Par Yann dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/10/2002, 11h23
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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