MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

recvで受信しEthernetヘッダを表示してみた

投稿日:2019年6月2日 更新日:

データリンク層を扱えるソケットを使って、受信したデータのEthernetヘッダを表示してみました。自分でEhternetフレームを定義する必要はなく、すでにライブラリに準備されています。


Linuxの"net/ethernet.h"で定義されているEthernetヘッダは以下の通りです。

コードは以下です。Ethernet以外にも各階層毎に様々なプロトコルがあります。なので、それぞれに対応したコードをmain関数に詰め込むと大変なことになりますので、本当はEthernetヘッダを表示させるための機能をまとめた関数を別に定義させるべきです。今回は、Ethernetだけしか対応していないのでmain関数に詰め込みました。

 

socketの生成をしたら、recvで受信したデータをbufに格納します。データはchar型にただ詰め込まれただけなので、操作したいプロトコルに対応した型に変換してやる必要があります。上述したように、各型はlinuxで定義されています。


あと、MACアドレスは、"〇:〇:〇:〇:〇:〇"の形で表示させるために、snprintfで文字列に変換してあげる必要がります。なのでmain関数とは別に変換のための関数が定義されています。


このプログラムはenp0s8というインターフェースで動かしているので、enp0s8に向けて例えばpingを通せば、Ehternetヘッダが表示されます。またインタフェース名を変えれば、そのインタフェース上で動かせます。



最後まで読んでいただきありがとうございました。

-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.