2016-05-04 20 views
0

1つのインターフェイスから生データを読み込んで別のインターフェイス経由で送信する必要があります。次いでLinuxのRAWソケット経由でパケットを再送信

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)) 
    } 

、Iはsock_raw_innerに(例えばARP要求)任意のパケットをキャッチした場合、:

オープン& &設定(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); 

sendtoによってsock_raw_innerを何度も送りました。どうしましたか?ありがとう。

答えて

0

あなたが実行しようとしているeth0のバインドはサポートされていないため、あなたのsock_raw_innerは引き続きすべてのインターフェイスをリッスンしています。だから、別のインターフェイスに送信されたパケットは、確かにその後、男からあなたsock_raw_inner

エキスで受信される(7)ソケット(太字テキストを参照)

SO_BINDTODEVICEは「eth0の」のような特定のデバイスにこのソケットをバインド 、渡されたインターフェイス名で指定されたとおりになります()。名前が空の 文字列であるか、オプションの長さがゼロの場合、ソケットデバイスバインド が削除されます。渡されるオプションは、最大サイズがIFNAMSIZの可変長ヌルtermi- ネーティブされたインターフェイス名文字列です。 ソケットがインターフェイスにバインドされている場合は、その特定のインターフェイスが から受信したパケットだけがソケットによって処理されます。 これは一部のソケットタイプ、特にAF_INET ソケットでのみ機能することに注意してください。 パケットソケット(通常は bind(8)を使用してください)ではサポートされていません。

+0

私の間違い:(ありがとうございました! –

関連する問題