Linux でデータリンク (MAC) レイヤーからパケットを読み取る最も簡単/最短/簡単な方法はどれですか?
誰かがそれを行う方法のコードスニペットを教えてもらえますか?
なぜそれが必要なのですか?ギガビットチップにデータリンク層のみを実装したネットワークカメラを開発しています。IP スタックを実装するためのリソースがないため、MAC アドレスのみを使用してパケットを交換する必要があります。
Linux でデータリンク (MAC) レイヤーからパケットを読み取る最も簡単/最短/簡単な方法はどれですか?
誰かがそれを行う方法のコードスニペットを教えてもらえますか?
なぜそれが必要なのですか?ギガビットチップにデータリンク層のみを実装したネットワークカメラを開発しています。IP スタックを実装するためのリソースがないため、MAC アドレスのみを使用してパケットを交換する必要があります。
これが私が探していたコードスニペットです:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
int main()
{
int s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (s == -1)
{
printf("Error while creating socket. Aborting...\n");
return 1;
}
void* buffer = (void*)malloc(ETH_FRAME_LEN);
while(1)
{
int receivedBytes = recvfrom(s, buffer, ETH_FRAME_LEN, 0, NULL, NULL);
printf("%d bytes received\n", receivedBytes);
int i;
for (i = 0; i < receivedBytes; i++)
{
printf("%X ", ((unsigned char*)buffer)[i]);
}
printf("\n");
}
return 0;
}