gpt4 book ai didi

python - socket.recvfrom(1024) 抛出 socket.error 提供的参数无效

转载 作者:行者123 更新时间:2023-12-05 08:57:10 25 4
gpt4 key购买 nike

我已经开始学习 UDP 套接字,但出于某种原因,这段代码会引发错误。为什么这段代码:

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
x=s.recvfrom(1024)

抛出提供的参数无效的错误?

最佳答案

UDP 数据报通信发生在源端口和目标端口之间。您可以使用 bind 调用分配一个端口,或者让网络堆栈通过简单地调用其中一种发送/接收方法来为您选择一个端口。如果您调用 sendto(并且您没有绑定(bind)端口),堆栈将在动态端口范围内分配一个数字。如果您调用 recvfrom,堆栈通常会分配端口 0。但是没有端口 0。接下来发生的事情取决于平台。 Windows 将尝试将您绑定(bind)为混杂的监听器。但这是一个特权调用,您可能会收到无效参数错误。但如果您是管理员,它可能会起作用 - 我不确定。

要开始对话,第一个发送内容的实体需要知道要使用的目标端口。这意味着接收第一次通信的实体需要绑定(bind)到对方事先知道的端口号。这可能是众所周知的端口号、硬连线到您的代码中的端口、配置文件中的某些内容,甚至是使用名称服务协议(protocol)(如 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))

关于python - socket.recvfrom(1024) 抛出 socket.error 提供的参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com