POCO C++ ライブラリ – 初心者でも簡単にできるサーバー構築

こんにちは、まきぺんです!
以前、POCO C++言語を使ってサーバーを構築することがありました。
その際、POCOライブラリの日本語の記述が少なく、構築に苦労したので簡単に使用する方法をまとめたいと思います。

この記事はこんな人向けです。

  • POCO C++を初めて使用する人
  • C++言語でサーバーを立てたい人
  • とりあえず簡単にPOCOを使ったサーバーを構築したい人
確認した実行環境

・Windows10 (Windows11でも構築できることを確認済み)
・poco C++ Version: poco-1.12.4-all
・Visual Stuidio : Microsoft Visual Studio Community 2022 (64 ビット) – Current Version 17.7.6

目次

Visual Studio 環境構築

POCO C++ ライブラリのビルドを行うために、まずはVisual Studioをインストールし、C++ビルド用のToolを準備します。

Visual Studioのダウンロード

以下の公式サイトからインストーラをダウンロードします。
https://visualstudio.microsoft.com/ja/downloads/

今回はコミュニティ版を使用します。

Visual Studioのダウンロード

Visual Studioのインストール

ダウンロードしたインストーラを起動すると、インストール項目を選択する画面が表示されます。
今回は、Windowsコンソール上でC++を実行したいので、「C++によるデスクトップ開発」を選択する。

Visual Studioのインストール

「インストール」を選択すれば後PCにインストールされるのを待てばOKです。
※環境にもよりますが、若干時間かかります

続いて、POCO C++ ライブラリの準備を行います。

POCO のビルド

POCO C++ ライブラリのダウンロード

まずは公式サイトからライブラリダウンロードします。
https://pocoproject.org/download.html

私の場合は、以下のように署名付きパッケージのCOMPLETE EDITIONをダウンロードして使用しています。

POCO C++ ライブラリのダウンロード

ダウンロードした圧縮ファイルを解凍すると、
「poco-1.12.4-all」といった名前(Versionによって名前は変わるはずです)のフォルダが取得できます。

POCO C++ ライブラリのビルド

POCOの公式サイトにて、ビルドの推奨方法はCmakeを使用すること。との記載がありましたので、
Cmakeを使ってビルドを行います。

①Cmakeの生成物用フォルダを作成する

「poco-1.12.4-all」フォルダの直下に、「cmake-build」という名前のフォルダを作成します。

Cmakeの生成物用フォルダを作成する

②Cmakeビルドを行う

コマンドプロンプトを開き、①で作成した「cmake-build」フォルダに移動し、以下コマンドを実行する。

cmake .. && cmake --build .

cmakeがインストールされていない場合別途インストール作業が必要です。
 cmakeインストールについては以下サイトがとても分かりやすかったです。
 https://www.kkaneko.jp/tools/win/cmake.html

すると、ビルドされて以下のような表示となり、「cmake-build」フォルダにビルドされた内容が格納されます。

POCOのインストール

ビルドができたら、PCにPOCO C++ライブラリをインストールします。

POCO C++ライブラリをPCにインストールする

コマンドプロンプトにて、POCOライブラリのビルド時に作成した「cmake-build」フォルダに移動し、以下コマンドを実行する。

cmake --build . --target install

これで、問題なくインストールが完了すればPCへのインストールは完了です。
しかし、私の環境では必ず以下のようなエラーが発生し、インストール先のディレクトリへアクセスできないと怒られますので、その対処方法も記載いたします。

インストールエラー

POCOライブラリのインストールができない場合の対処方法

コマンドプロンプトにて、POCOライブラリのビルド時に作成した「cmake-build」フォルダに移動し、以下コマンドを実行します。

cmake-gui .

すると以下画像のようなcmakeの設定画面が出てきます。

cmake設定

その設定画面にて、”CMAKE_INSTALL_PREFIX”の値を、自分がインストールしたいフォルダのパスに変更して、”Configure”ボタンを押し、設定を反映させます。
※私の場合、”C:/Program Files (x86)/Poco”がデフォルト値になっており、この場所の権限がなかったためにエラーになったようですね。

cmake設定 ポイント

設定を行った後、
再度、ビルドとインストールのコマンドを実行してください。
※インストールから行うとエラーになります

POCO インストール

インストールいけました♪

POCOを使ったサーバーの実装

Visual StudioとPOCOライブラリの準備ができたので、実際にPOCOライブラリを使った実装を行います。

C++の新規プロジェクトの作成

Visual Studioにて、新規プロジェクトの作成を選択します。
すると以下のようにどのようなプロジェクトを作成するかを選択できるので、
検索バーで「C++」と検索し、「コンソールアプリ」を選択してプロジェクトの作成を行います。

C++の新規プロジェクトの作成

C++プロジェクトでのPOCOライブラリ使用方法

次は、作成したC++プロジェクトで先ほどインストールしたPOCOライブラリを使用する方法をご説明します。

C++プロジェクトでPOCOライブラリを読み込ませる

作成したプロジェクト上で右クリックし、”プロパティ”を選択し、以下プロジェクトの設定を行います。

①ヘッダーファイル(.h)の読み込み設定

