我需要将监听套接字绑定到哪个主机?
我使用了Python的socket模块,尝试通过以下代码打开一个监听的socket:
import socket
import sys
def getServerSocket(host, port):
for r in socket.getaddrinfo(host, port, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = r
try:
s = socket.socket(af, socktype, proto)
except socket.error, msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error, msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
return s
这里的host设置为None,端口是15000。
程序可以接受连接,但只能来自同一台机器的连接。我需要做些什么才能接受来自互联网的连接呢?
3 个回答
2
你需要把它绑定到你的公共IP地址,或者绑定到“所有”地址(通常用“0.0.0.0”表示)。
如果你想在网络上访问它,你可能还需要考虑防火墙等问题。
5
第一个问题是,你的异常处理块在出现错误时没有报告任何信息,直接把错误吞掉了。第二个问题是,你试图绑定到一个特定的接口,而不是使用 INADDR_ANY。你可能是绑定到了“localhost”,这样的话只会接受来自本机的连接。
INADDR_ANY 也被称为常量 0x00000000,但使用这个宏会更容易理解。
假设你在使用 IPv4(也就是现在的“普通互联网”),可以从 socket 模块页面 的第一个示例中复制 socket/bind 的代码。
8
试试 0.0.0.0。这是最常用的。