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 :

Simulation plusieurs clients sur un même PC ? [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut Simulation plusieurs clients sur un même PC ?
    Bonjour ,

    J'essaie de suivre un cours sur les réseaux, mais j'ai plein de question et...le site me répond pas

    Le peu que j'ai compris, c'est qu'il me faut un serveur, et des clients (dans mon cas y en faut plusieurs).
    J'essaie de comprendre un script tout fait :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import socket
    import select
    
    hote = ''
    port = 12800
    
    connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_principale.bind((hote, port))
    connexion_principale.listen(5)
    print("Le serveur écoute à présent sur le port {}".format(port))
    
    serveur_lance = True
    clients_connectes = []
    while serveur_lance:
        # On va vérifier que de nouveaux clients ne demandent pas à se connecter
        # Pour cela, on écoute la connexion_principale en lecture
        # On attend maximum 50ms
        connexions_demandees, wlist, xlist = select.select([connexion_principale],
            [], [], 0.05)
        
        for connexion in connexions_demandees:
            connexion_avec_client, infos_connexion = connexion.accept()
            # On ajoute le socket connecté à la liste des clients
            clients_connectes.append(connexion_avec_client)
        
        # Maintenant, on écoute la liste des clients connectés
        # Les clients renvoyés par select sont ceux devant être lus (recv)
        # On attend là encore 50ms maximum
        # On enferme l'appel à select.select dans un bloc try
        # En effet, si la liste de clients connectés est vide, une exception
        # Peut être levée
        clients_a_lire = []
        try:
            clients_a_lire, wlist, xlist = select.select(clients_connectes,
                    [], [], 0.05)
        except select.error:
            pass
        else:
            # On parcourt la liste des clients à lire
            for idx,client in enumerate(clients_a_lire):
                # Client est de type socket
                msg_recu = client.recv(1024)
                # Peut planter si le message contient des caractères spéciaux
                msg_recu = msg_recu.decode()
                print("Reçu de {} : {}".format(idx,msg_recu))
                client.send(b"5 / 5")
                if msg_recu == "fin":
                    serveur_lance = False
    
    print("Fermeture des connexions")
    for client in clients_connectes:
        client.close()
    
    connexion_principale.close()
    J'ai aussi bien sûr un script pour le client. Bref.
    Donc pour que tout ça discute, j'ouvre plusieurs idle, et j'exécute d'un côté le serveur, et de l'autre le client.
    Jusqu'ici tout va bien. Mon serveur reçoit bien les infos du clients, et vice-versa.

    Mais...et pour plusieurs clients ?
    Est-ce que je peux ouvrir...3 idle par exemple, et exécuter 2 scripts clients ? Enfin oui je peux, mais dans ce cas pour le serveur ce sont 2 clients différents ?
    Si oui comment, dans le script du serveur, les identifier séparément ? Ou alors c'est pas possible sur un seul PC de simuler plusieurs clients ?
    j'ai tenté de rajouter un index dans le script de départ (j'ai mis en gras dans le code) pour avoir un numéro de client différent (puisqu'ils s'incrémentent dans une liste) mais à l'affichage j'ai toujours client 0. Pour les 2.

    J'espère que j'ai réussi à expliquer ce que je ne sais pas (et c'est pas simple, vu l'étendue de ce que je ne sais pas...).

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Si oui comment, dans le script du serveur, les identifier séparément ? Ou alors c'est pas possible sur un seul PC de simuler plusieurs clients ?
    Dans votre code un nouveau client, c'est le descripteur de la socket principale dans la liste retournée par select.select (à la ligne 18) puis on fait un .accept de la connexion et on se retrouve avec un descripteur de socket client dans la liste clients_connectes.

    Donc chaque client est identifié par son numéro/descripteur de socket.
    Et pour faire une analogie, ouvrez plusieurs fichiers, vous vous retrouvez avec un tas d'objets "fichiers". En général, vous associez chaque objet "fichier" à une variable et un nom mnémotechnique. Là, c'est plus compliqué puisque vous avez une liste de... indifférenciés.

    Citation Envoyé par RowanMayfair Voir le message
    j'ai tenté de rajouter un index dans le script de départ (j'ai mis en gras dans le code) pour avoir un numéro de client différent (puisqu'ils s'incrémentent dans une liste) mais à l'affichage j'ai toujours client 0. Pour les 2.
    select.select va vous retourner une liste contenant les objets sockets qui ont reçu des données (à lire donc). Elle pourra être vide, contenir un seul client, 2 clients, tous les clients,...
    Et si des données ont été reçues depuis le client A seul, son index dans la liste sera 0. Et si le coup d'après, c'est le client B, il aura aussi l'index 0.
    Donc çà ne peut pas fonctionner comme çà.

    Si vous voulez identifier chaque client, il faut lui associer quelque chose d'unique à partir d'infos_connexion lors de l'accept (ou autre). Puis vous associez l'objet socket à cet identifiant (via un dictionnaire).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    merci Wiztricks
    je vais relire l'embryon de cours que j'ai pour tenter de faire ça.

    Sinon, (moins important), j'ai un 2ème PC ex-portable (de marque Puzzle ), s'il me prend l'envie de m'amuser, je peux essayer de mettre le serveur sur l'un et le client sur l'autre ? En sachant que celui que j'utilise est sous Win 10/Python 3.7 et le puzzle est sous Ubuntu/Python 3.6.8 (je crois). Les différences d'OS et/ou de versions de Python ne poseront pas de problème je suppose ? (connexion wifi sur même box wifi bien sûr)


    Edit : et donc, l'hôte ce sera toujours local host ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    Les différences d'OS et/ou de versions de Python ne poseront pas de problème je suppose ? (connexion wifi sur même box wifi bien sûr)
    Vous ne faites qu’échanger des séquences de bytes à travers un protocole de communication qui s'appelle TCP/IP. C'est cette pile de communication qui doit être "cohérente" entre les différents engins qui veulent communiquer avec.
    Et dans l'univers informatique, il n'existe que deux versions: IPv4 et IPv6... Elles sont incompatibles mais il est peu probable que vous ayez configuré chez vous une machine IPv4 et une machine IPv6 "only".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    (...)

    Si vous voulez identifier chaque client, il faut lui associer quelque chose d'unique à partir d'infos_connexion lors de l'accept (ou autre). Puis vous associez l'objet socket à cet identifiant (via un dictionnaire).

    - W
    OK. Donc j'ai mis des print un peu partout pour voir ce que ça "fabriquait" ce code.
    Assez rapidement, j'en ait conclu que je pouvais simplement identifier les clients par leur numéro de port de sortie. C'est dans les infos_connexions, facile à utiliser.

    Donc, j'ai mis ça dans un dictionnaire. Jusqu'ici, tout va bien. C'est ensuite que ça se gâte :
    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
    while serveur_lance:
        connexions_demandees, wlist, xlist = select.select([connexion_principale],
            [], [], 0.05)
     
        for connexion in connexions_demandees:
            connexion_avec_client, infos_connexion = connexion.accept()
            clients_connectes.setdefault(infos_connexion[1],connexion_avec_client)
     
     
        clients_a_lire = []
        try:
            clients_a_lire, wlist, xlist = select.select(clients_connectes,
                    [], [], 0.05)
        except select.error:
            pass
        else:
            for dictio in clients_a_lire : 
                for port,client in dictio.items() :
                    msg_recu = client.recv(1024)
                    msg_recu = msg_recu.decode()
                    print("Reçu de {} : {}".format(port,"=",msg_recu))
                    client.send(b"5 / 5")
                    if msg_recu == "fin":
                        serveur_lance = False
    ça ne fonctionne pas. Peut-être que select.select n'accepte pas les dictionnaire ? ?
    Je le torture depuis un petit moment maintenant, sans succès
    Si je ne mets pas de dictionnaire, ou de liste avec des tuples, enfin ... autre chose qu'uniquement connexion_avec_client, je ne peux pas les différencier
    Mais si j'ajoute un identifiant, ça ne fonctionne plus
    Je tourne en rond. (avec une doc Python pas toujours très bavarde, et surtout pas dans ma langue )

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    ça ne fonctionne pas. Peut-être que select.select n'accepte pas les dictionnaire ??
    Vous savez que çà fonctionne avec des listes d'objets. Vous savez aussi que c'est juste une interface avec le select UNIX pour lequel vous avez une documentation en français. Une fois que vous aurez compris ce que çà fait, impossible d'envisager de lui passer un dictionnaire!

    Citation Envoyé par RowanMayfair Voir le message
    Si je ne mets pas de dictionnaire, ou de liste avec des tuples, enfin ... autre chose qu'uniquement connexion_avec_client, je ne peux pas les différencier
    Mais si j'ajoute un identifiant, ça ne fonctionne plus
    Comme select.select ne prend que des listes/séquences d'objets "sockets" et retourne des listes d'objets "sockets". Vous devez réfléchir à comment vous allez bien pouvoir les utilisez pour réaliser ce que vous voulez faire avec.
    Et çà commence par une description de tout çà en français qui tienne la route avant de coder quoi que ce soit.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Comme select.select ne prend que des listes/séquences d'objets "sockets" et retourne des listes d'objets "sockets". Vous devez réfléchir à comment vous allez bien pouvoir les utilisez pour réaliser ce que vous voulez faire avec.
    Et çà commence par une description de tout çà en français qui tienne la route avant de coder quoi que ce soit.

    - W
    puisque je n'ai que des sockets, et que ça ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <socket.socket fd=676, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 12800), raddr=('127.0.0.1', 61209)>
    il faudrait que j'arrive à extraire du socket le port de sortie, par exemple, l'extraire de cette "chose" qui n'est pas une chaine de caractère ni une liste ni un truc que je connais.
    C'est mieux formulé du coup non ?
    Je vais continuer de chercher, si ça trouve cette fois je vais trouver des trucs (enfin des autres...)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RowanMayfair Voir le message
    C'est mieux formulé du coup non ?
    Je ne sais pas. Repartez de ce que vous cherchez à faire afficher un identifiant du client associé au message reçu, pour pouvoir écrire, par exemple print (client, message).
    client pourrait être juste une chaine de caractère genre "client-1", "client-2", "client-3",...
    Ce qui vous évite d'aller vous perdre à décoder une socket.
    Et vous avez les mêmes problèmes à résoudre: un nouveau client arrive, il faut lui associer son identifiant, je reçois un message de... comment récupérer le client.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par RowanMayfair Voir le message
    Assez rapidement, j'en ait conclu que je pouvais simplement identifier les clients par leur numéro de port de sortie.
    oui mais c'est faux une socket est une une structure unique, fournie et réutilisée par le noyau (1 connexion == 1 socket), c'est par nature un *le* discriminant permettant d'identifier une connexion établie.

    le port du client n'est qu'une donnée dans cette structure, c'est une information nécessaire mais pas suffisante pour identifier une connexion, et bien qu'il soit choisit aléatoirement il n'est pas impossible de trouver 2 connexions distinctes ayant le même port source/client (il y a même des protocoles où c'est un prérequis de fixer le port source).

  10. #10
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    OK. Cette fois je crois avoir compris le problème. Ce fût long mais bon en attendant pendant que je cherchais à donner autre chose qu'un socket à select.select, j'ai appris et compris un certain nombre de choses. En tout cas, j'en sais + qu'hier matin, c'est déjà ça


    Bref.
    Il faudrait que je donne un nom à mon socket quand je reçois un message.
    Parce qu'en fait, si je fait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for client in clients_a_lire :
                msg_recu = client.recv(1024)
                msg_recu = msg_recu.decode()
                print("Reçu de {} : {}".format(client,msg_recu))
    évidemment, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reçu de <socket.socket fd=736, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 12800), raddr=('127.0.0.1', 50293)> : fin
    on est bien d'accord que le socket, il est unique, je ne peux pas avoir 2 fois le même, quelle que soit les circonstances ?
    Edit : BufferBob a précisément répondu à cette question. Donc oui

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    on est bien d'accord que le socket, il est unique, je ne peux pas avoir 2 fois le même, quelle que soit les circonstances ?
    "quelle que soit les circonstances"? Certainement pas.
    Car sockets et connexion réseaux sont des objets différents ayant leur propre durée de vie. Dans le temps, ils seront recyclés, ré-associés,....

    Ceci dit, si c'est juste pour distinguer vos clients côté affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client, msg_recu))
    suffit.
    Vous pourriez même le remplacer par quelque chose de plus court comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client.fileno(), msg_recu))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client.getpeername(), msg_recu))
    Tant que le dialogue avec les clients se résume à leur retourner le message "recu 5/5" jusqu'à la réception de "fin", çà va le faire....
    Dès que ce dialogue sera un peu plus "compliqué", il va falloir noter quelque part où çà en est pour chaque client. Et pour çà, associer un objet spécifique à la socket qui permettra de...
    Et comme le réseau est, à priori non fiable, si les clients sont déconnectés "arbitrer" entre leur imposer de recommencer à zéro ou de continuer le dialogue là où il a été interrompu.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre régulier Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 47
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Points : 89
    Points
    89
    Par défaut
    J'ai fini par m'en sortir
    Bien sûr, le but est d'aller par la suite un peu plus loin, et de les identifier clairement.
    Pour que, par exemple, ils puissent jouer ensemble.
    J'en suis pas là, on est d'accord

    Si je fais comme ça :
    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
    clients_sockets = {}
    n = 1
    while serveur_lance:
        connexions_demandees, wlist, xlist = select.select([connexion_principale],
            [], [], 0.05)
        
        for connexion in connexions_demandees:
            connexion_avec_client, infos_connexion = connexion.accept()
            print(connexion_avec_client)
            clients_connectes.append(connexion_avec_client)
            if connexion_avec_client not in clients_sockets :
                clients_sockets.setdefault(connexion_avec_client,n)
                n += 1
        
        
        clients_a_lire = []
        try:
            
            clients_a_lire, wlist, xlist = select.select(clients_connectes,[], [], 0.05)
            
        except select.error:
            pass
        else:
            for client in clients_a_lire :
                msg_recu = client.recv(1024)
                msg_recu = msg_recu.decode()
                print("Reçu de {} : {}".format(clients_sockets[client],msg_recu))
                client.send(b"5 / 5")
                if msg_recu == "fin":
                    serveur_lance = False
    Du coup, c'est enregistré non ? C'est bien rangé dans le dictionnaire, on sait qui parle. Ou qui joue


    Edit :
    Citation Envoyé par wiztricks Voir le message
    "quelle que soit les circonstances"? Certainement pas.
    Car sockets et connexion réseaux sont des objets différents ayant leur propre durée de vie. Dans le temps, ils seront recyclés, ré-associés,....

    Ceci dit, si c'est juste pour distinguer vos clients côté affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client, msg_recu))
    suffit.
    Vous pourriez même le remplacer par quelque chose de plus court comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client.fileno(), msg_recu))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("Reçu de {} : {}".format(client.getpeername(), msg_recu))
    Tant que le dialogue avec les clients se résume à leur retourner le message "recu 5/5" jusqu'à la réception de "fin", çà va le faire....
    Dès que ce dialogue sera un peu plus "compliqué", il va falloir noter quelque part où çà en est pour chaque client. Et pour çà, associer un objet spécifique à la socket qui permettra de...
    Et comme le réseau est, à priori non fiable, si les clients sont déconnectés "arbitrer" entre leur imposer de recommencer à zéro ou de continuer le dialogue là où il a été interrompu.

    - W
    la fameuse méthode fileno() ! je suis tombée là-dessus hier, quand j'essayais de mettre un dictionnaire à select.select, j'ai appris que select.select ne prenait que les objets sur lesquels on pouvait appliquer la méthode fileno(). Mais j'ai pas trouvé ni l'explication de la méthode (pas pensé à la tester comme ça tout simplement) ni la liste des objets qui en effet prenaient cette méthode.
    Je ne sais pas si elle est très utile, mais je ne risque pas de l'oublier cette fileno()

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    j'ai appris que select.select ne prenait que les objets sur lesquels on pouvait appliquer la méthode fileno(). Mais j'ai pas trouvé ni l'explication de la méthode (pas pensé à la tester comme ça tout simplement) ni la liste des objets qui en effet prenaient cette méthode.
    C'est parce que select.select n'est qu'une interface avec le "vrai" select réalisé par des bibliothèques système. Et que ce select là, ne connaît que des "fileno" i.e. des index dans la table des descripteurs du process.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Plusieurs vues sur un même fichier
    Par minicat dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 05/05/2014, 21h53
  2. [MFC] Plusieurs vues sur le même CTreeCtrl
    Par Denn's dans le forum MFC
    Réponses: 4
    Dernier message: 17/04/2006, 19h12
  3. Héberger plusieurs sites sur la même machine
    Par fgiuliano dans le forum Apache
    Réponses: 9
    Dernier message: 27/10/2005, 10h29
  4. [Débutant] Plusieurs versions sur un même système ?
    Par castaka dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 15/02/2005, 10h21
  5. Réponses: 4
    Dernier message: 14/10/2004, 17h36

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