ダイヤルアップをプログラムで制御する方法

戻る

最近,個人でもOCNなどの安価な専用線を利用する方が多くなってきているよう です.しかし,ほとんどの方はダイアルアップネットワークでインターネット プロバイダーに接続されていることでしょう.この場合,ダイアルアップルータなど の特別な装置や自動的にダイアルアップを行うサーバアプリケーションを利用している 場合を除いて,手動でダイアルアップネットワークに登録されたアイコンをクリック するか,IE(Internet Explorer) のプロパティでモデムでの接続を設定しておく必要が あります.インターネットへの接続を無条件にモデムで行うようにしておくと, ダイアルアップを意識していないソケットを利用したアプリケーションでも自動的に 表示される「接続」ダイアログボックスでダイアルアップネットワークを利用すること ができるようになります.しかし,次のような問題も同時に発生します.

  • 個人のマシン内にJavaやHTMLのテスト用に利用しているパーソナルWebサーバや Per Web Server など,LANにアクセスするときにもインターネットプロバイダー への接続を強要される.
  • ダイアルアップを意識しない通信アプリケーションの接続方法はIEの設定に異存 してしまう.(アプリケーションやIPアドレスごとの設定ができない)
  • 自動的に切断されない.
  • IE のバージョンによってダイアルアップの動作や扱いが異なる.

    このような問題を回避する一番簡単な方法は,IE のプロパティで 「LANを利用してインターネットに接続」にしておき,必要に応じて手動で接続を 行うことです.しかし,Windows95で接続を行う場合,接続を行う度に「接続」 ダイアログボックスが表示されます.インターネットプロバイダーへの接続を行う 場合,接続の度に設定を変えるものではありませんから,すぐに接続する設定が あっても良いような気がします.IE 4.xx をインストールすることにより, ダイアルアップ接続を行う前に起動された IE でもブラウズを行うことができるように なったり,「オフライン作業」でダイアルアップネットワークでブラウズしたHTMLを 切断してから参照することができるといった便利な機能も追加された一方で,OSの モジュールとIE でインストールされたモジュールの区別が無くなっています.
    (* MicrosoftはIEをOSの一部にしようとしているため)
    しかし,現状では複数のIEとバグ修正モジュールによって,無数の組み合わせの システムが稼動している状態になっています.これにより,アプリケーションによって は,OSのバージョンだけでなくIEのバージョンまで意識して処理を行う必要があると いった状態が起こっています.
    インターネットを利用するアプリケーションは,自分が行うべき動作をIEのように 発展途上で仕様がはっきり固まっていないもの任せにしておくと,便利になることも ありますが,トラブルに巻き込まれる恐れがあることを認識することも必要 でしょう.

    8-1 アプリケーションが自分でダイアルアップを行う必要がある場合

    ●個人ユーザー
    ほとんどの場合,利用者が手動で接続を行うことで問題が起こることはないかも しれません.ダイアルアップはISDNや一般の電話回線を利用するため,利用者は回線 使用料の方が気になるのではないでしょうか.このため,必要に応じて勝手に接続・ 切断を行うと回線使用料が必要以上に多くなる恐れがあるため, 敬遠されがちです.
    しかし,最近ではロボット(Webなどを自動的に検索して情報を採取する アプリケーション)を利用する方も多いのではないかと思います,このような アプリケーションは処理に時間がかかることが多いので,終了すると同時に自動的に 回線を切断する機能があると,「切り忘れ」を起こすことがなくてよいのではない でしょう.

    ●企業ユーザー
     アプリケーションが自動的にダイアルアップを行う必要があるのは,一般の利用者 よりは企業などで,定期的に情報を送受信しなければならない場合がより一般的では ないかと思われます.通常,少量のデータを多くの回数に分けて通信を行う場合は パケット交換網のように特別な回線を利用することが多いのですが,最近では, インターネットを経由してデータの送受信を行うといったことも増えてきています. この場合,手動で接続を行うより,自動的にダイアルアップネットワークを利用して ,必要な通信のみを行って切断したほうが回線使用料が少なくなる可能性が あります.

    8-2 ダイアルアップのプログラムで制御するには

    Windows95の利用者にはネットワークコンピュータの「ダイアルアップ」フォルダ としてしか見ることができませんが,Windows NT では,RAS(Remote Access Service) と呼ばれる機能を利用します.WindowsNTでは,ダイアルアップクライアントだけでなく ,外部から WindowsNTに接続することができ,コールバック機能などダイアルアップ サーバとして必要な機能も備えています.

    ●リモートアクセスサービスAPI
     Windows95, WindowsNT で,ダイアルアップネットワークの制御を行うには, RAS API を利用します.このAPIは,WindowsNT3.1からサポートされていますが, 現在では多くの機能追加が行われ,当初より多くの機能を利用することができるように なっています.このAPIには,ダイアルアップサーバ・クライアント両方の機能が 含まれますので,Windows95や古いバージョンのWindowsNTを利用するときには, 利用したい機能がサポートされていることを確認する必要があります.
    サーバに接続するために利用するAPIは基本的に3つでだけです.
    接続に成功すると,RAS API RadDial が返却するハンドルを利用して,情報を 取得したり,動作を制御します.例えば,接続後のアドレスを取得するには, RAS API RasGetProjectionInfo を利用します.このAPIは,接続するプロトコルに よって取得する情報が変わりますので,それにあわせて情報を受け取るための構造体 などの引数を設定する必要があります.このAPI をWindowsNTの場合は, RAS API RasDial が成功するとすぐにアドレスを取得できますが,Windows95の場合 は,認証が成功するまでは,ERROR_PROTOCOL_NOT_CONFIGURED を返します.
    WindowsCEに対応した通信アプリケーションをを作成するときにもこれらのAPIを利用 して,ダイアルアップを制御することができますが,同じAPI でもOSごとに動作が微妙 に異なるものがありますので,同時に複数のOSに対応するアプリケーションを作成する ときには注意が必要です.

    図8-1:サーバーに接続するために利用するAPIと手順
    
    RasEnumEntries ... 接続先を列挙する(接続に利用するエントリを選択する)
         ↓
      RasDial      ... 電話をかける
         ↓
     RasHangUp     ... 切断する
    

    表8-1:主なRAS API の対応OS
    ORASADFuncNT3.1
    RASADFuncNT4.0
    RasConnectionNotificationNT4.0
    RasCreatePhonebookEntryNT3.1, 95
    RasDeleteEntryNT4.0, 95OSR2, CE1.0
    RasDialNT3.1, 95, CE1.0
    RasDialFuncNT3.1, 95
    RasDialFunc1NT3.1. 95
    RasDialFunc2NT4.0
    RasDialDlgNT4.0
    RasEditPhonebookEntryNT3.1, 95
    RasEntryDlgNT4.0
    RasEnumAutodialAddressesNT4.0
    RasEnumConnectionsNT3.1, 95, CE1.0
    RasEnumDevicesNT4.0, 95OSR2
    RasEnumEntriesNT3.1, 95, CE1.0
    RasGetAutodialAddressNT4.0
    RasGetAutodialEnableNT4.0
    RasGetAutodialParamNT4.0
    RasGetConnectStatusNT3.1, 95, CE1.0
    RasGetCountryInfoNT4.0, 95OSR2
    RasGetCredentialsNT4.0
    RasGetEntryDialParamsNT3.1, 95, CE1.0
    RasGetEntryPropertiesNT4.0, 95OSR2, CE1.0
    RasGetErrorStringNT3.1, 95
    RasGetProjectionInfoNT3.1, 95
    RasGetSubEntryHandleNT4.0
    RasGetSubEntryPropertiesNT4.0
    RasHangUpNT3.1, 95, CE1.0
    RasMonitorDlgNT4.0
    RasPBDlgFuncNT4.0
    RasPhonebookDlgNT4.0
    RasRenameEntryNT4.0, 95OSR2, CE1.0
    RasSetAutodialAddressNT4.0
    RasSetAutodialEnableNT4.0
    RasSetAutodialParamNT4.0
    RasSetCredentialsNT4.0
    RasSetEntryDialParamsNT3.1, 95, CE1.0
    RasSetEntryPropertiesNT4.0, 95OSR2, CE1.0
    RasSetSubEntryPropertiesNT4.0
    RasValidateEntryNameNT4.0, 95OSR2, CE1.0

    WindowsNT4.0には,RASサーバ用APIも多く存在します.これらのAPIの関数名は,
    RasAdminXXXXXX
    RasSecurityXXXXXX
    になっています.
    このように多くのAPIが存在しますが,単純にダイアルアップで接続するだけであれば いくつかのAPIだけでも十分利用できます.RAS API は WindowsNT4.0でかなり拡張され ましたが,今後のバージョンでさらに機能追加や対応OSが増えそうなAPI群の1つ ではないかと思われます.
     1つ注意しなければならないのは,RAS API のDLLである RASAPI32.DLL は Windows95 ではダイアルアップネットワーク,WindowsNTでは,リモートアクセスサービスを インストールしなければシステム内に存在しません.このような環境で,RASAPI32.LIB をリンクしたアプリケーションを起動させようとすると,RAS API が利用できない どころかアプリケーションを起動させることすらできません.
    このため,これらのサービスをインストールしない環境でも動作させる必要のある アプリケーションを作成する場合は,Win32 API LoadLibrary, GetProcAddress を 利用してDLLを動的にリンクしなければなりません.
     Win32 WinInet API でインターネットクライアントアプリケーションを作成するとき も,RAS APIを利用して,ダイアルアップを行うことができます. しかし,WinInet API にもダイアルアップAPIがあり,そちらを利用したほうが都合の よいようですので,そのようなアプリケーションを作成する場合はそちらも参考にする とよいでしょう.WinInet API を利用する場合,Internet Explorer3.xx以上がシステム にインストールされている必要があります.インストールされていない環境でも動作 させる必要がある場合は,RAS API と同様に動的にリンクする必要があることに注意 しなければなりません.

    表8-2:利用用途が高いと思われるRAS API
    DWORD RasDial(LPRASDIALEXTENSIONS lpRasDialExtensions,
     LPTSTR lpszPhonebookPath, LPRASDIALPARAMS lpRasDialParams,
     DWORD dwNotifierType, LPVOID lpvNotifier, LPHRASCONN lphRasConn)
    リモートアクセス接続をRASクライアントとRASサーバの間に確立する

    引数
    LPRASDIALEXTENSIONS lpRasDialExtensions ... 関数の拡張データ
    LPTSTR lpszPhonebookPath ... 電話帳ファイルパス名
    LPRASDIALPARAMS lpRasDialParams ... 呼び出しパラメータ
    DWORD dwNotifierType ... イベントハンドラの型
    LPVOID lpvNotifier ... コールバック関数
    LPHRASCONN lphRasConn ... 接続ハンドルを受け取る領域を指す

    戻り値
    正常終了 ERROR_SUCCESS
    異常終了 ERROR_NOT_ENOUGH_MEMORY
     または上記以外
     エラーが発生したときに戻り値として直接返される値は
     RAS API RasGetConnectStatusで取得することができる
     エラーコード文字列はRAS API RasGetErrorStringを
     利用することができる
    DWORD RasRasHangUp(HRASCONN hRasConn)
    RASリモートアクセス接続を切断する

    引数
    HRASCONN hRasConn ... ハングアップさせるRAS接続へのハンドル

    戻り値
    正常終了 ERROR_SUCCESS
    異常終了 ERROR_INVALID_HANDLE
     または上記以外
     エラーコード文字列はRAS API RasGetErrorStringを
     利用することができる
    DWORD RasEnumEntries(LPTSTR lpszReserved,
     LPTSTR lpszPhonebookPath, LPRASENTRYNAME lpRasentryName,
     LPDWORD lpdwcb, LPDWORD lpdwEntries)
    リモートアクセス電話帳のエントリ名のリストを得る

    引数
    LPTSTR lpszReserved ... 予約
    LPTSTR lpszPhonebookPath ... 電話帳ファイルのフルパス
    LPRASENTRYNAME lpRasentryName ... エントリを受け取るバッファ
    LPDWORD lpdwcb ... バッファのサイズ
    LPDWORD lpdwEntries ... バッファに書き込まれたエントリ数

    戻り値
    正常終了 ERROR_SUCCESS
    異常終了 ERROR_NOT_ENOUGH_MEMORY
    または上記以外
    エラーコード文字列はRAS API RasGetErrorStringを
    利用することができる
    DWORD RasEnumConnections(LPRASCONN lphRasConn,
     LPDWORD lpdwcb, LPDWORD lpdwConnections)
    すべてのアクティブなリモートアクセス接続のリストを得る

    引数
    LPRASCONN lphRasConn ... 接続データを受け取るバッファ
    LPDWORD lpdwcb ... バッファのサイズ (バイト単位)
    LPDWORD lpdwConnections ... バッファに書き込まれる接続数

    戻り値
    正常終了 ERROR_SUCCESS
    異常終了 ERROR_INVALID_HANDLE
     または上記以外
     エラーコード文字列はRAS API RasGetErrorStringを
     利用することができる
    DWORD RasGetErrorString (UINT uErrorValue,
     LPTSTR lpszErrorString, DWORD dwBufSize)
    アクセスエラー値に対応するエラーメッセージ文字列を取得する

    引数
    UINT uErrorValue ... エラーコード
    LPTSTR lpszErrorString ... 関数がエラー文字列を書き込むバッファ
    DWORD dwBufSize ... バッファサイズ

    戻り値
    正常終了 ERROR_SUCCESS
    異常終了 ERROR_INVALID_HANDLE
     または上記以外
     エラーコード文字列はRAS API RasGetErrorStringを
     利用することができる

    ●ダイアルアップ接続中にそれらの情報を得るには
    システムが持っているダイアルアップダイアログボックスには,現在接続されている ダイアルアップの状態,例えば転送速度などが表示されます. これらの情報は,RAS API から取得することができませんが,Windows95/98では, HKEY_DYN_DATA\PerfStats\StatData に設定されます.
    StatData には,ダイアルアップ以外にも,システムのパフォーマンスに関するデータが 設定されます.
    なお,HKEY_DYN_DATA\PerfStats\StatData へのアクセス方法は,
    HOWTO: Access the Performance Registry Under Windows 95 Last reviewed: June 29, 1998
    Article ID: Q174631
    [SDK32] Win 95 でパフォーマンス レジストリにアクセスする方法
    最終更新日: 98/02/18
    文書番号: J041630
    にありますので,参考にするとよいでしょう.

    表8-3:レジストリのダイアルアップのステータスデータ項目
    [HKEY_DYN_DATA\PerfStats\StatData]
    "Dial-Up Adapter\\Buffer"=hex:00,00,00,00
    "Dial-Up Adapter\\Framing"=hex:00,00,00,00
    "Dial-Up Adapter\\Overrun "=hex:00,00,00,00
    "Dial-Up Adapter\\Alignment"=hex:00,00,00,00
    "Dial-Up Adapter\\Timeout"=hex:00,00,00,00
    "Dial-Up Adapter\\CRC"=hex:00,00,00,00
    "Dial-Up Adapter\\Runts"=hex:00,00,00,00
    "Dial-Up Adapter\\FramesXmit"=hex:00,00,00,00
    "Dial-Up Adapter\\FramesRecvd"=hex:00,00,00,00
    "Dial-Up Adapter\\BytesXmit"=hex:00,00,00,00
    "Dial-Up Adapter\\BytesRecvd"=hex:00,00,00,00
    "Dial-Up Adapter\\TotalBytesXmit"=hex:00,00,00,00
    "Dial-Up Adapter\\TotalBytesRecvd"=hex:00,00,00,00
    "Dial-Up Adapter\\ConnectSpeed"=hex:80,25,00,00
    

    8-3 プログラムについて

    Windows95, WindowsNTで動作する RAS API を利用た,ダイアルアップネットワーク に接続を行うアプリケーションです.このプログラムでは接続と切断しか行いません. APIの実行ログをウィンドウに出力しますので,動作の確認に利用してください.
    WindowsNT でRAS API RasDial を利用して接続する場合,ユーザ名・パスワードを省略 するとすでに設定されている値を利用しますが,Windows95ではなにも設定されていない とみなされます.このため,Windows95で利用する場合,ダイアルアップに利用する ユーザ名やパスワードなどは,アプリケーションが各自保存しておく必要があります. Windows95ですでに設定されているユーザ名とドメイン名は,次のレジストリから 取得することができます.
    HKEY_CURRENT_USER\RemoteAccess\Profile\接続名\Domain ... ドメイン名
    HKEY_CURRENT_USER\RemoteAccess\Profile\接続名\User ... ユーザ名
    設定された値は,カレントディレクトリにPPP.INIを作成して保存します. このファイルにはパスワードもそのまま保存されますので,実際のアプリケーションに 利用する場合は,これらの情報は推測されにくい場所に保存しておく必要があります.  なお,このサンプルを実行するには,Windows95ではダイアルアップネットワーク, WindowsNTでは,リモートアクセスサービスがシステムにインストールされている 必要があります.

    PPP.EXE (RAS APIサンプル)
     PPP.C (メインソースファイル)
     CONFIG.C (環境設定ダイアログボックス処理ソースファイル)
     COMMECT.C (接続ダイアログボックス処理ソースファイル)
     PPP.H (ヘッダファイル)
     PPP.RC (リソースファイル)
     PPP.ICO (アイコンファイル)
     MAKEFILE (メイクファイル)