在Python中创建UDP套接字时应该使用哪个主机?

4

我想要接收通过VPN发送的UDP数据包。因此,我用Python编写了(大部分是复制的)这个程序:

import socket
import sys

HOST = ??????? 
PORT = 80


# SOCK_DGRAM is the socket type to use for UDP sockets
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.bind((HOST,PORT))
data,addr = sock.recv(1024)
print "Received: %s" % data
print "Addr: %s" % addr 

我应该使用什么作为主机?我知道发送者的IP,但似乎任何非本地的东西都会给我带来socket.error: [Errno 10049]。是VPN给我的IP(与发送方发送到的IP相同)?还是只使用本地主机?

3个回答

10

host参数是您要绑定到的主机IP。指定其中一个接口的IP(例如,您的公共IP或本地主机的127.0.0.1),或使用0.0.0.0来绑定到所有接口。如果您绑定到特定接口,则服务仅在该接口上可用 - 例如,如果您想运行只能通过localhost访问的内容,或者如果您有多个IP并需要在每个上运行不同的服务器。


“绑定到这个IP”是指“监听发送到该IP的数据”吗? - c0m4

3
"

0.0.0.0"将监听所有传入的主机。例如,

"
sock.bind(("0.0.0.0", 999))
data,addr = sock.recv(1024)

你为什么使用999端口?只是一个例子还是我也应该使用999端口? - c0m4
只是一个例子。但我在我的Python上运行了它 - 没有错误。 - gimel
2
为了绑定到所有本地IP地址,我发现socket.INADDR_ANY比0.0.0.0更清晰。 - bortzmeyer

3

使用:

sock.bind(("", 999))

1
你说得对。通常我会在发布之前测试即使是微不足道的代码片段,但这次似乎没有。在Python中绑定到INADDR_ANY的正确方法是将元组的主机地址部分传递为空字符串。我会更正我的答案,感谢你指出这一点。 - Lance Richardson

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