我正在尝试通过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端口上绑定和接收,并且被发回,应该可以正常工作吗?我错过了一步吗?
答案 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调用。 从地址以外的地址收到的任何数据报 指定的目的地地址将被丢弃。