2017-09-06 2 views
2

Ich möchte Pakete mit packet_mmap für hohe Paketübertragungsrate senden. Ich schaffte es Pakete mit Paket Buchse im Raw-Modus zu senden, die zu diesem Zweck I L2, L3 angelegt und etc in Puffern und esWie sende ich ein SOCK_DGRAM-Paket mit packet_mmap, ohne mich um die MAC-Adresse zu kümmern?

sendto(fd_socket, NULL, 0, 0, NULL, sizeof(struct sockaddr_ll)); 

jedoch mit schicken, ich will nicht mit Ziel-MAC-Adresse stören . Also wandte ich mich stattdessen Dgram zu. Wenn ich sendto verwenden möchte, gibt es ein Argument für die Ziel-MAC-Adresse. Auch wenn dies nicht das, was ist denn ich wollte in Bezug auf die nicht mit arp Cache betroffen sind und die Angabe Ziel der MAC-Adresse:

sendto(fd_socket, NULL, 0, 0, (struct sockaddr *) ps_sockaddr, sizeof(struct sockaddr_ll)); 

Allerdings fand ich, dass Sende auch mit Paket Buchse verwendet werden darf. http://man7.org/linux/man-pages/man7/packet.7.html Daher füllte ich den Puffer mit IP-Header und so weiter. In diesem Fall gibt send null zurück, da nichts gefunden wird, was gesendet wird, was etwas anderes als Null ist, wenn ein Fehler bei der Übertragung des Pakets vorliegt.

Gibt es eine Möglichkeit, packet_mmap zu verwenden, ohne sich um die L2-Adresse kümmern zu müssen?

Antwort

0

Nein. Wenn Sie einen Packet-Socket im SOCK_DGRAM-Modus verwenden, müssen Sie den L2-Header nicht erstellen, aber Sie müssen immer noch die L2-Adresse angeben, und dann erstellt das System den Header für Sie. (Dies hätte den Vorteil, dass Sie tatsächlich den L2-Teil des Pakets für Sie erstellen, und Sie müssten nicht die Quell-MAC-Adresse angeben, aber Sie müssen immer noch die Schnittstelle angeben, von der das Paket gesendet werden soll und die Ziel-MAC-Adresse .)

Woher weiß das System, wohin das Paket sonst gesendet werden soll? Ich glaube, Sie waren in der Hoffnung,, dass das System auf die IP-Header, die Sie bereits im Paketpuffer erstellt haben, und dann eine Schnittstellenauswahl und ARP-Lookup in Ihrem Namen, aber mit einem Paket-Socket, Sie umgehen umgehen dieser Teil des Netzwerkstapels. (Auch wenn die IP-Adresse nicht auf dem lokalen LAN, es wäre ein Routing-Schritt benötigt -. In der Regel nur zu finden, das Standard-Gateway und ARPing für seine MAC-Adresse)

Jetzt Sie können bekommen die meisten von was (ich denke) Sie wollen mit einem raw Sockel (http://man7.org/linux/man-pages/man7/raw.7.html). In diesem Fall teilen Sie dem Kernel mit, dass Sie die IP-Adresse verwenden, aber nicht auf die höheren Ebenen (> L3) angewiesen sind. Und Sie können in diesem Fall auch Ihren eigenen IP-Header erstellen und die Routing-Entscheidung basierend darauf mit der Option IP_HDRINCL erstellen.

+0

Danke für die Antwort. Ich kam zu der gleichen Schlussfolgerung, dass es keine Möglichkeit gibt, die Ziel-MAC-Adresse während der Verwendung von Packet-Socket kostenlos vom Kernel zu erhalten. Wie für den rohen Sockel, nicht wirklich. Ich wollte die Kernel-Bypass-Methode verwenden, die mit dem Linux-Kernel mitgeliefert wird, um einen höheren Durchsatz als bei herkömmlichen Sockets zu erreichen. – Mass

Verwandte Themen