54#include <console-util.h>
57#define INPUT_BUF_SIZE (POTR_MAX_MESSAGE_SIZE + 2U)
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");
123 const void *data,
size_t len)
132 printf(
"\n[サービス %" PRId64
"] 接続確立\n", service_id);
137 printf(
"\n[サービス %" PRId64
"] 切断検知\n", service_id);
151 memcpy(buf, data, copy_len);
152 buf[copy_len] =
'\0';
153 printf(
"\n[サービス %" PRId64
"] 受信 (%zu バイト): %s\n", service_id, len, buf);
169 static const struct {
const char *name;
PotrLogLevel level; uint32_t _pad; } tbl[] = {
180 for (j = 0; j <
sizeof(upper) - 1U && str[j] !=
'\0'; j++)
182 upper[j] = (str[j] >=
'a' && str[j] <=
'z')
183 ? (
char)(str[j] - (
'a' -
'A'))
188 for (i = 0; i <
sizeof(tbl) /
sizeof(tbl[0]); i++)
190 if (strcmp(upper, tbl[i].name) == 0)
209 if (fgets(buf, (
int)size, stdin) == NULL)
213 buf[strcspn(buf,
"\n")] =
'\0';
225int main(
int argc,
char *argv[])
227 const char *config_path;
234 int ret = EXIT_SUCCESS;
237 int log_level_set = 0;
246 for (i = 1; i < argc; i++)
248 if (strcmp(argv[i],
"-l") == 0)
252 fprintf(stderr,
"エラー: -l オプションにレベルを指定してください。\n");
253 fprintf(stderr,
"使用方法: %s [-l <level>] <config_path> <service_id>\n",
262 "エラー: 不明なログレベル \"%s\"。"
263 "TRACE/DEBUG/INFO/WARN/ERROR/FATAL のいずれかを指定してください。\n",
279 fprintf(stderr,
"使用方法: %s [-l <level>] <config_path> <service_id>\n",
281 fprintf(stderr,
" -l <level> ログレベル (TRACE/DEBUG/INFO/WARN/ERROR/FATAL)\n");
282 fprintf(stderr,
"例: %s porter-services.conf 10\n", argv[0]);
283 fprintf(stderr,
"例: %s -l INFO porter-services.conf 10\n", argv[0]);
288 config_path = argv[i];
289 service_id = (int64_t)strtoll(argv[i + 1], NULL, 10);
296 fprintf(stderr,
"エラー: ロガーの設定に失敗しました。\n");
305 SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
308 printf(
"サービス %" PRId64
" を開いています... (設定: %s)\n", service_id, config_path);
320 callback = is_bidir ?
on_recv : NULL;
324 fprintf(stderr,
"エラー: サービス %" PRId64
" を開けませんでした。\n", service_id);
331 printf(
"双方向モード (unicast_bidir)。相手からの受信メッセージも表示します。\n");
334 printf(
"送信準備完了。空行入力またはCtrl+Dで終了します。\n");
342 if (!
read_line(msg_buf,
sizeof(msg_buf)))
347 msg_len = strlen(msg_buf);
353 printf(
"圧縮送信しますか? [y/N]> ");
359 if (ans_buf[0] ==
'y' || ans_buf[0] ==
'Y')
365 const char *compress_label;
368 compress_label =
" [圧縮あり]";
374 printf(
"送信中: \"%s\" (%zu バイト)%s\n", msg_buf, msg_len, compress_label);
380 fprintf(stderr,
"エラー: 送信に失敗しました。\n");
387 printf(
" 続けて送信しますか? [Y/n]> ");
390 if (!
read_line(ans_buf,
sizeof(ans_buf)))
395 if (ans_buf[0] ==
'n' || ans_buf[0] ==
'N')
#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) と同値。
void(* PotrRecvCallback)(int64_t service_id, PotrPeerId peer_id, PotrEvent event, const void *data, size_t len)
受信コールバック関数型 (全通信種別共通)。
@ 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 void sig_handler(int sig)
Linux SIGINT シグナルハンドラー。
static void on_recv(int64_t service_id, PotrPeerId peer_id, PotrEvent event, const void *data, size_t len)
受信コールバック関数。
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 on_recv(int64_t service_id, PotrPeerId peer_id, PotrEvent event, const void *data, size_t len)
受信コールバック関数 (unicast_bidir モード用)。
#define INPUT_BUF_SIZE
入力バッファサイズ。POTR_MAX_MESSAGE_SIZE + 改行 + NUL。