# porter

porter は UDP/IP および TCP/IP をサポートするクロスプラットフォーム (Linux / Windows) 通信ライブラリです。
1:1 (ユニキャスト) ・1:N (マルチキャスト・ブロードキャスト) の UDP 通信に加え、
TCP による信頼性の高い接続型通信 (1:1 および双方向) もサポートします。
スライディングウィンドウによる NACK ベース再送制御、ヘルスチェック、データ圧縮を提供します。

# 1 特徴

機能 | 詳細
--- | ---
トランスポート | UDP/IPv4、TCP/IPv4
通信モデル | ユニキャスト / マルチキャスト / ブロードキャスト (UDP) TCP 接続型通信 (`tcp` / `tcp_bidir`)、双方向ユニキャスト (`unicast_bidir`)
通信モード | 通常モード: NACK ベース再送制御・スライディングウィンドウ (最大 256 スロット) RAW モード (`*_raw`): 再送なし・ベストエフォート。ギャップ検出時に DISCONNECTED を発行
リオーダー吸収 | `reorder_timeout_ms` でギャップ検出後の待機時間を設定。待機中に追い越しパケットが届けば NACK / DISCONNECT を発行しない (通常・RAW モード共通)。マルチキャスト/ブロードキャスト通常モードでは NACK 送出タイミングを 100%〜200% の範囲で自動ジッタ分散し NACK implosion を抑制
データ圧縮 | raw DEFLATE (Linux: zlib、Windows: Compression API)
フラグメント化 | 最大 65,535 バイトのメッセージを自動分割・結合
ヘルスチェック | 定周期 PING による疎通確認と切断検知 (通常・RAW モード共通、設定に従う)
マルチパス | 最大 4 経路の並列送信
プラットフォーム | Linux、Windows 両プラットフォーム対応

# 2 クイックスタート

## 2.1 設定ファイルの準備

porter は INI 形式の設定ファイルでサービスを定義します。詳細は 設定ファイル仕様 を参照してください。

    [global]
    window_size        = 16
    health_interval_ms = 3000
    health_timeout_ms  = 10000

    [service.1001]
    type     = unicast
    src_addr = 192.168.1.20
    dst_addr = 192.168.1.10
    dst_port = 5001

## 2.2 受信者の実装例

    #include "porter.h"

    void on_event(int64_t service_id, PotrEvent event, const void *data, size_t len) {
        switch (event) {
        case POTR_EVENT_CONNECTED:
            /* 送信者からの最初のパケット到着 */
            break;
        case POTR_EVENT_DISCONNECTED:
            /* タイムアウト / FIN / REJECT 受信 / RAW モードのギャップ検出 */
            break;
        case POTR_EVENT_DATA:
            /* データ受信: data[0..len-1] に内容 */
            break;
        }
    }

    int main(void) {
        PotrHandle handle;
        potrLogConfig(POTR_TRACE_INFO, NULL, 1);
        potrOpenService("porter-services.conf", 1001, POTR_ROLE_RECEIVER, on_event, &handle);
        /* ... 待機 ... */
        potrCloseService(handle);
        return 0;
    }

## 2.3 送信者の実装例

    #include "porter.h"

    int main(void) {
        PotrHandle handle;
        potrLogConfig(POTR_TRACE_INFO, NULL, 1);
        potrOpenService("porter-services.conf", 1001, POTR_ROLE_SENDER, NULL, &handle);

        const char *msg = "Hello, porter!";
        potrSend(handle, POTR_PEER_NA, msg, strlen(msg), POTR_SEND_BLOCKING);  /* 圧縮なし・ブロッキング送信。1:1 通信では peer_id に POTR_PEER_NA を指定 */

        potrCloseService(handle);
        return 0;
    }

## 2.4 テストコマンド

テストコマンドで動作を確認できます。

    recv -l TRACE ../sample-config/porter-services.conf 1001

    send -l TRACE ../sample-config/porter-services.conf 1001

# 3 ドキュメント一覧

ドキュメント | 内容
--- | ---
アーキテクチャ設計 | スレッド構成・コンポーネント・データフロー
プロトコル仕様 | パケット構造・再送制御・ウィンドウ・圧縮
設定ファイル仕様 | INI 形式設定・通信種別・マルチパス
シーケンス | 送受信・再送・ヘルスチェックのシーケンス図
公開 API 仕様 | API リファレンス・スレッドセーフティ
セキュリティレビュー | セキュリティレビュー結果と対処方針