为什么我不能在Python中接收UDP数据包?

时间:2014-01-26 06:35:57

标签: python sockets udp python-sockets

我正在尝试通过UDP联系A / V设备。我将数据包发送到本地广播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 个答案:

答案 0 :(得分:3)

开启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调用。 从地址以外的地址收到的任何数据报   指定的目的地地址将被丢弃。