「構成プロパティ」 > 「VC++ディレクトリ」> 「インクルードディレクトリ」:PCにインストールしたPOCO ライブラリの「include」フォルダまでのパスを設定する

②ライブラリファイル(.lib)読み込み設定

「構成プロパティ」 > 「VC++ディレクトリ」 > 「ライブラリディレクトリ」:PCにインストールしたPOCO ライブラリの「lib」フォルダまでのパスを設定する

ライブラリファイル(.lib)読み込み設定

PCの環境変数のPATHにPOCO C++ライブラリのパスを追加する

  1. Windowsのスタートメニューにて、「環境変数」と検索する
  2. 「システム環境変数の編集」を選択する
  3. 「環境変数」を選択する
  4. PathにPCにインストールしたPOCO ライブラリの「bin」フォルダまでのパスを設定する
システムのプロパティ
環境変数

POCOを使用した実装

やっと全ての準備ができました。
Visual Studioで作成したプロジェクトにてPOCOライブラリを実装していきましょう。

ということで、まずはサンプルコードを下記に記載しますので、以下コードをC++ファイルとしてプロジェクトへ追加し動かしてみましょう。

#include <iostream>

#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/JSON/JSON.h"
#include "Poco/JSON/Object.h"
#include "Poco/JSON/Stringifier.h"


// httpのリクエストでEndpointが"/test2"と指定された場合に実行される関数
class Test2RequestHandler : public Poco::Net::HTTPRequestHandler {
public:

    void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
        std::cout << "Test2RequestHandler" << std::endl;

        // HTTP レスポンスの設定
        response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);

        // HTTP レスポンスの送信
        std::ostream& out = response.send();
    
    }
};


// httpのリクエストでEndpointが"/test1"と指定された場合に実行される関数(Jsonデータを返却する)
class Test1RequestHandler : public Poco::Net::HTTPRequestHandler {
public:

    void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
        std::cout << "Test1RequestHandler" << std::endl;

        // JSON オブジェクトを作成
        Poco::JSON::Object json;
        json.set("key1", "value1");
        json.set("key2", "value2");

        // JSON オブジェクト を文字列に変換
        std::ostringstream jsonStream;
        Poco::JSON::Stringifier::stringify(json, jsonStream);

        // HTTP レスポンスの設定
        response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);
        response.setContentType("application/json");
        response.setContentLength(jsonStream.str().length());

        // JSON データをレスポンスに書き込む
        std::ostream& out = response.send();
        out << jsonStream.str();
    }
};


// 作成したサーバーがhttpリクエストを受けたときに実行される関数
class TestRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory
{
public:

    Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest& request) {
        std::cout << "TestRequestHandlerFactory" << std::endl;

        // Endpointの判断
        if (request.getURI() == "/test1") {
            return new Test1RequestHandler();
        }
        else if (request.getURI() == "/test2") {
            return new Test2RequestHandler();
        }
        else {
            // その他のリクエストは処理しない
            return nullptr;
        }
    }
};


// サーバーを構築する関数
class TestServer : public Poco::Util::ServerApplication
{
protected:

    int main(const std::vector<std::string>& args)
    {
        int maxThreads = 5;                            // クライアント最大同時接続数

        // 接続スレッド数設定
        Poco::ThreadPool::defaultPool().addCapacity(maxThreads);

        // 設定値クラス
        Poco::Net::HTTPServerParams* params = new Poco::Net::HTTPServerParams;

        params->setMaxQueued(100);                    // 接続要求ソケット最大数
        params->setMaxThreads(maxThreads);
        Poco::Net::ServerSocket svs(8080);            // 8080ポート使用

        // HTTPサーバクラスのインスタンス
        Poco::Net::HTTPServer    srv(new TestRequestHandlerFactory(), svs, params);

        // サーバ動作開始
        srv.start();
        std::cout << "Server Start" << std::endl;

        // CTRL-C が押されるまで、
        // またはプロセスが強制終了されるまで待機
        waitForTerminationRequest();

        // サーバ動作ストップ
        srv.stop();

        return Application::EXIT_OK;
    }
};


int main(int argc, char** argv) {
    TestServer app;
    return app.run(argc, argv);
}

上記のコードを実行するとサーバーが構築されて以下コンソール画面が表示される。

実行画面

POCOを使ったサーバーの動作確認

サーバーの動作確認は、コマンドプロンプトでcurlコマンドを実行して行います。
なお、今回サーバーはローカルサーバーとして動作させているので、ローカルサーバーにアクセスする方法となっています。(サーバーの外部公開は今回対象外です)

①curlコマンド:Endpoint”/test1″へのアクセス
curl -verbose -X POST http://localhost:8080/test1
①curlコマンド:Endpoint”/test2″へのアクセス
curl -verbose -X POST http://localhost:8080/test2

まとめ

POCOを使ったサーバーの構築は行えたでしょうか?
実際に使用する場合は、httpsに対応させる必要があるかと思われます。
その場合、POCOライブラリのビルドの際にOpneSSLを使用してビルドを行う必要があります。詳細は以下の記事でご紹介していますので併せてご確認ください。


この記事を書いた人

目次