potrOpenService 関数の実装。
c-modernization-kit sample team
1.0.0
2026/03/04
Copyright (C) CompanyName, Ltd. 2026. All rights reserved.
static PotrSocket open_socket_unicast ( struct in_addr bind_addr, uint16_t port )static void generate_session ( struct PotrContext_ *ctx )static PotrSocket open_socket_multicast ( const PotrServiceDef *def, struct in_addr src_if, int is_receiver )static PotrSocket open_socket_broadcast ( uint16_t src_port, uint16_t dst_port, struct in_addr src_if, int is_receiver )static void cleanup_sockets ( struct PotrContext_ *ctx )static void ctx_cleanup ( struct PotrContext_ *ctx )static int open_socket_tcp_receiver ( struct PotrContext_ *ctx, int path_idx )static int open_socket_tcp_sender ( struct PotrContext_ *ctx, int path_idx )POTR_EXPORT int POTR_API potrOpenService ( const PotrGlobalConfig *global, const PotrServiceDef *service, PotrRole role, PotrRecvCallback callback, PotrHandle *handle )設定構造体から指定サービスを開きます。
設定構造体からサービス定義を取得し、UDP ソケットを初期化します。
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 の場合、内部で受信スレッドを起動します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
global が NULL の場合は失敗を返します。
service が NULL の場合は失敗を返します。
handle が NULL の場合は失敗を返します。
POTR_ROLE_RECEIVER かつ callback が NULL の場合は失敗を返します。
POTR_ROLE_SENDER かつ callback が NULL でない場合は失敗を返します。
ただし POTR_TYPE_TCP_BIDIR および POTR_TYPE_UNICAST_BIDIR では SENDER にも
コールバックが必須であり、この場合 callback が NULL の場合は失敗を返します。
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);
}
PotrGlobalConfig global = {0};
global.window_size = 16;
global.max_payload = 1400;
global.max_message_size = 65535;
global.send_queue_depth = 64;
PotrServiceDef service = {0};
service.service_id = 1001;
service.type = POTR_TYPE_UNICAST;
service.dst_port = 49001;
strncpy(service.src_addr[0], "127.0.0.1", POTR_MAX_ADDR_LEN - 1);
strncpy(service.dst_addr[0], "127.0.0.1", POTR_MAX_ADDR_LEN - 1);
PotrHandle handle;
if (potrOpenService(&global, &service,
POTR_ROLE_RECEIVER, on_recv, &handle) == POTR_SUCCESS) {
// 受信待機中 (受信スレッドが動作)
potrCloseService(handle);
}PotrGlobalConfig global = {0};
global.window_size = 16;
global.max_payload = 1400;
global.max_message_size = 65535;
global.send_queue_depth = 64;
PotrServiceDef service = {0};
service.service_id = 1001;
service.type = POTR_TYPE_UNICAST;
service.dst_port = 49001;
strncpy(service.src_addr[0], "127.0.0.1", POTR_MAX_ADDR_LEN - 1);
strncpy(service.dst_addr[0], "127.0.0.1", POTR_MAX_ADDR_LEN - 1);
PotrHandle handle;
if (potrOpenService(&global, &service,
POTR_ROLE_SENDER, NULL, &handle) == POTR_SUCCESS) {
potrSend(handle, POTR_PEER_NA, "hello", 5, 0);
potrCloseService(handle);
}本関数はスレッドセーフです。
異なるスレッドから独立したハンドルを取得するために並行して呼び出すことができます。
ただし取得したハンドルはスレッドセーフではありません。
同一ハンドルに対する操作は 1 スレッドから行ってください。