【发布时间】:2016-12-06 18:30:19
【问题描述】:
我想用在树莓派上运行的 python 编写一个数据包分析器。 它应该分析 OSC(开放声音控制)和 Art-Net(舞台灯光协议)。两者都是 UDP 数据包 - 我使用以下代码,可在此处找到:http://www.binarytides.com/python-packet-sniffer-code-linux
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
while True:
print s.recvfrom(65565)
如果目标 ip 是树莓派的 ip,一切正常。我想接收网络中的所有 udp 流量,还有不是发送到树莓派的数据包,以显示服务器发送到另一个客户端的数据包。
我可以在这里更改什么来做到这一点?
【问题讨论】:
-
如果没有
bind,请不要接收。socket.IPPROTO_UDP只接收您的数据包。什么是s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)、s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 3)、s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) -
将其更改为 s = socket.socket(socket.AF_PACKET , socket.SOCK_RAW) s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 3) s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON ) 现在出现错误: Traceback (最近一次调用最后一次): File "ArtSniffer/test.py", line 3, in
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 3) File "/usr/lib/ python2.7/socket.py",第 224 行,方法返回 getattr(self._sock,name)(*args) socket.error: [Errno 92] 协议不可用 -
现在它可以在 Windows 下工作 - 但也没有来自“不是我的 ip”的数据包
-
我使用wireshark 进行了故障排除,它也没有捕获具有我以外IP 的OSC 数据包。同样通过 wifi 或电缆。
-
UDP 数据包需要 2 个套接字绑定(服务器、客户端),如果您的设备(ETH)不是网关,则无法获取 UDP 数据包!因此,如果连接类型为 Point_To_Point (UDP),则无法收集数据。一些交换机克隆所有数据包并推送到所有通道(端口)(不是网关),您可以转储所有数据包。在网关之前定义一个重定向器,用于转储每个数据包(重定向器:
Clients ---> Gateway ---> Your_Machine --> Gateway --> Global_interface或Clients ---> Your_machine --> Gateway --> Global_interface)。
标签: python sockets networking