TWSNMP開発日誌:モバイル版のDHCPサーバーテスト機能ができた
今朝は5時から開発開始です。
昨日の午後から
の4時間半スペシャルを聞きならばモバイル版TWSNMPにDHCPサーバーテスト機能を作っています。3時間分聞いたところで、なんとなくできました。
DHCPで通信するポートをオープンしてパケットをモニタします。DCHPサーバーポート(UDP67番)をモニタ すればクライアントがブロードキャストで送信するパケットを受信できます。クライアントポート(UDP68番)をモニタすれば、サーバーのブロードキャスト応答を受信できます。
<Send Discover>ボタンをクリックすれば、DHCPのDiscoverパケットを送信できます。このパケットを送信すれば接続しているネットワークにあるDHCPサーバーから応答があるのでDHCPサーバーを発見できます。
この機能は20年前に作ったオリジナルのTWSNMPにもある機能です。
Discoverパケットを送信した時のパケットキャプチャーは、
のような感じです。このパケットを送信するソースコードは、
を真面目に読んで
void _sendDhcpDiscover() async {
if (_dhcpUDP == null) {
return;
}
await _dhcpUDP!.send(_makeDHCPPkt(), Endpoint.broadcast(port: const Port(67)));
}
List<int> _makeDHCPPkt() {
List<int> r = [];
r.add(0x01); // BOOTP Request
r.add(0x01); // HW Type Ethernet
r.add(0x06); // HW Addr len 6
r.add(0x00);
r.add(0x00); // XID
r.add(0x01);
r.add(0x02);
r.add(0x03);
r.add(0x00); // Sec
r.add(0x00);
r.add(0x80); // Flag Bcast
r.add(0x00);
r.add(0x00); // Client IP
r.add(0x00);
r.add(0x00);
r.add(0x00);
r.add(0x00); // Your IP
r.add(0x00);
r.add(0x00);
r.add(0x00);
r.add(0x00); // Next IP
r.add(0x00);
r.add(0x00);
r.add(0x00);
r.add(0x00); // Relay IP
r.add(0x00);
r.add(0x00);
r.add(0x00);
r.add(0x5d); //MAC Address
r.add(0x01);
r.add(0x02);
r.add(0x03);
r.add(0x04);
r.add(0x05);
// Padding
for (var i = 0; i < 10; i++) {
r.add(0x00);
}
// Server host name
for (var i = 0; i < 16 * 4; i++) {
r.add(0x00);
}
// Boot File Name
for (var i = 0; i < 16 * 8; i++) {
r.add(0x00);
}
// Magic
r.add(0x63);
r.add(0x82);
r.add(0x53);
r.add(0x63);
// Discover
r.add(0x35);
r.add(0x01);
r.add(0x01);
// End
r.add(0xff);
return r;
}
のように作りました。ちゃんと自宅のDHCPサーバーは応答を返します。
しかし、オリジナルのTWSNMPと同じでクライアントのポートは、DHCPでアドレスを取得している環境ではオープンできません。
のようなエラーになります。
いつか、実機を固定IPにして試してみようと思います。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。