4

我正在尝试通过 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 端口绑定和接收,然后返回,应该可以工作,对吗?我错过了一步吗?

4

1 回答 1

4

打开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))

根据 Linuxconnect(2)手册页:

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

根据MSDN -connect (Windows Sockets)

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

于 2014-01-26T06:43:28.417 回答