第216章 簡易FTPの基礎


今回から、いよいよインターネット関係のプログラムを作ります。 比較的簡単なのはFTPです。自分のホーム・ページを持っている方は、 なじみぶかいソフトですね。 FTPはInternet APIと呼ばれる関数群を使うだけで作れるので、 Winsockなどの知識がなくても大丈夫です。



まずは、FTPサーバーからファイルをダウンロードするプログラムを 作ります。Windowsのsystemのディレクトリにwininet.dllが存在する ことを確認してください。

1.wininet.hをインクルードして、wininet.libをリンクする 2.InternetOpen関数でInternet APIを初期化する 3.InternetConnect関数でFTPセッションハンドルを取得する 4.FtpSetCurrentDirectory関数で現在のFTPのディレクトリをセットする 5.FtpGetFile関数でファイルをダウンロードする 6.InternetCloseHandle関数でFTPとインターネットをクローズする

と、まあこんな感じになります。

HINTERNET InternetOpen( IN LPCSTR lpszAgent, IN DWORD dwAccessType, IN LPCSTR lpszProxyName, IN LPCSTR lpszProxyBypass, IN DWORD dwFlags );

データ型の前についているINという前置詞みたいなものは 当分の間気にしなくても結構です。この他にOUTがついたり 両方ついたりしているものが出てきます。

lpszAgentは、アプリケーションの名前を指定します。
dwAccessTypeには、アクセスタイプを指定します。 次の中から1つを選びます。
INTERNET_OPEN_TYPE_DIRECT ローカルですべてのホストネームを解決します
INTERNET_OPEN_TYPE_PRECONFIG プロキシまたはレジストリから直接コンフィギュレーションを取得します
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY プロキシまたはレジストリから直接コンフィギュレーションを取得します。
スタートアップJScriptやセットアップファイルの使用をさせません
INTERNET_OPEN_TYPE_PROXYもしプロキシバイパスリストの供給がなければ 要求をプロキシを通過させます。

lpszProxyNameには、プロキシサーバーの名前を指定します。

lpszProxyBypassには、ホストの名前またはIPアドレスのオプショナルリストのアドレスを指定します。

dwFlagsには、関数の行動に影響するオプションを選択します。 INTERNET_FLAG_ASYNC, INTERNET_FLAG_FROM_CACHE, INTERNET_FLAG_OFFLINEの値から 組み合わせで指定できます。

成功すればインターネットハンドル(HINTERNET)が取得できます。

HINTERNET InternetConnect( IN HINTERNET hInternetSession, IN LPCSTR lpszServerName, IN INTERNET_PORT nServerPort, IN LPCSTR lpszUsername, IN LPCSTR lpszPassword, IN DWORD dwService, IN DWORD dwFlags, IN DWORD dwContext );

FTP, Gopher, HTTPセッションをオープンします。

成功すればセッションのハンドルを返します。失敗すればNULLを返します。

hInternetSessionには、InternetOpen関数で取得したハンドルを指定します。

lpszServerNameには、ホストネームを指定します。または、(125.0.16.20)などのような IPアドレスを指定します。

nServerPortには接続するサーバーのTCP/IPポート番号を指定します。 次の中から指定することもできます。

INTERNET_DEFAULT_FTP_PORTFTPサーバーのデフォルトポート(21)
INTERNET_DEFAULT_GOPHER_PORTゴーファーサーバーのデフォルトポート(70)
INTERNET_DEFAULT_HTTP_PORTHTTPサーバーのデフォルトポート(80)
INTERNET_DEFAULT_HTTPS_PORTHTTPSサーバーのデフォルトポート(443)
INTERNET_DEFAULT_SOCKS_PORTSOCKSファイアーウォールサーバーのデフォルト ポート(1080)
INTERNET_INVALID_PORT_NUMBERdwServiceで特定されるサービスのデフォルトポート

lpszUsernameには、ログオンするためのユーザー名を指定します。

lpszPasswordには、ログオンするためのパスワードを指定します。

