2013-12-02 3 views
0

Примечание. Я не уверен, что это проблема программирования или проблема, связанная с оборудованием/ОС.Как реализовать захват необработанного кадра с помощью Python 3.3?

Я пытаюсь захватить необработанные сетевые кадры с использованием класса сокетов Python 3.3. Глядя прямо на пример из PyDoc's website:

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] Address family not supported by protocol.

нарушение в этой конкретной линии:

s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW) 

единственные изменения, которые я сделал в код был фактическим именем интерфейса (т.е. «em1»). Я использую Fedora 15.

Оглядываясь дальше в исходный код Python, показывает, что AF_CAN (семейство адресов) и CAN_RAW (протокол) являются неправильной парой.

Как я могу захватить необработанные ракеты Ethernet для дальнейшей обработки?


В конечном итоге то, что мне нужно, это захватить необработанные ракеты Ethernet и обработать их, поскольку это входит в систему.

ответ

0

я, наконец, смог сделать это с помощью следующих действий:

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 
+0

Я использую ту же строку в моей программе: s = socket.socket (socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0003)) и получить ошибку, что .. _sock = _realsocket (family, type, proto) socket.error: [Errno 1] Операция не разрешена .. что я должен использовать вместо этих параметров? –

+0

Вы работаете в Linux? Если это так, вам нужно будет работать как суперпользователь. – KronoS

+0

Я использую Linux, но как я могу это сделать, если я использую фреймворк Django? –

Смежные вопросы