0

C言語でネットワークパケットスニッフィングコードを書いています(イーサネットLANで実行しています)。イーサネット ヘッダーを出力しようとしているときに、ちょっとした混乱に遭遇しました。ウィキペディアによると、最初の 8 バイトはプリアンブルと区切り文字で構成され、次の 6 バイトは MAC 宛先アドレスです。

しかし、実際にコードを実行すると、recvfrom 呼び出しから取得したバイトで、最初の 8 バイト (プリアンブルと区切り文字) が欠落していることがわかります。つまり、最初のバイト自体から宛先アドレスの読み取りを開始できます。

ここにコードの関連部分があります

char buffer[BUFFERSIZE];
struct addrinfo servinfo;

servinfo.ai_family = PF_PACKET;
servinfo.ai_socktype = SOCK_RAW;
servinfo.ai_protocol = htons(ETH_P_ALL);

int fd = socket(servinfo.ai_family, servinfo.ai_socktype, servinfo.ai_protocol);
int plen = recvfrom(fd, buffer, BUFFERSIZE, 0, &caddr, &clen);
int c = 0;
printf("Destination Address: %02x:%02x:%02x:%02x:%02x:%02x\n",buffer[c], buffer[c+1], buffer[c+2], buffer[c+3], buffer[c+4], buffer[c+5]);
printf("Source Address: %02x:%02x:%02x:%02x:%02x:%02x\n",buffer[c+6], buffer[c+7], buffer[c+8], buffer[c+9], buffer[c+10], buffer[c+11]);

これは正しい宛先アドレスを出力しますが、バッファ内の最初の 8 バイトをスキップした後に出力することで正しい結果が得られるはずでした。

ここで何が欠けているか、間違っていますか?

4

1 に答える 1

2

これは正しい宛先アドレスを出力しますが、バッファ内の最初の 8 バイトをスキップした後に出力することで正しい結果が得られるはずでした

プリアンブルは非常に低レベルの概念であり、NIC によって厳密に処理されます。によって返されるどころか、OS からも見えませんrecvfrom

于 2013-04-07T08:43:43.663 に答える