3

CでTAPインターフェースにパケットを書き込む方法を知っている人はいますか? それとも他の言語ですか?

自分でイーサネット データグラムを作成しましたが、それを特定のタップ インターフェイスに書き込みたいと考えています。

ありがとう!:)

TAPについて: http://en.wikipedia.org/wiki/TUN/TAP

4

1 に答える 1

9

ip tuntap add( を使用して)既に TAP インターフェイスを作成していると仮定すると、 Packet Socketを使用してそれにデータを書き込むことができます (詳細については、試してみman 7 packetてください)。

まず、 を使用int sockfd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))してパケット ソケットを作成します。

2 番目のステップは、TAP インターフェイスのインターフェイス インデックス( )を見つけることです。ifindexコマンドip linkを実行して、各行の先頭にある数字を書き留めてください。例えば、

[nav@blumarine Test02]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: p12p1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
    link/ether 00:26:b9:24:82:16 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT qlen 1000
    link/ether c4:17:fe:8c:f7:c8 brd ff:ff:ff:ff:ff:ff

の ifindex はlo1 になり、 の ifindex はeth03 になります。

3 番目のステップは、 APIsockaddr_llに渡す構造を入力することです。sendto()この構造体は、パケットの宛先アドレスに関する情報を保持するために使用されます。正確に次のように入力します。

struct sockaddr_ll SendSockAddr;
SendSockAddr.sll_family   = AF_PACKET;
SendSockAddr.sll_halen    = ETH_ALEN;
SendSockAddr.sll_ifindex  = ifindex;   // The number we just found earlier..
SendSockAddr.sll_protocol = htons(ETH_P_ALL);
SendSockAddr.sll_hatype   = 0;
SendSockAddr.sll_pkttype  = 0;

最後に、 を使用sendto()してパケットを送信します。man 3 sendtoの詳細情報sendto()man 7 packet洞察を得るために使用しstruct sockaddr_llます。

幸運を :)

于 2013-02-11T17:55:51.180 に答える