Python 我必须将侦听套接字绑定到哪个主机?
我使用python的套接字模块,并尝试使用Python 我必须将侦听套接字绑定到哪个主机?,python,networking,sockets,network-programming,Python,Networking,Sockets,Network Programming,我使用python的套接字模块,并尝试使用 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, can
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
其中主机为无,端口为15000
然后,程序将接受连接,但只接受来自同一台机器上的连接。我必须做什么才能接受来自internet的连接?尝试0.0.0.0。这是最常用的。您需要绑定到公共IP地址或“所有”地址(通常用“0.0.0.0”表示)
如果您试图通过网络访问它,您可能还需要考虑防火墙等。第一个问题是,您的except块正在吞咽错误,而没有生成报告。第二个问题是,您试图绑定到一个特定的接口,而不是任何接口。您可能正在绑定到“localhost”,它将只接受来自本地计算机的连接 INADDR_ANY也称为常量0x00000000,但宏更有意义
假设您使用的是IPv4(也就是现在的“常规internet”),请从上的第一个示例复制套接字/绑定代码。我该怎么做?我知道两台电脑都在不同的无线路由器后面。很难回答。首先尝试一下(这可能不是问题),但您需要找到如何配置涉及的每个设备。通常只有“服务器”端需要特别注意,因为默认情况下,传出的数据包通常不会被过滤。但服务器故障可能是一个更好的地方来获得答案。没有提到任何关于接口的内容。socket.INADDR\u是否会替换socket.AF\u unsec或socket.SOCK\u STREAM?在您的情况下,该接口由绑定到的地址暗示,即变量
sa
。引用该手册页面:“对于IPv4地址,接受两种特殊形式而不是主机地址:空字符串表示INADDR_ANY…”。调用getaddrinfo
将返回一个地址列表,其中没有一个地址不存在。