2016-05-18 7 views
0

パケットが自分のマシンに送られているかどうかにかかわらず、すべての着信パケットを受信し、転送されるか、パケットがローカルホスト宛てであると考えられるアプリケーションを作成します。AF_PACKETソケットをすべてのインターフェイスにバインドする

私はこの目的のためにAF_PACKETソケットを開いています。しかし、私のマシンは複数のインターフェースを持っているので、ソケットを複数のインターフェースにバインドして、どのインターフェースからでもすべての着信パケットを捕捉することができます。

次のコードセグメントは、ソケットを1つのインターフェイスにバインドします。どのようにしてすべてのインターフェイスにバインドするように変更できますか?また、いくつかのインターフェイスセットにバインドするにはどうしたらいいですか?同じソケットでバインドを複数回呼び出すと、別のインターフェイスとバインドできますか? man socketを行う

strncpy ((char *) ifr.ifr_name, interface, IFNAMSIZ); 
ioctl (sock, SIOCGIFINDEX, &ifr); 
sll.sll_family = AF_PACKET; 
sll.sll_ifindex = ifr.ifr_ifindex; 
sll.sll_protocol = htons (ETH_P_IP); 

if(bind (sock, (struct sockaddr *) &sll, sizeof (sll))) 
{ 
    perror("Bind"); 
    exit(1); 
} 

//len = recvfrom(sock, rec_buff, 5000,0,(struct sockaddr *)&client_addr, &addr_len); 
len = read(sock, rec_buff, 5000); 

答えて

3

を与える:

AF_PACKET低レベルのパケットインターフェースパケットを(7)

man 7 packetが得られる:

デフォルトで指定されたプロトコルタイプのすべてのパケットをパケットソケット に渡されます。特定のインターフェイスからのパケットだけを取得するには、 bind(2)パケットソケットをインターフェイスにバインドするためのstruct sockaddr_llのアドレスを指定します。 sll_protocolフィールドと sll_ifindexアドレスフィールドのみがバインディングの目的で使用されます。

少なくとも、マニュアルページによれば、すべてのインターフェイスからキャプチャする場合は、単にソケットをバインドしないでください。

1つのソケットを複数のインターフェイスにバインドすることはできません。サブセットを取得する場合は、複数のソケットを作成してそれらをすべてバインドします。 selectを使用するか、そのうちの1つ(Linuxではepoll_pwait)を使用して、いずれかがパケットを受信するまで待ちます。

関連する問題