2020年2月1日このページはこんな方におすすめです自分でパケットキャプチャツールを作ってみたいパケットの構造に興味がある前回はパケットキャプチャでIPヘッダーの表示を行いました。今回はUDPヘッダーの解析と表示をおこないます。UDPヘッダーは単純な構造のため、UDPヘッダーの解析ができればTCPやICMPでも同様に対応できるはずです。UDPヘッダーの構造については次の記事を参照してください。上位プロトコルの判定UDPヘッダー値を表示するサンプルコードと実行例サンプルコードまとめパケットキャプチャツールのつくり方ヘッダーファイル取り扱いについての注意macOS、BSDとLinuxで共通のコードを記述する場合は対策をしないとUDPヘッダーの構造体定義が異なるためコンパイルエラーになります。幸いにもLinuxにはBSD形式の構造体が用意されていて「__FAVOR_BSD」を定義することで使用することができるようになります。具体的にどうするのかというと、以下のようにnetinet/udp.hをincludeする前に__FAVOR_BSDを定義します。__FAVOR_BSD#endifUDPヘッダーのマッピング方法この方法はTCPやICMPでも同様の方法です。パケットの中でUDPヘッダーの先頭へアクセスするためには、IPヘッダーのサイズを知る必要があります。IPヘッダーのサイズを4オクテット単位で表しているため、ip_hlの値を4倍することによってIPヘッダーのサイズを知ることができます。今回のサンプルコードでは、以下のようにしてUDPヘッダーが格納されているメモリアドレスを計算しています。(ip->ip_hl<<2));このようにip_hlを左へ2ビットシフトした値をポインタipに加算しています。調べることによって知ることができます。どのような値が定義されているのかについてはヘッダーファイルのnetinet/in.hを見てください。サンプルコードでは、以下のようにしてプロトコルによる処理の振り分けをおこなっています(まだUDPしか処理していません)。IPPROTO_ICMP:default:break;}UDPヘッダー値を表示するUDPヘッダーの表示はIPヘッダーでのやり方と変わりません。バイトオーダーに注意して各フィールドの値を表示するだけです。サンプルコードでは、以下のようにしています。ntohs(udp->uh_sum));サンプルコードと実行例サンプルコードサンプルコードはGitHubからも落とせます。0;}コンパイルは以下のようにします。pcap”が必要であることに注意してください。53」を引数として渡すことで、DNSパケットのみ受信しています。まとめUDPヘッダーはとても単純なため、UDPヘッダーを表示させられるようになれば、TCPやICMPも簡単に対応できますから、興味のある方は是非UDPヘッダーを自在に表示できるようになってください。ネットワークプログラミングのオススメ本は、やはり「UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI・ソケットとXTI」で決まりです。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。