porter は UDP/IP および TCP/IP をサポートするクロスプラットフォーム (Linux / Windows) 通信ライブラリです。 1:1 (ユニキャスト) ・1:N (マルチキャスト・ブロードキャスト) の UDP 通信に加え、 TCP による信頼性の高い接続型通信 (1:1 および双方向) もサポートします。 スライディングウィンドウによる NACK ベース再送制御、ヘルスチェック、データ圧縮を提供します。
特徴
| 機能 | 詳細 |
| トランスポート | 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 両プラットフォーム対応 |
クイックスタート
設定ファイルの準備
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
受信者の実装例
void on_event(int64_t service_id,
PotrEvent event,
const void *data,
size_t len) {
switch (event) {
break;
break;
break;
}
}
return 0;
}
通信ライブラリ (動的リンク用) のヘッダーファイル。
POTR_EXPORT int POTR_API potrLogConfig(PotrLogLevel level, const char *log_file, int console)
ロガーを設定します。
POTR_EXPORT int POTR_API potrOpenService(const PotrGlobalConfig *global, const PotrServiceDef *service, PotrRole role, PotrRecvCallback callback, PotrHandle *handle)
設定構造体から指定サービスを開きます。
POTR_EXPORT int POTR_API potrCloseService(PotrHandle handle)
サービスを閉じます。
@ POTR_TRACE_INFO
情報。TRACE_LV_INFO (3) と同値。
struct PotrContext_ * PotrHandle
セッションハンドル。
@ POTR_EVENT_DISCONNECTED
切断を検知 (タイムアウト / FIN 受信 / REJECT 受信)。data=NULL, len=0。
@ POTR_EVENT_CONNECTED
送信者からの疎通を初検知 or 復帰。data=NULL, len=0。
@ POTR_EVENT_DATA
データ受信。data/len に内容が格納される。
int main(int argc, char *argv[])
メインエントリーポイント。
送信者の実装例
const char *msg = "Hello, porter!";
return 0;
}
#define POTR_PEER_NA
ピア ID 未割当を示す予約値。 1:1 モードのコールバックで渡される (ピアの概念がない)。 potrSend() に N:1 モードで指定した場合はエラーを返す。
#define POTR_SEND_BLOCKING
ブロッキング送信を行います。0 を指定するとノンブロッキング送信を行います。
POTR_EXPORT int POTR_API potrSend(PotrHandle handle, PotrPeerId peer_id, const void *data, size_t len, int flags)
メッセージを送信します。
テストコマンド
テストコマンドで動作を確認できます。
# 受信側 (別ターミナルで先に起動)
recv -l TRACE ../sample-config/porter-services.conf 1001
# 送信側
send -l TRACE ../sample-config/porter-services.conf 1001
ドキュメント一覧