2015-07-20 4 views
0

Я после этой example,Как решить ошибку сокета python?

#!/usr/bin/python   # This is server.py file 

import socket    # Import socket module 

s = socket.socket()   # Create a socket object 
host = socket.gethostname() # Get local machine name 
port = 12345    # Reserve a port for your service. 
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()    # Close the connection 

, и я получаю эту ошибку, несмотря на хорошую сеть:

>>> s.bind((host, port)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Applications/anaconda/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
socket.gaierror: [Errno 8] nodename nor servname provided, or not known 

Как я могу это исправить?

+2

Какова ценность 'host'? Возможно ли, что 'socket.gethostname()' возвращает недопустимое имя хоста? –

+0

http://stackoverflow.com/questions/15246088/what-does-this-socket-gaierror-mean –

+1

Что произойдет, если вы попробуете: 's = socket.socket (socket.AF_INET, socket.SOCK_STREAM)'? И если это не работает, попробуйте изменить 'host = '''? – shuttle87

ответ

3

Давайте посмотрим на the docs:

socket.gethostname()

Возвращает строку, содержащую имя хоста машины, где интерпретатор Python в настоящее время выполняется.

Если вы хотите знать IP адрес текущего компьютера, вы можете использовать gethostbyname (gethostname()). Эта операция предполагает, что существует действительное сопоставление адреса-хозяина для хоста, и предположение не всегда выполняется.

Примечание: gethostname() не всегда возвращает полный домен ; используйте getfqdn() (см. выше).

Я предполагаю, что это то, что происходит: bind пытается установить IP-адрес для хоста, но он терпит неудачу. Запустите host = socket.gethostbyname(socket.gethostname()) и вместо действительного IP-адреса вы, скорее всего, увидите ту же ошибку, что и при вызове bind.

Вы говорите, что вернувшееся имя хоста действительно, но вы должны убедиться, что оно распознано ответчиком DNS. Работает ли разрешение при выполнении, например, ping {hostname} из командной строки?

Возможные решения будут:

  1. Исправьте локальное разрешение DNS.
  2. Используйте host = socket.getfqdn() (в случае, если вы не получили полное имя, которое тогда не могло быть правильно разрешено). Даже если это работает, я думаю, вы должны попытаться исправить локальное разрешение.
  3. Используйте пустой хост (host = ''), который на bind будет означать «слушать все доступные интерфейсы». (Это первый example в документах.)
Смежные вопросы