首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python3.3实现原始帧捕获?

如何使用Python3.3实现原始帧捕获?
EN

Stack Overflow用户
提问于 2013-12-02 22:42:21
回答 1查看 965关注 0票数 1

注意:我不确定这是编程问题,还是与硬件/OS相关的问题。

我正在尝试使用Python3.3的套接字类捕获原始以太网帧。直接查看PyDoc网站中的示例

代码语言:javascript
复制
import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')

我得到以下错误:

OSError: Errno 97地址家族不受协议支持。

打破了这条特定的路线:

代码语言:javascript
复制
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)

我对代码所做的唯一更改是实际的接口名称(即'em1')。我用的是Fedora 15。

进一步看一下Python代码,似乎AF_CAN (地址系列)和CAN_RAW (协议)并不是正确的一对。

如何捕获用于进一步处理的原始以太网帧?

最终,我需要做的是捕获原始以太网帧,并在进入系统时对它们进行处理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-20 13:39:41

我终于能够做到以下几点:

代码语言:javascript
复制
import socket
import struct
import time


s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))

test = []

while(1):
    now = time.time()
    message = s.recv(4096)
    # Process the message from here
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20339377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档