Ich versuche, rohe Ethernet-Frames zu senden und zu empfangen, um ein Netzwerkgerät als Medienzugriffscontroller in einer Simulationsumgebung einzuschließen. Daher ist es wichtig, dass das Empfangen der Pakete durch nicht blockierende Anweisungen funktioniert.Ethernet-Framelänge auf Raw-Socket (nicht blockierend) erhalten
Jetzt funktioniert das Senden der rohen Ethernet-Frames, aber es gibt eine Sache über den Empfangspfad, der mich verwirrt: Woher weiß ich, wo der eine Frame endet und der andere Frame beginnt.
Was im Grunde ist ich tun, um eine Raw-Socket zu öffnen:
device.socket = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
es sich als nicht blockierende Einstellung:
flags = fcntl(s,F_GETFL,0);
assert(flags != -1);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
und rufen dann die recv() Funktion zyklisch die Daten erhalten aus der Sockel:
Aber soweit ich weiß die recv() - Funktion gibt nur die Anzahl der Bytes zurück, das ist momentan im Empfangspuffer verfügbar und daher weiß ich nicht, ob ein anderer Frame startet oder ob ich noch das "alte" Paket lese.
Und wegen der Tatsache, dass die Länge des Ethernet-Rahmens nicht in der Kopfzeile enthalten ist, kann ich das nicht alleine machen.
Vielen Dank im Voraus!
https://en.wikipedia.org/wiki/Ethernet_frame See. –
Ich weiß, wie das Ethernet-Protokoll funktioniert, aber wie hilft mir das? Die einzige Information in der Kopfzeile ist der Typ, der die Länge des Rahmens enthalten kann, aber nicht notwendig wird! –
Das Feld "EtherType" hat zwei Oktette mit der Payload-Länge. Damit können Sie die Gesamtbildgröße bestimmen. –