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を何度も送りました。どうしましたか?ありがとう。
私の間違い:(ありがとうございました! –