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

Windows Discussion :

[winsock]Forcer la fermeture d'un port après un timeout


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut [winsock]Forcer la fermeture d'un port après un timeout
    Bonjour,
    je suis en train de faire une appli client/serveur simple mais je rencontre un problème lorsque je veux utiliser un timeout coté serveur:
    En fait, sur le socket du serveur je veux lui définir 2 options la première est SO_EXCLUSIVEADDRUSE qui fait que un seul processus peu utiliser le port et la seconde (et c'est là que ça coince) c'est SO_RCVTIMEO qui pose un timeout sur le socket en réception (si le client ne fait rien pendant un temps X, je ferme coté serveur)
    Le problème c'est que si le client reste connecté (si je fait pas un shutdown/closesocket coté client après le timeout), je ne peu pas re binder mon socket sur le serveur car le port est considéré comme utilisé par un autre processus(le client qui veux pas lacher le morceaux à priori). Donc si ça ce met à déconner coté client, c'est le serveur qui trinque...
    Existe-t-il une parade à cela ou est-ce parce que je n'emploie pas la bonne méthode pour poser un timeout sur le serveur ?
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ça m'a l'air bien confus, tout ça...

    Déjà: Où mets-tu exactement le SO_EXCLUSIVEADDRUSE, et où mets-tu exactement le SO_RCVTIMEO ?
    • Sur le socket d'écoute du serveur ?
    • Sur le socket de travail du serveur ?
    • Sur le socket du client ?

  3. #3
    Expert éminent sénior

    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
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    et aussi sur quel OS ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    @souviron34 : Winsock2 sous windows XP / 2003 Server
    @Médinoc:
    Le SO_EXCLUSIVEADDRUSE, je le met sur le socket d'écoute du serveur
    Le SO_RCVTIMEO, sur le socket de travail du serveur (après le accept donc)(sur le même port que l'écoute et je ne prend qu'un client à la fois)
    Voila pour les éclaircissements, et merci de vous intéresser à mon problème

  5. #5
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par souviron34
    et aussi sur quel OS ?
    Bah, avec 'winsock', y'a pas trop le choix...

  6. #6
    Expert éminent sénior

    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
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    autant pour moi

    j'étais passé un peu rapidement sur le titre ..

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Que fais-tu exactement du socket d'écoute une fois le client accepté ?
    Pourquoi éprouves-tu le besoin de "re binder" ton socket ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Alors en fait je vais expliquer plus en détails:
    coté serveur, j'ai besoin de garder la main sur l'appli donc je construit mon socket dans un thread.
    Dans ce thread, j'ai un socket d'écoute (c'est sur celui là que je met mon SO_EXLUSIVEADDDRUSE ) que je ferme après avoir fait un accept. Je travail donc ensuite sur un autre socket (c'est sur celui là que je met un timeout) que je ferme aussi une fois la session avec le client terminée. Le problème c'est que je ne doit avoir qu'un seul client à la fois à travailler sur le serveur donc lorsque j'ai fini mon écoute puis le travail, le thread se termine et j'en re crée un autre au besoin, je suis donc avec un "nouveau" socket d'écoute et de travail. Tout fonctionne impec sauf que comme je ne prend qu'un client à la fois, si ce dernier ne ferme pas sa connexion (il s'endort, part boire un café... ) plus personne ne peu accéder au serveur d'où le timeout, mais quand celui ci intervient, je ferme mon thread et ne peu plus re ouvrir de socket tant que le client n'a pas stoppé (il ne peu plus communiquer non plus puisqu'il n'a pas plus personne en face)
    Donc je sais que c'est facile de coder la parade coté client, mais qu'en est il si le client plante par exemple, j'aimerais que le coté serveur ne soit pas dépendant du bon fonctionnement du client.
    merci

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu fermes bien le socket de travail coté serveur lorsqu'il y a un timeout ?

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    oui, je ferme le socket de travail via un shutdown puis un close et je fait un WSACleanup derrière, je peu même quitter l'appli coté serveur, lorsque je la relance, le port est toujours utilisé, il faut que je stop l'appli coté client pour pouvoir re binder mon socket, c'est donc bien le client qui garde la main sur mon port .

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    As-tu testé avec le client sur une autre machine?

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    je fait les tests sur 3 machines en tout, 2 en xp et un 2003 server, le résultat est identique (en ayant testé dans tous les sens), la seul solution pour l'instant est de fermer le socket coté client lorsqu'un timeout se produit (ce qui est logique, mais si le client fait l'imbécile c'est cuit...) ce qui fait que pour l'instant j'ai désactivé le SO_EXCLUSIVEADDRUSE sur le serveur, c'est la seul solution que j'ai trouvé pour ne pas rendre le serveur dépendant du client... du coup je perd en sécurisation sur le socket serveur

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Attends: Tu fermes le socket avec un close() ? Sous Windows ?
    Si oui, on a trouvé le problème: Sous Windows, un socket se ferme avec closesocket().
    Si non, je ne vois pas ce qui cause le problème.

    Et hélas, je pense que c'est non, puisque tu as dit que quitter le serveur n'y changeait rien...

  14. #14
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    re,
    non je t'induit en erreur là, je ferme bien avec closesocket() (j'ai viens de vérifier quand même )
    et comme tu le dis, le fait de fermer l'appli coté serveur ne change rien, c'est vraiment le client qui monopolise le port et qui m'empêche de rebinder dessus...
    je pense que c'est liée au système en lui même et je trouve ça un peu idiot...
    merci en tout cas d'essayer de m'aider.

Discussions similaires

  1. recupération d'un port après fermeture
    Par shaftJackson dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/12/2005, 12h18
  2. Forcer la fermeture d'une application
    Par Bissada dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 22h42
  3. fermeture d'une application après un temp d'inactivité?
    Par sitdown dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/08/2005, 16h44
  4. Fermeture violente du port com
    Par jeannot27 dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/11/2004, 22h34
  5. est il possible de forcer l'ouverture d'un port
    Par voyageur dans le forum Développement
    Réponses: 86
    Dernier message: 23/10/2004, 21h26

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