我已经开始学习UDP套接字,但由于某种原因,这段代码会引发错误。为什么这段代码:
{{1}}
抛出提供无效参数的错误?
答案 0 :(得分:6)
UDP数据报通信发生在源端口和目标端口之间。您可以为端口分配bind
呼叫,或者让网络堆栈为您选择一个,只需调用其中一个send / recv方法即可。如果您呼叫sendto
(并且您没有绑定端口),则堆栈将在动态端口范围内分配一个数字。如果你调用recvfrom
,堆栈通常会分配端口0.但是没有端口0.接下来发生的是平台相关的。 Windows将尝试将您绑定为混杂的侦听器。但这是一个特权调用,你可能会得到一个无效的参数错误。但如果你是管理员,它可能会有用 - 我不确定。
要开始对话,发送内容的第一个实体需要知道要使用的目标端口。这意味着接收第一个通信的实体需要事先绑定到另一方知道的端口号。这可能是一个众所周知的端口号,一个硬连线到你的代码中的端口,一个配置文件中的东西,甚至是用LDAP等名称服务协议做广告的东西。
收到第一个数据报后,接收实体现在拥有发件人地址和端口号,因此可以回复。
在您的示例中,您的实体可以就知名端口达成一致并开始对话。这是一个监听端口9999的数据报回显器。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 9999))
while 1:
data, addr = s.recvfrom(8096)
s.sendto(data, addr)
和与之对话的客户
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for i in range(10):
s.sendto(str(i), ('', 9999))
print(s.recvfrom(1024))