Ist raw socket auf der loopback-Schnittstelle möglich?
Wir versuchen, die Kommunikation mit dem server lauscht auf Linux-loopback-Schnittstelle, über raw-socket und es scheint, dass der server nicht ein einziges Paket von uns. Die Pakete, die wir senden, sind sichtbar in Wireshark.
Ist raw socket auf loopback überhaupt möglich? (Bitte nicht Fragen, warum wir es brauchen: es ist zu kompliziert zu erklären hier)
EDIT: dies ist, wie wir es öffnen
_I_RawSocket = socket( PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))
memset( &ifr, 0, sizeof( ifr ) );
strcpy( ifr.ifr_ifrn.ifrn_name, _InterfaceName);
ioctl( _I_RawSocket, SIOCGIFINDEX, &ifr )
memset( &sll, 0, sizeof( sll ) );
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons( ETH_P_ALL );
bind( _I_RawSocket, (struct sockaddr *) &sll, sizeof( sll ))
Ist der server lighttpd und es ist erreichbar über die normalen socket auf localhost.
netstat --raw druckt leere Tabelle, aber ich bin mir absolut sicher, wir haben zwei funktionelle raw-sockets auf der normalen eth-Geräte.
- Bitte posten Sie: a) Genau, welche Art von Steckdose Sie verwenden, ist es eine AF_PACKET ? b) Wie werden Sie verbindlich sind, sind Sie mit binden oder SO_BINDTODEVICE ? c) Was ist der server und was es versucht zu tun? Können Sie sprechen, um es mit einer IP-socket (vorausgesetzt, hier die IP)? Können, senden Sie die Ausgabe von netstat-roh ?
- Gegeben, dass er für raw-sockets, ich vermute, SOCK_RAW. SOCK_PACKET veraltet ist, sowieso.
- Ich finde das "man 7 packet" - Seite sehr nützlich, bitte Lesen Sie es und sehen, ob das, was er beschreibt, ist konsistent mit dem, was du tust.
- Ich meinte AF_PACKET nicht die veraltete "AF_INET/SOCK_RAW"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Raw-sockets Verhalten sich besonders spritzig mit bind() und connect(), aber ich kann nicht bestätigen, dass dein Problem liegt bei Ihnen. Ich schlage vor, Sie Folgen ein einfacher Ansatz:
Sender
Empfänger
Ich hoffe, diese Verhalten sich genau so wie du willst. Lesen
man 7 raw
für die blutigen details, warum dies funktioniert und wichtigerman 7 packet
wenn Sie wollen, um es zu erweitern. Auch, beachten Sie, dass IPPROTO_RAW impliziert die socket-option IP_HDRINCL, das ist der Grund, warum wir den Bau der ip-header selbst - obwohl die IP-Prüfsumme und Länge berechnet und ausgefüllt, die vom kernel immer noch.edit: außerdem, wenn Sie wollte einen raw-socket mit dem senden von gültigen Daten zu einer Anwendung wie lighttpd, müssten Sie entsprechend die
protocol
argumentsocket()
sowie eine gültige Werte für die IP-header-Felder. Eine korrekte ethernet-header ist nicht zwingend erforderlich - der einzige wichtige Bereich für Sie gefüllt werden, indem die kernel-stack.Bitte stellen Sie sicher, binden if_index