繁体   English   中英

如何在香草Python 3中收听原始以太网帧?

[英]How can I listen for raw ethernet frames in vanilla Python 3?

我正在用Python做一些自我教育的底层网络编程。 我正在使用Ubuntu 18.04Python 3 使用此代码,我能够发送原始以太网数据包:

from socket import socket as Socket, AF_PACKET, SOCK_RAW

def send_bytes(byte_sequence):
    with Socket(AF_PACKET, SOCK_RAW) as socket:
        socket.bind(("enp0s31f6", 0))
        socket.send(bytes(byte_sequence))

我可以使用此过程发送ping。 我知道它正在工作,因为我可以看到ping发出信号并在Wireshark中收到响应。

现在,我想监听数据包,例如对ping的响应。 希望在不涉及任何非标准库的情况下该如何做? 我希望代码尽可能“接近金属”,因此理想情况下,我想监听整个以太网帧,以便我可以手动解析所有内容并弄清楚它是否是我要查找的数据包对于。

这对我有用

import sys
import socket
ETH_P_ALL=3 # not defined in socket module, sadly...
s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind(("eth0", 0))
r=s.recv(2000)
sys.stdout.write("<%s>\n"%repr(r))

创建套接字时的第三个参数充当我们要捕获的传入帧的类型(所有这些都在此处)的过滤器。

ETH_P_ALL常量来自/usr/include/linux/if_ether.h

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM