HTTP サーバー API 2.0 を試してみよう (2/2)
« 前の記事 [HTTP サーバー API 2.0 を試してみよう (1/2)]
それでは、いよいよコードを書き換えてみましょう!
HTTP サーバー API 2.0 によるコードの書き換え
さて上記の変更をふまえ、いよいよ「HTTP API を利用した Web サーバーの開発方法」 のコードを HTTP API バージョン 2 で書き直しましょう!
コード変更の概要はこんな風になります
上で説明したとおり、プログラムの変更点は主に設定オブジェクト関係です。
今回の範囲では、データの受け渡しの部分については、変更は一切ありません。
前回のコードと今回の出来上がりのコードの DIFF をみると、次のようにコードの最初の部分と、 最後の部分だけが異なることがわかります。
コード変更の前半部分は、HTTP API の設定オブジェクトの構成です。
プログラムの流れは次のようになります。
- リクエストキューの作成 (HttpCreateRequestQueue)
- サーバーセッションの作成 (HttpCreateServerSession)
- URL グループの作成 (HttpCreateUrlGroup) このときに、サーバーセッション ID を指定する。
- URL グループに URL を追加 (HttpAddUrlToUrlGroup)
- URL グループをリクエストキューに関連付ける (HttpSetUrlGroupProperty)
ssrv1.cpp を書き換えて、ssrv2.cpp にします。
#include <http.h> #include <stdio.h> #include "bldpath.h" #include "debug.h" #define STATUS_MSG_FILE_NOT_FOUND ("File Not Found") #define STATUS_MSG_OK ("OK") #define STATUS_BODY_FILE_NOT_FOUND ("<html><body><h1>File not found</h1></body></html>") int _tmain(int argc, _TCHAR* argv[]) { ULONG ulRet; HTTPAPI_VERSION httpApiVersion = HTTPAPI_VERSION_2; // // HTTP API DLL の初期化 // ulRet = HttpInitialize ( httpApiVersion, HTTP_INITIALIZE_SERVER, NULL); // // リクエストキューの作成 // HANDLE hReqQueue = NULL; ulRet = HttpCreateRequestQueue ( httpApiVersion, NULL, NULL, 0, &hReqQueue ); if ( NO_ERROR != ulRet ) { printf ("HttpCreateRequestQueue Failed (%u)\n", ulRet); return 1; } // // サーバーセッションの作成 // HTTP_SERVER_SESSION_ID httpServerSessionId = HTTP_NULL_ID;; ulRet = HttpCreateServerSession ( httpApiVersion, &httpServerSessionId, 0 ); if ( NO_ERROR != ulRet ) { printf ("HttpCreateServerSession Failed (%u)\n", ulRet); goto cleanup; } // // URL グループの作成 // HTTP_URL_GROUP_ID httpUrlGroupId = HTTP_NULL_ID; ulRet = HttpCreateUrlGroup ( httpServerSessionId, &httpUrlGroupId, 0 ); if ( NO_ERROR != ulRet ) { printf ("HttpCreateUrlGroup Failed (%u)\n", ulRet); goto cleanup; } // // URL グループへ URL を追加 // ulRet = HttpAddUrlToUrlGroup ( httpUrlGroupId, L"http://+:8080/", 0, 0 ); if ( NO_ERROR != ulRet ) { printf ("HttpAddUrlToUrlGroup Failed (%u)\n", ulRet); goto cleanup; } // // URL グループとリクエストキューを関連付ける // HTTP_BINDING_INFO httpBindingInfo; HTTP_PROPERTY_FLAGS httpPropFlags; httpPropFlags.Present = 1; httpBindingInfo.Flags = httpPropFlags; httpBindingInfo.RequestQueueHandle = hReqQueue; ulRet = HttpSetUrlGroupProperty ( httpUrlGroupId, HttpServerBindingProperty, &httpBindingInfo, sizeof( HTTP_BINDING_INFO ) ); if ( NO_ERROR != ulRet ) { printf ("HttpSetUrlGroupProperty Failed (%u)\n", ulRet); goto cleanup; } wprintf (L"Start listening at http://+:8080/...\n"); ... この部分は全く同じなので省略 ... cleanup: // // クリーンアップ // if ( !HTTP_IS_NULL_ID ( &httpServerSessionId ) ) { HttpCloseServerSession ( httpServerSessionId ); } // リクエストキューを閉じる if ( hReqQueue ) { HttpCloseRequestQueue ( hReqQueue ); } // HTTP API の終了 HttpTerminate (HTTP_INITIALIZE_SERVER, NULL); return 0; }
上記コードをビルドすると、以下のようにプログラムが実行できました。
なお、出来上がりのコードは以下からダウンロードできます。
HTTP サーバー API バージョン 2 を使った簡単な Web サーバーサンプルのダウンロード
zip を展開して、Windows SDK のコマンドプロンプトから nmake すればサブディレクトリ chk に、ssrv2.exe が出来上がるはずです。
ちなみに、私は Windows SDK 7 でビルドしています。ビルドがうまく行かない場合は、 Windows SDK 7 以降で試してください。
C:\inetpub\wwwroot ディレクトリの下に welcome.png というファイルを置いて、ブラウザから http://localhost:8080/welcome.png と要求すれば、 上のスクリーンショットと同様になると思います。
以上、この資料では HTTP サーバー API バージョン 2.0 を利用して、簡単な Web サーバーを作りました。