porter/libsrc/porter/api/potrOpenServiceFromConfig.c

1 ファイル

1.1 porter/libsrc/porter/api/potrOpenServiceFromConfig.c

potrOpenServiceFromConfig 関数の実装。

1.1.1 作者

c-modernization-kit sample team

1.1.2 バージョン

1.0.0

1.1.3 日付

2026/03/28

1.1.4 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

2 関数

2.1 potrOpenServiceFromConfig

POTR_EXPORT int POTR_API potrOpenServiceFromConfig ( const char *config_path, int64_t service_id, PotrRole role, PotrRecvCallback callback, PotrHandle *handle )

設定ファイルから指定サービスを開きます。

設定ファイルを解析してサービス定義を取得し、potrOpenService() を呼び出します。
role と callback の組み合わせが不正な場合は POTR_ERROR を返します。
role と設定ファイルの IP アドレスが不整合 (bind 失敗など) の場合も POTR_ERROR を返します。
通信種別・役割に応じて以下のソケット設定を行います。

通信種別 役割 bind アドレス bind ポート
POTR_TYPE_UNICAST 送信者 src_addr src_port
POTR_TYPE_UNICAST 受信者 dst_addr dst_port
POTR_TYPE_MULTICAST 送信者 INADDR_ANY src_port
POTR_TYPE_MULTICAST 受信者 INADDR_ANY dst_port
POTR_TYPE_BROADCAST 送信者 src_addr src_port
POTR_TYPE_BROADCAST 受信者 INADDR_ANY dst_port

POTR_ROLE_RECEIVER の場合、内部で受信スレッドを起動します。

2.1.1 引数

  • config_path [in] 設定ファイルのパス。
  • service_id [in] 開くサービスの ID。
  • role [in] 役割種別。POTR_ROLE_SENDER または POTR_ROLE_RECEIVER。
  • callback [in] イベント発生時に呼び出されるコールバック関数 (PotrRecvCallback)。 POTR_ROLE_RECEIVER の場合は必須。データ受信・接続検知・切断検知を受け取る。 POTR_ROLE_SENDER の場合は通常 NULL を指定すること。
    ただし POTR_TYPE_TCP_BIDIR および POTR_TYPE_UNICAST_BIDIR では SENDER にもコールバックが必須。これらの種別では POTR_ROLE_SENDER でも callback が NULL の場合は失敗を返します。
  • handle [out] 成功時にセッションハンドルを格納するポインタ。

2.1.2 戻り値

成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。

2.1.3 警告

handle が NULL の場合は失敗を返します。
config_path が NULL または存在しない場合は失敗を返します。
指定した service_id が設定ファイルに存在しない場合は失敗を返します。
POTR_ROLE_RECEIVER かつ callback が NULL の場合は失敗を返します。
POTR_ROLE_SENDER かつ callback が NULL でない場合は失敗を返します。
ただし POTR_TYPE_TCP_BIDIR および POTR_TYPE_UNICAST_BIDIR では SENDER にも
コールバックが必須であり、この場合 callback が NULL の場合は失敗を返します。

2.1.4 使用例 (受信者)

void on_recv(int64_t service_id, PotrPeerId peer_id,
             PotrEvent event, const void *data, size_t len) {
    (void)peer_id;  // 1:1 モードでは常に POTR_PEER_NA
    if (event == POTR_EVENT_CONNECTED)
        printf("service %" PRId64 ": connected\n", service_id);
    else if (event == POTR_EVENT_DISCONNECTED)
        printf("service %" PRId64 ": disconnected\n", service_id);
    else
        printf("service %" PRId64 ": received %zu bytes\n", service_id, len);
}

PotrHandle handle;
if (potrOpenServiceFromConfig("porter-services.conf", 1001,
                              POTR_ROLE_RECEIVER, on_recv, &handle) == POTR_SUCCESS) {
    // 受信待機中 (受信スレッドが動作)
    potrCloseService(handle);
}

2.1.5 使用例 (送信者)

PotrHandle handle;
if (potrOpenServiceFromConfig("porter-services.conf", 1001,
                              POTR_ROLE_SENDER, NULL, &handle) == POTR_SUCCESS) {
    potrSend(handle, POTR_PEER_NA, "hello", 5, 0);
    potrCloseService(handle);
}

2.1.6 スレッド セーフティ

本関数はスレッドセーフです。
異なるスレッドから独立したハンドルを取得するために並行して呼び出すことができます。
ただし取得したハンドルはスレッドセーフではありません。
同一ハンドルに対する操作は 1 スレッドから行ってください。