Es gibt ein drittes Argument für die socket
Funktion: . Wenn nicht angegeben, wird der Standardwert 0 verwendet. Für AF_PACKET/SOCK_RAW
gibt das Argument an, welche Art von Paketen Sie empfangen möchten. Die Werte sind in der packet(7)
Manpage dokumentiert: http://man7.org/linux/man-pages/man7/packet.7.html
Ich glaube nicht, dass die Werte tatsächlich irgendwo in den Core Python2-Modulen definiert sind. Einige von ihnen können in scapy (http://www.secdev.org/projects/scapy/) gefunden werden, oder Sie können einfach die Linux-Header-Datei suchen, wo sie definiert sind (/usr/include/linux/if_ether.h
).
Also, dieses Problem zu beheben, den Code zu ändern:
from socket import socket, AF_PACKET, SOCK_RAW, htons
ETH_P_ALL = 3
ETH_P_IP = 0x800 # Alternatively using this will receive the next IP packet
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
...
Kommentare auf Ihren Code:
Wie geschrieben, das Paket Sie senden ist unwahrscheinlich, von jedermann verständlich sein. Sie haben eine dst- und src-MAC-Adresse, aber Sie stellen keinen EtherType bereit. Stattdessen wird der erste "[(" wird als der EtherType gesehen. Das wird wahrscheinlich keinen Empfänger des Pakets Sinn machen, so wird es nur verworfen werden.
Auch sollten Sie das mit einem rohen Sockel, Sie verstehen 'wird das nächste Paket des Typs empfangen, den Sie im Protokoll angegeben haben. Das ist nicht unbedingt eine Antwort auf das Paket, das Sie gerade gesendet haben.
Ist das Empfangsende irgendwelche Fehler geben? Was ist die Ausgabe der Druckanweisung? – BrandonM
Der Server, der Nachrichten empfangen sollte immer aktiv sein, aber scheint, dass Sie den Socket geschlossen. –
Nein Ich bekomme keinen Druck von "print response" Brandon. Es wartet auf Sie. Auch nachdem es vom Kunden erhalten hat. –