2014-05-24 2 views
0

je veux exécuter le code de serveur simple:OSError [Errno 99] - python

import socket 

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 22331    # Reserve a port 
s.bind((host, port))  # Bind to the port 

s.listen(5)     # Now wait for client connection. 
while True: 
    c, addr = s.accept()  # Establish connection with client. 
    print('Got connection from', addr) 
    c.send('Thank you for connecting') 
    c.close() 

donne l'erreur suivante lors de l'exécution:

OSError: [Errno 99] Cannot assign requested address 

pourquoi le système d'exploitation ne peut pas lier le port spécifié avec l'adresse?

+2

Vous voulez probablement 'host = « 0.0.0.0''. 'socket.gethostname()' renvoie le nom d'hôte, pas une adresse IP. –

+0

Je suis d'accord avec @ValentinLorentz, vous devriez essayer d'être spécifique à propos de l'IP ou utiliser '0.0.0.0'. Il semble que votre 'gethostname()' renvoie un IP/nom qui ne se résout pas à une adresse IP présente sur l'hôte sur lequel vous exécutez le script. –

+0

Le code que vous avez mentionné dans votre question ne génère pas cette erreur. Cela a fonctionné correctement sur Windows 8 avec python v2.7. S'il vous plaît nous montrer le code côté client aussi! –

Répondre

0

Si cela fonctionne en utilisant l'adresse IP mais sans utiliser le nom d'hôte.

Vous devriez avoir quelque chose comme ceci dans votre /etc/hosts mappant ip à hostname.

127.0.0.1 localhost 
127.0.1.1 your_hostname_here 

# The following lines are desirable for IPv6 capable hosts 
::1  ip6-localhost ip6-loopback 
fe00::0 ip6-localnet 
ff00::0 ip6-mcastprefix 
ff02::1 ip6-allnodes 
ff02::2 ip6-allrouters 

Votre /etc/hostname devrait évidemment être le même que ci-dessus. Redémarrez et vous devriez être en mesure de lancer une requête ping sur votre nom d'hôte avec succès.

Vous pouvez également utiliser socket.gethostbyname(socket.gethostname()) pour obtenir le i.p. par opposition au nom d'hôte

+0

En remarque: il peut s'écouler une minute avant que le port ne soit disponible après le processus. – Daniel

+1

Non, cette erreur spécifique est habituellement '[Errno 48] adresse déjà utilisée' –

+0

j'ai vérifié et ce port n'est pas utilisé – Maria

1

Essayez définir l'option SO_REUSEADDR à la prise:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
Questions connexes