#!/usr/bin/python3 import socket import sys import argparse import signal def signal_handler(sig, frame): print('Programm wurde mit STRG+C beendet.') sys.exit(0) def send_frame(iface): # Erstellt einen RAW-Socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) # Bindet den Socket an die angegebene Schnittstelle s.bind((iface, 0)) # Beispiel eines Ethernet-Frames mit einer leeren Nutzlast # Ethernet Header: Ziel MAC, Quelle MAC, Ethertype (0x0800 für IPv4) dst_mac = b'\xff\xff\xff\xff\xff\xff' # Broadcast MAC-Adresse src_mac = s.getsockname()[4] ethertype = b'\x08\x00' payload = b'Hello, network!' frame = dst_mac + src_mac + ethertype + payload # Sendet den Frame s.send(frame) print(f'Paket gesendet auf {iface}') def receive_frame(iface): # Erstellt einen RAW-Socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) # Bindet den Socket an die angegebene Schnittstelle s.bind((iface, 0)) print(f'Warte auf Pakete auf {iface}...') while True: # Empfängt den Frame frame, addr = s.recvfrom(65535) src_mac = frame[6:12] print(f'Paket empfangen von MAC: {":".join(format(x, "02x") for x in src_mac)}') def main(): parser = argparse.ArgumentParser(description='Einfaches Skript zum Senden und Empfangen von Ethernet-Frames') parser.add_argument('-d', '--device', required=True, help='Netzwerkgerät (z.B. eth0)') parser.add_argument('-m', '--mode', required=True, choices=['senden', 'empfangen'], help='Modus: senden oder empfangen') args = parser.parse_args() # Registriert das STRG+C Interrupt-Signal signal.signal(signal.SIGINT, signal_handler) if args.mode == 'senden': send_frame(args.device) elif args.mode == 'empfangen': receive_frame(args.device) if __name__ == '__main__': main()