WinPcapDhcpCD の使い方  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ http://www.kobore.net/winpcapdhcpcd/dhcpcd-jp.txt ver 0.2 2002/04/12 ver 0.1 2002/02/14 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/ Acknowledgement: ``This product includes software developed by the Politecnico di Torino, and its contributors.'' 謝辞 本ソフトウェア「WinPcapDhcpCD」は、イタリア トリノ工科大学で開発された "WinPcap: the Free Packet Capture Architecture for Windows" http://netgroup-serv.polito.it/winpcap/ を使用しております。 WinPcapの開発に携わった全ての皆様に、心より感謝申しあげます。 0. 変更履歴 ~~~~~~~~~~~ ver 0.2 2002/04/12 DHCPサーバからの応答が速い場合に、パケットの取りこぼしが発生す る為、受信専用のスレッドを用意して対応 ver 0.1 2002/02/14 初版 1. Copyright ~~~~~~~~~~~~ Copyright (c) 2002,2003,2004,2005 Tomoichi Ebata. All rights reserved. 本ソフトウェア "WinPcapDhcpCD" はフリーソフトウェアです。 あなたは、Free Software Foundation が公表した GNU General Public License(GNU 一般公有使用許諾) バージョン 2 (日本語訳) あるいはそれ以降 の各バージョンの中からいずれかを選択し、そのバージョンが定める条項に従っ て本プログラムを 再頒布または変更することができます。 本ソフトウェア "WinPcapDhcpCD" の頒布にあたっては、市場性及び特定目 的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。 詳細については GNU General Public License をお読みください。 2. What is "WinPcapDhcpCD" ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "WinPcapDhcpCD"は、パケットフィルタライブラリ WinPcap http://netgroup-serv.polito.it/winpcap/ を使った、DHCPのクライアントデーモンライブラリです。 本クライアントを使用することによって、アプリケーションプログラムで、 DHCPサーバから複数のIPアドレスをリースすることができます。 また、明示的にリソースを解放するまで、デーモンとして起動し続け、リー スしたIPアドレスを保持します。 本ライブラリは、Dynamic Host Configuration Protocol(RFC2131)を参照し ましたが、同RFCを完全に実装している訳ではありません(後述)。 本ライブラリの目的に対して、動作に問題が起こらない範囲で、実装の簡略 化を実施しました。 あらかじめ御了承下さい。 3. "WinPcapDhcpCD"が前提とする環境 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ WinPcap 2.2 のライブラリが必要になります。 http://netgroup-serv.polito.it/winpcap/install/default.htm よりダウンロードして下さい。 4. 対応プラットフォーム  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 日本語版および英語版 WindowsNT SP6 で動作を確認しております。 Windows2000でも、問題なく動作すると思います。 Windows9Xは、Adapterの表記方式が異なるため、ソースに若干の手直しが必 要(と言うか、コードの一部を削除するだけ)になると思いますが、動くはずで す。 Windows9Xの対応をしても良いですが、私が疲れていない時に、Visual Studio 6.0をインストールしたWindows9Xマシンを貸して頂き、成功の暁には 誉めて頂くことが条件です。 5. CDhcpcd クラス  ̄ ̄ ̄ ̄ ̄ ̄ ̄ (1) CDhcpcd::CDhcpcd( char *myNicName, char *dhcpID ) myNicName DHCPサーバにアクセスできるネットワークカードの 名前 (e.g "\\Device\\Packet_E100B1") これらの名前は、pipconfig.exeを起動して確認し て下さい。 (See http://www.kobore.net/soft/pipmasq/pipconfig.exe) dhcpID 255文字以内の任意の文字列 この文字列によって、DHCPクライアントの認識を行 います。 (e.g. "dhcpid001") (2) bool CDhcpcd::isValid(void) CDhcpcdクラスのインスタンス化に成功した場合はtrueを、失敗した 場合は、false を返します。 (3) bool CDhcpcd::start( struct dhcpGetInfo *_dhcpGetInfo ) _dhcpGetInfo DHCPサーバから情報を取得します。 情報は以下の構造体で渡されます。 struct dhcpGetInfo { __u32 xid; __u32 yourClientIPAddress; __u32 nextServerIPAddress; unsigned char subnetMask[4]; unsigned char defaultGateway[4]; unsigned char dns[4]; unsigned char domainName[255]; unsigned char leaseTime[4]; unsigned char dhcpMessageType[1]; unsigned char dhcpServerIdentifier[4]; __u32 dhcpLeaseTime; __u32 dhcpT1value; __u32 dhcpT2value; bool dhcpDemonStatus; }; 上記の構造体の情報は、ネットワークバイトオーダのままで渡されま すので、アプリケーションプログラムで必要なデータ形式に変換して 下さい。 また、上記構造体に含まれていない情報は、取得できません。 bool CDhcpcd::status( struct dhcpGetInfo *_dhcpGetInfo ) _dhcpGetInfo DHCPのクライアントデーモンから情報を取得します。 情報は上記の構造体で渡されます。 bool CDhcpcd::end(void) CDhcpcdのインスタンスの動作を終了します。 このメソッドは、インスタンスのスコープ外で自動的に呼び出されま すので、省略しても構いません。 6. その他  ̄ ̄ ̄ ̄ ̄ コンストラクタで、インスタンス化に失敗すると、それ以後のメソッドは全 部無視されます。 インスタンス化の成否は、CDhcpcd::isValid(void)で確認して下さい。 7. サンプルプログラム  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ サンプルプログラムを以下に示します。 #include "dhcpcd.h" bool rev_inet_addr(__u32 netByteIPAddr32, char *dotIP) { memset(dotIP, 0, 16); struct in_addr addr; addr.s_addr = netByteIPAddr32; memcpy(dotIP, inet_ntoa(addr), 16); return true; } bool printInfo(struct dhcpGetInfo *_dhcpGetInfo) { printf("DefaultGateway\t%u.%u.%u.%u\n", (unsigned char *)_dhcpGetInfo->defaultGateway[0], (unsigned char *)_dhcpGetInfo->defaultGateway[1], (unsigned char *)_dhcpGetInfo->defaultGateway[2], (unsigned char *)_dhcpGetInfo->defaultGateway[3] ); printf("dhcpLeaseTime\t%d\n",_dhcpGetInfo->dhcpLeaseTime); printf("DomainNameServer\t%u.%u.%u.%u\n", (unsigned char *)_dhcpGetInfo->dns[0], (unsigned char *)_dhcpGetInfo->dns[1], (unsigned char *)_dhcpGetInfo->dns[2], (unsigned char *)_dhcpGetInfo->dns[3] ); printf("domainName\t%s\n",_dhcpGetInfo->domainName); printf("xid\t%d\n", _dhcpGetInfo->xid); char ip[16]; rev_inet_addr(_dhcpGetInfo->yourClientIPAddress, ip); printf("yourClientIPAddress\t%s\n", ip); rev_inet_addr(_dhcpGetInfo->nextServerIPAddress, ip); printf("nextServerIPAddress\t%s\n", ip); return true; } void main(void) { CDhcpcd _dhcpcd("\\Device\\Packet_FA311ND43", "ebata"); struct dhcpGetInfo _dhcpGetInfo; memset(&_dhcpGetInfo, 0, sizeof(struct dhcpGetInfo)); _dhcpcd.start(&_dhcpGetInfo); printInfo(&_dhcpGetInfo); Sleep(2000); _dhcpcd.status(&_dhcpGetInfo); printInfo(&_dhcpGetInfo); Sleep(2000); _dhcpcd.end(); }