今回はDHCPのdiscoverパケットを送信してみました。Boxで構築したネットワークを使用しています※DHCPパケット送信できるかという勉強目的なので、実際はDHCPクライアントに既にIPアドレスが割り振られていいます(192.168.198.3)ということでコードの方を見ていきます。最終的にはDHCPを実装するコードを完成させようかと思っています。手始めに今回は、クライアント側がDHCPのdiscoverをブロードキャストするだけのコードです。*client_mac);まずはDHCPのフォーマットに従い、DHCPパケットの構造体を定義します。DHCPパケットの各フィールドに対応したパラメータを定義します。ついでに、使用するポート番号なども書きます。soc;}ソケットを作成しないとパケット送信などが出来ないので、まずはソケットを作成します。DHCPはUDP上で使うので、UDPソケットを作ります。このときにソケットのオプションをいじります。DHCPはUDPを使ったブロードキャストをするので、setsockopt関数でSO_BROADCASTを有効にします。あとは今後のこと(DHCPの本格的実装)を考えて、setsockopt関数でSO_REUSEADDRを指定し、ソケットの再利用を可能にしておきます。hwaddr;}これはクライアントのMACアドレスを取得するための関数です。DHCPのDiscoverパケットを送信するとき、chaddrフィールドにクライアントのMACアドレスを入れます。ioctl(SIOCGIFHWADDR)で送信するインタフェースのMACアドレスを取得して、それを戻り値として返します。TRUE;}DHCPのDiscoverを組み立てて、送信まで行う関数です。最初に定義したDHCPフォーマットの各フィールドに値を入れていきます。op:クライアントからサーバに送るので、BOOTREQUESTを入れます。htype:ハードウェアはethernetなので、値1を定義したHTYPE_ETHERを入れます。hlen:ethernetアドレスは6バイトなので、値6を定義したHTYPE_ETHER_LENを入れます。hops:リレーエージェントが何回経由したかを示すフィールドなので、クライアント側送信時点では0をセットします。xid:トランザクションIDのことで、DiscoverからAckまで、DHCP一連の流れで一貫したランダム値が使われます。srandで現時刻を種として、ランダム値を生成し、それをxidにセットします。secs:DHCPサーバによって払い出されたIPアドレスのリース残り期間を示しますが、Discoverの時点では0xFFをセットします。flags:2Bytes(16Bits)の中の最初の1ビット目に1をセットし、残りのビットには0をセットします。giaddr:Discover送信時点では0が入ります。chaddr:クライアントのMACアドレスが入ります。0x63の4バイトに数字が必要です。Protocol)とフォーマットがほとんど同じです。Cookieで「このパケットはDHCPですよ」と識別しています。あとはオプションを指定します。Typeとして、DHCP_DISCOVERを指定します。0;}main関数です。実行時に使用するインタフェース名を指定してます。流れとしては、まずソケットを作成して、その次にそのソケットを使って、インタフェースのMACアドレスを取得します。DHCPのDiscoverパケットを送信する関数に渡します。実行結果は以下の感じになります。ブロードキャストなので、DHCPサーバとDHCPクライアント(ゲストOS)以外のPC(ホストOS)でパケットキャプチャしました。送信成功です!最後まで読んでいただきありがとうございました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。date*日本語が含まれない投稿は無視されますのでご注意ください。実現するには様々な方法が存在します。その一つにマルチプロセス化があります。処理を進めていく方法です。簡単にまとめておこうと思います。それをプロセスに通知します。してもbindエラーになってしまう。...【マルチスレッド=浮気!?】実際にC++でプログラムしてみた。マルチ○○○という言葉をよく聞きます。思い浮かぶかと思います。調べたのでその備忘録です。自作してみた!(その2)プロフィール某名門大の大学院生です。IoT、人口知能、ネットワークインフラ系まで幅広く興味があります。いう方のために簡単にまとめてみました。IPv6を取得して標準出力させてみます。自分の目で調査したのでまとめます。変更までする方法をご紹介します。ioctlシステムコールを使います。フラグを引数に指定します。一度まとめておこうと思います。以下が思いつくかと思います。全て"stdio.h"に定義されています。