这个 socket.gaierror 是什么意思?

63

我是Python的新手,正在学习《核心Python应用程序》第三版。这是第一个例子,但是我已经遇到了问题。以下是代码和末尾的错误信息。

#!/usr/bin/env python

from socket import *
from time import ctime

HOST = ' '
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

    while True:
        print 'waiting for connection...'
        tcpCliSock, addr = tcpSerSock.accept()
        print "...connected from:", addr

        while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send("[%s] %s" % (ctime(), data))

    tcpCliSock.close()
tcpSerSock.close()

Traceback (most recent call last):
  File "tsTserv.py", line 12, in <module>
    tcpSerSock.bind(ADDR)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

这是什么意思?
3个回答

61
这意味着您提供的主机名''无效(gai代表getaddrinfo())。
正如NPE已经说明的那样,也许空字符串''比空格' '更合适。

10
这个回答对除了原帖作者以外的其他人更有用——也就是那些在他们的小型TCP echo服务器中没有写入HOST=''的人。比如我,我只是想知道这是什么类型的例外。所以感谢您解释了gai代表什么。 - Tomasz Gandor

19

这个

HOST = ' '

应该阅读

HOST = ''

(即引号之间没有空格)。

您出现错误的原因是' '不是有效的主机名。在这种情况下,''有特殊含义(它基本上意味着“所有本地地址”)。


1
你的代码使用TCP协议连接到一个端口为"PORT"的主机,并发送自己一个消息,其中网络缓冲区大小为1024。错误是由于空格引起的。应该是"HOST = ''",这样它将连接到自己。或者,我认为你可以使用"localhost"或"127.0.0.1"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接