55#include <console-util.h>
94static BOOL WINAPI console_ctrl_handler(DWORD type)
99 case CTRL_BREAK_EVENT:
100 case CTRL_CLOSE_EVENT:
101 case CTRL_SHUTDOWN_EVENT:
103 printf(
"\n終了中...\n");
131 printf(
"[サービス %" PRId64
"] 接続確立\n", service_id);
136 printf(
"[サービス %" PRId64
"] 切断検知\n", service_id);
150 memcpy(buf, data, copy_len);
151 buf[copy_len] =
'\0';
152 printf(
"[サービス %" PRId64
"] 受信 (%zu バイト): %s\n", service_id, len, buf);
181 for (j = 0; j <
sizeof(upper) - 1U && str[j] !=
'\0'; j++)
183 upper[j] = (str[j] >=
'a' && str[j] <=
'z') ? (
char)(str[j] - (
'a' -
'A')) : str[j];
187 for (i = 0; i <
sizeof(tbl) /
sizeof(tbl[0]); i++)
189 if (strcmp(upper, tbl[i].name) == 0)
219 if (fgets(buf, (
int)size, stdin) == NULL)
223 buf[strcspn(buf,
"\n")] =
'\0';
256 const char *compress_label;
263 if (!
read_line(msg_buf,
sizeof(msg_buf)))
268 msg_len = strlen(msg_buf);
274 printf(
"圧縮送信しますか? [y/N]> ");
280 if (ans_buf[0] ==
'y' || ans_buf[0] ==
'Y')
286 compress_label = compress ?
" [圧縮あり]" :
"";
287 printf(
"送信中: \"%s\" (%zu バイト)%s\n", msg_buf, msg_len, compress_label);
292 fprintf(stderr,
"エラー: 送信に失敗しました。\n");
298 printf(
" 続けて送信しますか? [Y/n]> ");
301 if (!
read_line(ans_buf,
sizeof(ans_buf)))
306 if (ans_buf[0] ==
'n' || ans_buf[0] ==
'N')
353 pthread_cancel(thread);
354 pthread_join(thread, NULL);
356 WaitForSingleObject(thread, INFINITE);
369int main(
int argc,
char *argv[])
371 const char *config_path;
376 int log_level_set = 0;
381 int bidir_started = 0;
387 for (i = 1; i < argc; i++)
389 if (strcmp(argv[i],
"-l") == 0)
393 fprintf(stderr,
"エラー: -l オプションにレベルを指定してください。\n");
394 fprintf(stderr,
"使用方法: %s [-l <level>] <config_path> <service_id>\n", argv[0]);
402 "エラー: 不明なログレベル \"%s\"。"
403 "TRACE/DEBUG/INFO/WARN/ERROR/FATAL のいずれかを指定してください。\n",
419 fprintf(stderr,
"使用方法: %s [-l <level>] <config_path> <service_id>\n", argv[0]);
420 fprintf(stderr,
" -l <level> ログレベル (TRACE/DEBUG/INFO/WARN/ERROR/FATAL)\n");
421 fprintf(stderr,
"例: %s porter-services.conf 10\n", argv[0]);
422 fprintf(stderr,
"例: %s -l INFO porter-services.conf 10\n", argv[0]);
427 config_path = argv[i];
428 service_id = (int64_t)strtoll(argv[i + 1], NULL, 10);
435 fprintf(stderr,
"エラー: ロガーの設定に失敗しました。\n");
444 SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
447 printf(
"サービス %" PRId64
" を開いています... (設定: %s)\n", service_id, config_path);
459 fprintf(stderr,
"エラー: サービス %" PRId64
" を開けませんでした。\n", service_id);
466 printf(
"双方向モード (unicast_bidir)。\n");
467 printf(
"メッセージを入力して送信できます (空行または Ctrl+D で送信終了)。\n");
469 bidir_ctx.
handle = handle;
477 fprintf(stderr,
"警告: 送信スレッドの起動に失敗しました。受信専用モードで動作します。\n");
481 printf(
"受信待機中... (Ctrl+C で終了)\n");
#define POTR_MAX_MESSAGE_SIZE
1 回の potrSend で送信できる最大メッセージ長 (バイト) のデフォルト値。設定ファイルの max_message_size で変更可能。フラグメント化により max_payload を超える...
#define POTR_MAX_PAYLOAD
ペイロードの最大長 (バイト)。UDP 最大ペイロード (65535 - IP20 - UDP8)。max_payload 設定値のバリデーション上限として使用する。
#define POTR_PEER_NA
ピア ID 未割当を示す予約値。 1:1 モードのコールバックで渡される (ピアの概念がない)。 potrSend() に N:1 モードで指定した場合はエラーを返す。
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_SEND_COMPRESS
メッセージを圧縮して送信します。圧縮後のサイズが元のサイズ以上の場合は自動的に非圧縮で送信します。
#define POTR_SEND_BLOCKING
ブロッキング送信を行います。0 を指定するとノンブロッキング送信を行います。
通信ライブラリ (動的リンク用) のヘッダーファイル。
POTR_EXPORT int POTR_API potrGetServiceType(const char *config_path, int64_t service_id, PotrType *type)
設定ファイルから指定サービスの通信種別を取得します。
POTR_EXPORT int POTR_API potrLogConfig(PotrLogLevel level, const char *log_file, int console)
ロガーを設定します。
POTR_EXPORT int POTR_API potrSend(PotrHandle handle, PotrPeerId peer_id, const void *data, size_t len, int flags)
メッセージを送信します。
POTR_EXPORT int POTR_API potrOpenServiceFromConfig(const char *config_path, int64_t service_id, PotrRole role, PotrRecvCallback callback, PotrHandle *handle)
設定ファイルから指定サービスを開きます。
POTR_EXPORT int POTR_API potrCloseService(PotrHandle handle)
サービスを閉じます。
@ POTR_TRACE_ERROR
エラー。操作の失敗を記録。TRACE_LV_ERROR (1) と同値。
@ POTR_TRACE_NONE
ログ出力無効。TRACE_LV_NONE (5) と同値。
@ POTR_TRACE_INFO
情報。TRACE_LV_INFO (3) と同値。
@ POTR_TRACE_VERBOSE
詳細情報 (デバッグ)。TRACE_LV_VERBOSE (4) と同値。
@ POTR_TRACE_CRITICAL
致命的エラー。回復不能な障害を記録。TRACE_LV_CRITICAL (0) と同値。
@ POTR_TRACE_WARNING
警告。回復可能な異常を記録。TRACE_LV_WARNING (2) と同値。
@ POTR_TYPE_UNICAST_BIDIR
双方向 1:1 通信 (UDP ユニキャスト)。
struct PotrContext_ * PotrHandle
セッションハンドル。
uint32_t PotrPeerId
ピア識別子。
@ POTR_EVENT_DISCONNECTED
切断を検知 (タイムアウト / FIN 受信 / REJECT 受信)。data=NULL, len=0。
@ POTR_EVENT_CONNECTED
送信者からの疎通を初検知 or 復帰。data=NULL, len=0。
@ POTR_EVENT_DATA
データ受信。data/len に内容が格納される。
static volatile int g_running
受信ループ継続フラグ。シグナルハンドラーで 0 に設定される。
static int parse_log_level(const char *str, PotrLogLevel *out)
ログレベル文字列を PotrLogLevel に変換する。
int main(int argc, char *argv[])
メインエントリーポイント。
static int read_line(char *buf, size_t size)
標準入力から1行読み込み、末尾の改行を取り除く。
static void sig_handler(int sig)
Linux SIGINT シグナルハンドラー。
static void * bidir_send_thread_func(void *arg)
bidir 送信スレッド関数 (Linux)。
static void join_bidir_send_thread(BidirThread thread)
bidir 送信スレッドの終了を待機して破棄する。
static void on_recv(int64_t service_id, PotrPeerId peer_id, PotrEvent event, const void *data, size_t len)
受信コールバック関数。
static int start_bidir_send_thread(BidirThread *thread, BidirSendCtx *ctx)
bidir 送信スレッドを起動する。