簡體   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