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

Python Discussion :

Arrêt et destruction automatique d'une socket


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut Arrêt et destruction automatique d'une socket
    Bonjour à toute la communauté Python,

    Je suis nouveau dans l'utilisation de ce langage alors je m'amuse à faire quelques petits bouts de codes pour voir (et les faire fonctionner sans problèmes).

    J'ai actuellement un petit soucis: j'ai crée deux scripts qui communiquent via le réseau. La communication se passe bien, tout est bien et magnifique sauf un léger détail. Ces scripts communiquent via une socket sauf que lorsque mon soft se termine, je ne peux donc pas relancer mon soft sans détruire "à la main" le programme python. Je ne sais pas si c'est la socket qui bloque (pourtant je la ferme à la fin du programme) ou si mon programme tourne toujours en arrière plan.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par servalanime Voir le message
    J'ai actuellement un petit soucis: j'ai crée deux scripts qui communiquent via le réseau. La communication se passe bien, tout est bien et magnifique sauf un léger détail. Ces scripts communiquent via une socket sauf que lorsque mon soft se termine, je ne peux donc pas relancer mon soft sans détruire "à la main" le programme python. Je ne sais pas si c'est la socket qui bloque (pourtant je la ferme à la fin du programme) ou si mon programme tourne toujours en arrière plan.
    Tout est possible:
    Un socket ne ferme pas la connexion dès le .close(). Essayez avec .shutdown().
    sans détruire "à la main" le programme python c'est que cela tourne encore.
    Difficile sans plus de code.

    @+

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut
    Merci pour la réponse.

    Voila les deux scripts, lorsque je les lance (sur deux postes différents) et qu'ils ont terminé leurs fonctions (pas grand chose à l'heure actuelle), je ne peux pas les relancer juste après: Python me signale que la socket est déjà en service (avec le try-catch, je me suis rendu compte que c’était carrément les scripts qui tournaient encore) et je sais pas trop comment faire en sorte qu'une fois le script terminé, tout s’arrête correctement. (Je ne sais pas si je suis très clair ^^")

    Je vais essayer avec le shutdown et voir si cela fonctionne.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    import socket
    portNumber=3421
    serveur="SERVEUR-TEST"
    from asyncore import dispatcher
    import sys, time, socket
     
    class Server( dispatcher ):
      def __init__(self):
        dispatcher.__init__(self)
        port=repr(portNumber)
        print "Lancement de la connection,\n ==>Paramètre serveur:  "+serveur+":"+port
        #---- create listen socket ----
        print "Création de la socket"
        listenSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
        # ... bound to any local address on the specified port
        print "Initialisation du serveur"
        myAddr=(serveur,portNumber)
        listenSocket.bind(myAddr)
        # ... listening connections
        print "Attente de recption d'une connection"
        listenSocket.listen(10)
        #---- accept new connection ----
        print "Acquisition d'une nouvelle connection"
        (dialogSocket,fromAddr)=listenSocket.accept()
        print 'new connection from %s:%d'%(fromAddr[0],fromAddr[1])
        #---- dialog with client ----
        print "Entrez un mesage pour le client"
        message=raw_input()
        print "Envoie du message au client à l'adresse: %s" % listenSocket.fromAddr
        dialogSocket.send(message)
        #---- close dialog socket ----
        print "Fermeture de la dialogSocket"
        dialogSocket.close()
        #---- close listen socket ----
        print "Fermeture de la listenSocket"
        listenSocket.close()
        raw_input()
     
     
    try:
      Server()
    except:
      print 'Déjà en service !'
    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
    34
    35
    36
    37
    38
    import socket
    portNumber=3421
    serveur="SERVEUR-TEST"
    from asyncore import dispatcher
    import sys, time, socket
     
    class Client( dispatcher ):
      def __init__(self):
        dispatcher.__init__(self)
    	#---- extract destination IP address ----
    	ipAddress=socket.gethostbyname(serveur)
    	print "L'adresse IP du serveur est: %s" % ipAddress
    	#---- create client socket ----
    	clientSocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
    	myAddr=('',portNumber)
    	clientSocket.bind(myAddr)
    	# ... listening connections
    	clientSocket.listen(10)
    	#---- accept new connection ----
    	(dialogSocket,fromAddr)=clientSocket.accept()
    	#connected to the specified destination/port
    	toAddr=(ipAddress,3421)
    	clientSocket.connect(toAddr)
    	(dialogSocket, fromAddr)=listen.accept()
    	#---- dialog with server ----
    	msg=clientSocket.recv[0x100]
    	if msg:
    		print 'Message du serveur: %s' %msg
    	#---- close client socket ----
    	clientSocket.close()
    	print "connection terminé: fin du prog"
     
    try :
    		Client()
    except:
    	print "Programme deja en cours d'execution"
     
    raw_input()

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonsoir,

    je ne vois pas très bien comment les try/except t'ont permis de comprendre que le programme tournait encore; tout ce qu'il font dans ton code c'est avaler l'exception et afficher un message d'erreur qui n'a peut-être rien à voir avec la raison pour laquelle l'exception a été levée.

    Il se peut tout à fait que le socket soit indisponible même si le programme s'est arrêté. Même si le socket TCP a été fermé proprement, il se peut qu'il reste dans l'état TIME_WAIT pendant quelques temps (cela peut durer plusieurs minutes). C'est un problème courant. Pour contourner cela, tu peux définir l'option REUSEADDR sur le socket, qui permet de réutiliser un socket en TIME_WAIT.

    Cela devrait être (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    (juste avant le bind)

    Aussi, je ne comprends pas pourquoi le client et le serveur ouvrent tous les deux un socket en écoute. Typiquement, seul le serveur fait le bind/listen/accept; le client fait directement un connect.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 13
    Par défaut
    Merci pour la réponse. ^^

    Pour le try except, en fait, j'avais pensé, que l'exception est levé si le programme (la classe) est lancé alors qu'une instance existe deja et par conséquent, il ne le relancait donc pas.

    Je vais tester dès que je peux la modification du TIME_WAIT pour voir si mon probleme vient de cet endroit. Je pense que cela doit venir de la.

    Pour la double utilisation de la socket, au départ j'avais pensé utiliser une seule socket mais il se trouve que j'avais oublié quelques petites fonctions utiles dans la transmission de donnée du client vers le serveur, donc je me suis dit, autant ouvrir une socket dans l'autre sens. Mais j'ai trouvé mon erreur et je l'ai corrigé.

    Je vous tiens au courant dès que je peux corriger et tester mon code.

    Merci du coup de main en tout cas..

    EDIT: Je viens de tester le code en rajoutant l'instruction modifiant le TIME_WAIT et effectivement, c'est ce petit morceau de code qui me poser un si gros problème.
    Merci encore.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/01/2012, 16h50
  2. Arrét et démarage automatique d'une instance ORACLE 10G R2
    Par bestsuan dans le forum Administration
    Réponses: 10
    Dernier message: 23/08/2008, 19h37
  3. arrêt automatique d'une appli.
    Par Denn's dans le forum MFC
    Réponses: 10
    Dernier message: 09/10/2007, 07h28
  4. Destruction automatique d'une fenêtre d'attente
    Par Depteam1 dans le forum MFC
    Réponses: 4
    Dernier message: 20/09/2005, 13h40
  5. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42

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