dwServiceには、サービスのタイプを指定します。次の中から1つを選びます。

INTERNET_SERVICE_FTP FTPサービス
INTERNET_SERVICE_GOPHERゴーファーサービス
INTERNET_SERVICE_HTTPHTTPサービス

dwFlagsは、使用されるサービスに特異的なフラグです。

dwContextは、コールバックのリターンハンドルのためのアプリケーションコンテキスト を識別するために使われる、アプリケーション定義の値です。

BOOL FtpSetCurrentDirectory( IN HINTERNET hFtpSession, IN LPCSTR lpszDirectory );

FTPサーバーのワーキングディレクトリを変えます。
成功すればTRUE、失敗したときはFALSEを返します。

hFtpSessionには、FTPセッションのハンドルを指定します。

lpszDirectoryにはディレクトリ名を指定します。ディレクトリの区切りには バックスラッシュ(日本のコンピュータでは円記号)でもスラッシュでも問題ありません。

BOOL FtpGetFile( IN HINTERNET hFtpSession, IN LPCSTR lpszRemoteFile, IN LPCSTR lpszNewFile, IN BOOL fFailIfExists, IN DWORD dwLocalFlagsAndAttributes, IN DWORD dwInternetFlags, IN DWORD dwContext );

FTPサーバーからファイルを取得します。そして新しいローカルファイルを作ります。

hFtpSessionには、FTPセッションのハンドルを指定します。

lpszRemoteFileには、取得したいファイル名を指定します。

lpszNewFileには、ローカルシステムに作りたいファイルの名前を指定します。

fFailIfExistsには、すでにローカルにlpszNewFileが存在するときにどうするかを指定します。 TRUEを指定した場合、すでにファイルが存在するときこの関数は失敗します。(上書きを防ぐ)

dwLocalFlagsAndAttributes新しいファイルの性質を指定します。 これは、CreateFile関数のFILE_ATTTRIBUTE_*と同じです。

dwInternetFlagsには、ダウンロードする時に関数がどのようにファイルを 取り扱うかのフラグです。最初のセットから1つを選択します。

FTP_TRANSFER_TYPE_ASCIIアスキーファイルを転送します。
FTP_TRANSFER_TYPE_BINARYバイナリーファイルを転送します。 ファイルは変化することなく正確に転送されます。
FTP_TRANSFER_TYPE_UNKNOWNデフォルトです。(バイナリー)
INTERNET_FLAG_TRANSFER_ASCIIアスキーファイルとして転送。
INTERNET_FLAG_TRANSFER_BINARYバイナリーファイルとして転送。

第2のセットはキャッシュ関連のフラグです。複数の選択が可能です。これと 第1のセットとの組み合わせとなります。
INTERNET_FLAG_DONT_CACHEキャッシュに加えません。
INTERNET_FLAG_HYPERLINKネットワークから再読み込みするかどうかを 決定するとき、サーバーから「期限切れ」または、「最終変更」が戻ってこないときに リロードを強制します。
INTERNET_FLAG_MAKE_PRESISTENTサポートされていません
INTERNET_FLAG_MUST_CACHE_REQUESTファイルがキャッシュできない時、 テンポラリファイルを作ります。
INTERNET_FLAG_NEED_FILE上に同じ。
INTERNET_FLAG_NO_CACHE_WRITEキャッシュに加えません。
INTERNET_FLAG_RELOADダウンロード時キャッシュを使わずサーバーから 行います。
INTERNET_FLAG_RESYNCHRONIZE最後にダウンロードされたときから 変更があった場合HTTPリソースを再読み込みします。FTPとゴーファーリソースについては すべてを再読み込みします。

dwContextには、アプリケーション定義の値を指定します。アプリケーションがすでに InternetSetStatusCallback関数を呼んでいた時のみ使われます。

BOOL InternetCloseHandle( IN HINTERNET hInet );

インターネットハンドルをクローズします。
成功したらTRUE、失敗のときはFALSEが返されます。

次章から実際にFTPを作ってみます。


[SDK第3部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 19/Jul/1999 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。