こんにちは、まきぺんです!
以前、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のインストール
ダウンロードしたインストーラを起動すると、インストール項目を選択する画面が表示されます。
今回は、Windowsコンソール上でC++を実行したいので、「C++によるデスクトップ開発」を選択する。
「インストール」を選択すれば後PCにインストールされるのを待てばOKです。
※環境にもよりますが、若干時間かかります
続いて、POCO C++ ライブラリの準備を行います。
POCO のビルド
POCO C++ ライブラリのダウンロード
まずは公式サイトからライブラリダウンロードします。
https://pocoproject.org/download.html
私の場合は、以下のように署名付きパッケージのCOMPLETE EDITIONをダウンロードして使用しています。
ダウンロードした圧縮ファイルを解凍すると、
「poco-1.12.4-all」といった名前(Versionによって名前は変わるはずです)のフォルダが取得できます。
POCO C++ ライブラリのビルド
POCOの公式サイトにて、ビルドの推奨方法はCmakeを使用すること。との記載がありましたので、
Cmakeを使ってビルドを行います。
①Cmakeの生成物用フォルダを作成する
「poco-1.12.4-all」フォルダの直下に、「cmake-build」という名前のフォルダを作成します。
②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_INSTALL_PREFIX”の値を、自分がインストールしたいフォルダのパスに変更して、”Configure”ボタンを押し、設定を反映させます。
※私の場合、”C:/Program Files (x86)/Poco”がデフォルト値になっており、この場所の権限がなかったためにエラーになったようですね。
設定を行った後、
再度、ビルドとインストールのコマンドを実行してください。
※インストールから行うとエラーになります
インストールいけました♪
POCOを使ったサーバーの実装
Visual StudioとPOCOライブラリの準備ができたので、実際にPOCOライブラリを使った実装を行います。
C++の新規プロジェクトの作成
Visual Studioにて、新規プロジェクトの作成を選択します。
すると以下のようにどのようなプロジェクトを作成するかを選択できるので、
検索バーで「C++」と検索し、「コンソールアプリ」を選択してプロジェクトの作成を行います。
C++プロジェクトでのPOCOライブラリ使用方法
次は、作成したC++プロジェクトで先ほどインストールしたPOCOライブラリを使用する方法をご説明します。
C++プロジェクトでPOCOライブラリを読み込ませる
作成したプロジェクト上で右クリックし、”プロパティ”を選択し、以下プロジェクトの設定を行います。
①ヘッダーファイル(.h)の読み込み設定
「構成プロパティ」 > 「VC++ディレクトリ」> 「インクルードディレクトリ」:PCにインストールしたPOCO ライブラリの「include」フォルダまでのパスを設定する
②ライブラリファイル(.lib)読み込み設定
「構成プロパティ」 > 「VC++ディレクトリ」 > 「ライブラリディレクトリ」:PCにインストールしたPOCO ライブラリの「lib」フォルダまでのパスを設定する
PCの環境変数のPATHにPOCO C++ライブラリのパスを追加する
- Windowsのスタートメニューにて、「環境変数」と検索する
- 「システム環境変数の編集」を選択する
- 「環境変数」を選択する
- 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を使用してビルドを行う必要があります。詳細は以下の記事でご紹介していますので併せてご確認ください。