29 #define POTR_MUTEX_LOCK_LOCAL(m) pthread_mutex_lock(m)
30 #define POTR_MUTEX_UNLOCK_LOCAL(m) pthread_mutex_unlock(m)
34 #define POTR_MUTEX_LOCK_LOCAL(m) EnterCriticalSection(m)
35 #define POTR_MUTEX_UNLOCK_LOCAL(m) LeaveCriticalSection(m)
40 const uint8_t *ptr,
size_t len,
int flags,
43 size_t remaining = len;
59 size_t chunk = (remaining > max_payload) ? max_payload : remaining;
60 int more_frag = (remaining > chunk);
61 uint16_t elem_flags = base_flags;
69 elem_flags, ptr, (uint16_t)chunk,
89 const void *data,
size_t len,
int flags)
92 const uint8_t *ptr = (
const uint8_t *)data;
93 uint16_t base_flags = 0;
95 if (ctx == NULL || data == NULL || len == 0
99 "potrSend: invalid argument (handle=%p data=%p len=%zu max=%u)",
100 (
const void *)handle, data, len,
106 "potrSend: service_id=%" PRId64
" peer_id=%u len=%zu flags=0x%x",
113 "potrSend: service_id=%" PRId64
" TCP not connected",
130 (
const uint8_t *)data, len) != 0)
133 "potrSend: service_id=%" PRId64
" compression failed (len=%zu)",
141 "potrSend: service_id=%" PRId64
" compress %zu -> %zu bytes",
150 "potrSend: service_id=%" PRId64
" compression skipped"
151 " (compressed %zu >= original %zu bytes), sending uncompressed",
163 "potrSend: service_id=%" PRId64
" N:1 mode requires valid peer_id (got POTR_PEER_NA)",
181 "potrSend: service_id=%" PRId64
" PEER_ALL malloc failed",
196 for (i = 0; i < n_ids; i++)
214 "potrSend: service_id=%" PRId64
" peer_id=%u not found",
220 return send_to_peer(ctx, peer_id, ptr, len, flags, base_flags);
int potr_compress(uint8_t *dst, size_t *dst_len, const uint8_t *src, size_t src_len)
データを圧縮します。
#define POTR_CRYPTO_TAG_SIZE
AES-256-GCM 認証タグサイズ (バイト)。暗号文の直後に付加する。
#define POTR_FLAG_MORE_FRAG
後続フラグメントが存在することを示すペイロードエレメントフラグ。メッセージが複数ペイロードエレメントに分割された場合、最終フラグメント以外に設定する。
#define POTR_FLAG_COMPRESSED
ペイロードが圧縮されていることを示すペイロードエレメントフラグ。圧縮はメッセージ単位で行い、全フラグメントのペイロードエレメントに設定する。先頭 4 バイトが元サイズ (NBO)、続くデータが raw ...
#define POTR_PAYLOAD_ELEM_HDR_SIZE
パックコンテナ内ペイロードエレメントのヘッダーサイズ (バイト)。flags (2): POTR_FLAG_MORE_FRAG / POTR_FLAG_COMPRESSED を格納 + payload_...
#define POTR_PEER_NA
ピア ID 未割当を示す予約値。 1:1 モードのコールバックで渡される (ピアの概念がない)。 potrSend() に N:1 モードで指定した場合はエラーを返す。
#define POTR_PEER_ALL
全接続ピアへの一斉送信を指示する予約ピア ID。 N:1 モードでは全アクティブピアへユニキャスト送信する。 1:1 モードでは唯一のピアへの送信として動作する。
#define POTR_SUCCESS
成功の戻り値を表す定数。
#define POTR_ERROR
失敗の戻り値を表す定数。
#define POTR_ERROR_DISCONNECTED
TCP 全 path 切断中に potrSend() を呼んだ場合の戻り値。
#define POTR_SEND_COMPRESS
メッセージを圧縮して送信します。圧縮後のサイズが元のサイズ以上の場合は自動的に非圧縮で送信します。
#define POTR_SEND_BLOCKING
ブロッキング送信を行います。0 を指定するとノンブロッキング送信を行います。
通信ライブラリ (動的リンク用) のヘッダーファイル。
#define POTR_API
呼び出し規約マクロ。
#define POTR_EXPORT
DLL エクスポート/インポート制御マクロ。
@ POTR_TRACE_ERROR
エラー。操作の失敗を記録。TRACE_LV_ERROR (1) と同値。
@ POTR_TRACE_VERBOSE
詳細情報 (デバッグ)。TRACE_LV_VERBOSE (4) と同値。
struct PotrContext_ * PotrHandle
セッションハンドル。
uint32_t PotrPeerId
ピア識別子。
static int potr_is_raw_type(PotrType t)
RAW 系通信種別 (POTR_TYPE_*_RAW) か判定する。
static int potr_is_tcp_type(PotrType t)
TCP 通信種別 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR) か判定する。
pthread_mutex_t PotrMutexLocal
#define POTR_LOG(level,...)
porter 内部ログ出力マクロ。
PotrPeerContext * peer_find_by_id(struct PotrContext_ *ctx, PotrPeerId peer_id)
peer_id でピアを検索する。
N:1 モード用ピアテーブル管理モジュールの内部ヘッダー。
int potr_send_queue_push_wait(PotrSendQueue *q, PotrPeerId peer_id, uint16_t flags, const void *payload, uint16_t payload_len, volatile int *running)
void potr_send_queue_wait_drained(PotrSendQueue *q)
#define POTR_MUTEX_LOCK_LOCAL(m)
POTR_EXPORT int POTR_API potrSend(PotrHandle handle, PotrPeerId peer_id, const void *data, size_t len, int flags)
メッセージを送信します。
#define POTR_MUTEX_UNLOCK_LOCAL(m)
static int send_to_peer(struct PotrContext_ *ctx, PotrPeerId peer_id, const uint8_t *ptr, size_t len, int flags, uint16_t base_flags)
セッションコンテキスト構造体。PotrHandle の実体。
volatile int tcp_active_paths
アクティブ TCP path 数 (0 = 全切断)。
PotrGlobalConfig global
グローバル設定。
size_t compress_buf_size
compress_buf のサイズ (バイト)。
PotrSendQueue send_queue
非同期送信キュー。
uint8_t * compress_buf
圧縮・解凍用一時バッファ (動的確保)。
int is_multi_peer
1: N:1 モード (src_addr/src_port 省略), 0: 1:1 モード。
PotrServiceDef service
サービス定義。
PotrMutex peers_mutex
ピアテーブル保護用ミューテックス。
volatile int send_thread_running
送信スレッド実行フラグ (1: 実行中, 0: 停止)。
int max_peers
ピアテーブルサイズ (service.max_peers から取得)。
PotrPeerContext * peers
ピアテーブル (動的確保。max_peers エントリ)。
uint16_t max_payload
最大ペイロード長 (バイト)。
uint32_t max_message_size
1 回の potrSend で送信できる最大メッセージ長 (バイト)。デフォルト: POTR_MAX_MESSAGE_SIZE。
int active
1: 有効スロット, 0: 空き。
PotrPeerId peer_id
外部公開用ピア識別子 (単調増加カウンタから付与)。
int encrypt_enabled
非 0 のとき暗号化有効。設定ファイルに有効な encrypt_key が存在するときに 1 に設定される。
int64_t service_id
サービス ID。