MasaのITC Life

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

プログラミング

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

投稿日:2019年8月12日 更新日:


基本的には、TCP/UDPセグメントを

わざわざRawソケットを使う必要ありません。



SOCK_DGRAMを使った方が

コードもシンプルになりますし、

そっちの方が簡単です。



しかし時にはUDPセグメントを

Rawソケットから送らなければならない

という場面に遭遇するかもしれません。



Rawソケットから作成した方が、

柔軟性には長けますね。



というわけで自分で一から

UDPセグメントを組み立てて送信します。

データにはHello Worldを入れます。




ソースコードの流れはシンプルです。

まずはRaw Socketを用意します。



そしてインタフェース名から

自分のMACアドレスを取得して、

Ethernet、IP、UDPの各フィールドに

適切な値を入れて送信するだけです。




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


UDPをRawソケットで送ってみよう



コードはこちらです。


読み込むライブラリ、UDPパケット、

チェックサム計算用の疑似ヘッダー

を定義しています。



ブロードキャストのアドレスなども

マクロで定義しています。



DHCPのDiscoverを想定して、

送信元IPアドレスや宛先IPアドレスを

設定してあります。



もしユニキャストしたい場合は、

任意に変更すれば指定した相手に届きます。




送信するためにソケットを用意する関数です。

Raw Socketを作成して、

それをインタフェースにBindしています。


 



IPヘッダとUDPヘッダの

チャックサムを計算する関数です。



指定したインターフェースの

MACアドレスを取得する関数です。



フレームを組み立てて、

送信まで行う関数です。



main関数です。プログラム実行時に、

インタフェースも一緒に指定します。

あとHello World!は、

ここで文字配列に入れています。

scanfなどで標準入力から読み込むのもありですね。




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



宛先が同一セグメント内への

ブロードキャストなので、

同一セグメントに所属している

他のPCでパケットキャプチャしてます。



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


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


-プログラミング

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