スポンサーリンク

プログラミング

【C言語】UDPセグメント(HelloWorld!)をRawソケットで送信する!

投稿日:

基本的には、TCP/UDPセグメントをわざわざRawソケットを使う必要ありません。SOCK_DGRAMを使った方がコードもシンプルになりますし、そっちの方が簡単です。しかし時にはUDPセグメントをRawソケットから送らなければならない場面に遭遇します。例えば、DHCP(BOOTP)のdiscoverを送信する時点ではまだ、クライアントにはIPアドレスが割り振られていません。こういうときはRawソケットを作成して、自分でフレームを組み立てて送信します。



ソースコードの流れはシンプルです。まずはRaw Socketを用意します。そしてインタフェース名から自分のMACアドレスを取得して、Ethernet、IP、UDPの各フィールドに適切な値を入れて送信するだけです。



それではやってみましょう!

読み込むライブラリ、UDPパケット、チェックサム計算用の疑似ヘッダーを定義しています。ブロードキャストのアドレスなどもマクロで定義しています。 DHCPのDiscoverを想定して、送信元IPアドレスや宛先IPアドレスを設定してあります。もしユニキャストしたい場合は、任意に変更すれば、指定した相手に届きます。


送信するためにソケットを用意する関数です。
Raw Socketを作成して、それをインタフェースにBindしています。


IPヘッダとUDPヘッダのチャックサムを計算する関数です。


指定したインターフェースのMACアドレスを取得する関数です。


フレームを組み立てて、送信まで行う関数です。


main関数です。プログラム実行時に、インタフェースも一緒に指定します。あとHello World!はここで文字配列に入れています。scanfなどで標準入力から読み込むのもありですね。




実行結果はこんな感じになります。

宛先が同一セグメント内へのブロードキャストなので、同一セグメントに所属している他のPCでパケットキャプチャしてます。

しっかり送信されていました!


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


スポンサーリンク

-プログラミング

Copyright© 無線&ネットワーク屋 , 2019 All Rights Reserved Powered by STINGER.