2016-05-04 11 views
0

Es wird benötigt, um Rohdaten von einer Schnittstelle zu lesen und über eine andere zu senden.Pakete über RAW-Sockets in Linux erneut senden

offen & & config (das gleiche für sock_raw_outer):

sock_raw_inner = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
setsockopt(sock_raw_inner, SOL_SOCKET, SO_BINDTODEVICE, "eth0", 4); 
struct ifreq if_idx1; 
memset(&if_idx1, 0, sizeof(struct ifreq)); 
strncpy(if_idx1.ifr_name, opt, strlen(opt)); 
ioctl(sock_raw_inner, SIOCGIFINDEX, &if_idx1); 

dann in Zyklus:

data_size = recvfrom(sock_raw_inner, buffer, 65536, MSG_DONTWAIT, NULL, NULL); 
    if (data_size > 0) { 
     struct sockaddr_ll socket_address; 
     socket_address.sll_ifindex = if_idx2.ifr_ifindex; 
     socket_address.sll_halen = ETH_ALEN; 
     //copy dest 
     socket_address.sll_addr[0] = buffer[0]; 
     socket_address.sll_addr[1] = buffer[1]; 
     socket_address.sll_addr[2] = buffer[2]; 
     socket_address.sll_addr[3] = buffer[3]; 
     socket_address.sll_addr[4] = buffer[4]; 
     socket_address.sll_addr[5] = buffer[5]; 
     sendto(sock_raw_outer, buffer, size, 0, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) 
    } 

dann, wenn I auf sock_raw_inner jedes Paket (ARP-Anforderung, zum Beispiel) zu fangen, Es sockte immer wieder auf sock_raw_inner von sendto. Was ist los mit dir? Vielen Dank.

Antwort

0

Ihr sock_raw_inner hört immer noch auf jeder Schnittstelle, da die Bindung auf eth0, die Sie ausführen möchten, nicht unterstützt wird. So wird das Paket zu einer anderen Schnittstelle gesendet Tat wird dann durch Ihre sock_raw_inner empfängt

Auszug aus man (7) Buchse (siehe fett gedruckten Text)

SO_BINDTODEVICE Bind Diese Buchse an ein bestimmtes Gerät wie „eth0“, als spec fied in der übergebenen Schnittstelle Name. Wenn der Name eine leere Zeichenfolge oder die Option Länge ist Null ist, wird die Socket-Gerätbindung entfernt. Die übergebene Option ist ein Null-Term variabler Länge mit der maximalen Größe von IFNAMSIZ. Wenn ein Socket an eine Schnittstelle gebunden ist, werden nur Pakete von dieser bestimmten Schnittstelle vom Socket verarbeitet. Beachten Sie, dass dies nur für einige Socket-Typen funktioniert, insbesondere für AF_INET Sockets. Es wird nicht für Packet-Sockets unterstützt (normal verwenden Bindung (8) dort).

+0

mein Fehler :(Danke! –