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/Web Python Discussion :

fork, serveur concurant


Sujet :

Réseau/Web Python

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    41
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 41
    Points : 29
    Points
    29
    Par défaut fork, serveur concurant
    bonjour tout le monde,
    j'ai réalisé un serveur multi connexion et je le fait tourner en mode concurrent avec l'appel systeme fork.
    J'ai un problème avec mon serveur et le rpocessus fils généré par le fork : lorsque le client arrete la connexion avec le serveur, le processus qui gérait sa connexion continue de tourner alors qu'il devrai plutot s'arreter. Je sais pas si je suis assez clair, mais voici le code du serveur :
    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
    #!/usr/bin/python
    import os
    import socket
    
    listening_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host=socket.gethostname()
    port=50001
    entry=(host, port)
    try :
        listening_socket.bind(entry)
        listening_socket.listen(5)
    except socket.error, err_msg :
        print "Error :",err_msg
        
    while 1 :
        (serv_sock, serv_addr)=listening_socket.accept()
        pid=os.fork()
        if pid :
            serv_sock.close()
            #continue
        else :
            listening_socket.close()
            print "server",os.getpid(),"now connected with",serv_sock.getpeername()
            welcome_msg="welcome to"+host
            serv_sock.sendall(welcome_msg)
            while 1:
                cl_msg=serv_sock.recv(1024)
                if cl_msg=="\n" :
                    print "closing connexion with :",sev_sock.getpeername()
                    serv_sock.close()
                    print "closed"
                    sys.exit(0)
                else :
                    print "from",serv_sock.getpeername(),":"
                    print cl_msg
                    serv_sock.sendall(cl_msg)
            sys.exit()
    lorsque le client envoie "\n" au processus coté serveur, celui continue sa boucle while et affiche "from ..." sans jamais s'arrêter. Pouvez vous m'expliquer ce qu'il se passe s'il vous plaît ?
    Merci, au revoir

  2. #2
    Membre expérimenté
    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
    Points : 1 384
    Points
    1 384
    Par défaut
    Je suppose qu'après avoir envoyé le '\n', le client ferme le socket ? Dans ce cas, les appels suivants à recv retourneront immédiatement avec comme valeur de retour None ou la chaîne vide (l'un des deux, je sais plus).
    Ce qui se passe probablement est que le '\n' n'est pas bien envoyé et donc le test cl_msg == '\n' n'est pas vérifié.
    Si effectivement le socket est toujours fermé après l'envoi du '\n', il est plus simple de vérifier que cl_msg n'est pas vide:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    if not cl_msg:
        print "connexion closed by peer"
        ...

  3. #3
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    41
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 41
    Points : 29
    Points
    29
    Par défaut Merci
    Bonjour, merci de me répondre.
    Oui la socket du client est fermée. Et le le message envoyé par le client etait '\n ' (avec un espace introduit je sais par erreur). Ton message m'a permi de comprendre cette erreur. Je me disais que ma question devai vraiment être stupide pour que personne ne me reponde. Et oui, elle l'etait :/ J'ai pourtant cherché tres longtemps avant de poster
    Arf, ca menerve de poster pour des truc betes comme ca ...
    Mais bon, merci, javais laisser tombé ce probleme et maintenant il est resolu.
    Au revoir

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

Discussions similaires

  1. serveur multi client avec fork()
    Par deby23 dans le forum Réseau
    Réponses: 17
    Dernier message: 11/09/2007, 16h32
  2. accés concurent a un serveur web
    Par mitoubra dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 12/06/2007, 09h26
  3. acces concurent à des fichiers sur le serveur
    Par al3alwa dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 08/06/2007, 15h41
  4. Réponses: 4
    Dernier message: 06/01/2007, 21h42
  5. Fork, pthread et serveur multi-clients
    Par Pico10 dans le forum POSIX
    Réponses: 13
    Dernier message: 05/01/2006, 11h48

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