Unixネットワークプログラミング入門でTCPとUDPをあつかったので、その勢いでデータリンク層をあつかってみます。
2章は基本。
TCP,UDPと同じようにsocketを使えばいい
soc = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)))
ちなみにTCPの場合はこんな感じ
soc = socket(AF_INET, SOCK_STREAM, 0))
続いてbind
sa.sll_family=PF_PACKET; sa.sll_protocol=htons(ETH_P_IP); sa.sll_ifindex = ifreq.ifr_ifindex; bind(soc,(struct sockaddr *)&sa, sizeof(sa))
と、socをインターフェースに関連付ける
TCPの場合もbindでアドレスとポートに結びつける
me.sin_family = AF_INET; me.sin_addr.s_addr = htonl(INADDR_ANY); me.sin_port = htons(port); bind(soc_waiting, (struct sockaddr *)&me, sizeof(me))
まだ2章までしか読んでいないが、3章でパケットキャプチャ、4章でブリッジ、5章でルータを書いていくという流れになっていて、楽しみ。
ちなみに初心者向けではなくて、著者の暗黙の前提のあたりは説明がさくっと省かれている。 Unixネットワークプログラミング入門を読んでなかったら速攻挫折してたと思う。
ちなみにサンプルコードはmacでは動かない。