Ich schreibe Code, um rohe Ethernet-Frames zwischen zwei Linux-Boxen zu senden. Um das zu testen, möchte ich nur einen einfachen Client senden und Server empfangen.Linux Roh-Ethernet-Socket binden an spezifisches Protokoll
Ich habe den Client richtig Pakete (ich kann sie mit einem Paket-Sniffer sehen).
Auf der Serverseite initialisieren ich die Fassung wie folgt:
fd = socket(PF_PACKET, SOCK_RAW, htons(MY_ETH_PROTOCOL));
wo MY_ETH_PROTOCOL
ein 2-Byte-Konstante I als Ethertyp verwenden ist so höre ich keinen äußeren Netzwerkverkehr.
, wenn ich diese Buchse an meine Schnittstelle binden muss ich es ein Protokoll wieder in der socket_addr struct passieren: socket_address.sll_protocol = htons(MY_ETH_PROTOCOL);
Wenn ich den Code wie folgt kompilieren und ausführen, dann scheitert es. Mein Server sieht das Paket nicht. Aber wenn ich den Code so ändere:
socket_address.sll_protocol = htons(ETH_P_ALL);
Der Server kann dann das Paket vom Client gesendet (sowie viele andere Pakete), so muss ich einige Überprüfung des Pakets zu sehen, dass esentspricht.
Aber ich möchte nicht, dass mein Server Datenverkehr empfängt, der nicht auf dem angegebenen Protokoll gesendet wird, also ist dies keine Lösung. Wie mache ich das?
Kannst du den Code einfügen, wo du deine 'socket_address' eingerichtet hast? – bstpierre