为什么我无法在Python中接收UDP数据包?

4

我正在尝试通过UDP与音视频设备通信。我向本地广播192.168.0.255发送一个数据包,它会回复有关该设备的信息。我可以使用Wireshark验证其有效性。然而,在Python中我从未收到响应,程序一直处于等待状态:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #Internet, UDP
s.bind(('', 64000))
#s.sendto('0:0',('192.168.0.255',63630))
s.connect(('192.168.0.255',63630));
s.send('0:0')
#s.listen(1)
data,addr = s.recvfrom(1024)
print data
print 'from', addr

我从随机端口64000发送,到端口63630,因此在64000端口绑定和接收它被发送的信息,再将其发送回来,这样应该可以运行,对吗?我有遗漏步骤吗?

1个回答

5

打开SO_BROADCAST选项以发送广播消息:

s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

同时替换以下内容

s.connect(('192.168.0.255',63630))
s.send('0:0')

使用:

s.sendto('0:0', ('192.168.0.255',63630))

根据Linux的connect(2)手册:

如果sockfd套接字的类型为SOCK_DGRAM,则addr是默认发送数据报的地址,也是接收数据报的唯一地址

根据MSDN - connect (Windows Sockets)

对于无连接的套接字(例如,SOCK_DGRAM类型),connect执行的操作仅是建立一个默认目标地址,该地址可在随后的send/WSASend和recv/WSARecv调用中使用。 从指定目标地址以外的地址接收到的所有数据报都将被丢弃。


但它正在发送广播,否则设备IP就不会收到,对吗? - NoBugs
@NoBugs,为了明确广播是否存在问题,请尝试向特定IP地址(A/V设备的IP地址)发送消息。 - falsetru
@NoBugs,Python中的广播功能可行。也许路由器不允许广播...或者A/V设备不接受广播? - falsetru
@NoBugs,如果您将s.connect(('192.168.0.255',63630)); s.send('0:0')替换为s.sendto('0:0', ('192.168.0.255',63630))会发生什么? - falsetru
@NoBugs,我在答案中添加了解释(引用)。请看一下。 - falsetru
显示剩余2条评论

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