操作系统错误 [Errno 99] - Python

4

我希望能够执行以下简单的服务器代码:

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() 

执行时出现以下错误:
OSError: [Errno 99] Cannot assign requested address

为什么操作系统无法将指定的端口与地址绑定?

2
你可能想要使用 host = '0.0.0.0'socket.gethostname() 返回的是主机名,而不是 IP 地址。 - Valentin Lorentz
我同意@ValentinLorentz的观点,你应该尝试具体说明IP地址或使用0.0.0.0。看起来你的gethostname()返回了一个IP地址/名称,但它并没有解析到你正在执行脚本的主机上存在的IP地址。 - Romuald Brunet
你在问题中提到的代码并没有产生这个错误。它在Windows 8上使用Python v2.7运行良好。请也展示一下客户端的代码! - ρss
@maria,只需尝试这个 host = '0.0.0.0' 然后看看会发生什么? - ρss
1
它可以使用IP地址工作,但无法使用主机名。 - Maria
显示剩余4条评论
2个回答

1
如果使用IP地址可以工作,但使用主机名无法工作。
您应该在您的/etc/hosts文件中有类似于将IP映射到主机名的内容。
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

你的/etc/hostname应该和上面的一样。

重启后,你应该能够成功ping通你的主机名。

你也可以使用socket.gethostbyname(socket.gethostname())来获取IP地址,而不是主机名。


顺便提一下:在终止进程后,端口可能需要一两分钟才能可用。 - Daniel
2
不好意思,这个特定的错误通常是[Errno 48] Address already in use - Romuald Brunet
当您ping您的主机名时会发生什么? - Padraic Cunningham
@maria /etc/hosts和/etc/hostname里面有什么? - Padraic Cunningham
好的,我会编辑我的回答以避免有很多注释。你需要在etc/hosts文件中添加详细信息。 - Padraic Cunningham
显示剩余4条评论

1
尝试将 SO_REUSEADDR 选项设置到套接字中:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

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