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 の設定オブジェクトの構成です。

プログラムの流れは次のようになります。

  1. リクエストキューの作成 (HttpCreateRequestQueue)
  2. サーバーセッションの作成 (HttpCreateServerSession)
  3. URL グループの作成 (HttpCreateUrlGroup) このときに、サーバーセッション ID を指定する。
  4. URL グループに URL を追加 (HttpAddUrlToUrlGroup)
  5. 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 サーバーを作りました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説