# porter/libsrc/porter/api/potrSend.c

# 1 ファイル

## 1.1 porter/libsrc/porter/api/potrSend.c

potrSend 関数の実装。

### 1.1.1 作者

c-modernization-kit sample team

### 1.1.2 バージョン

1.0.0

### 1.1.3 日付

2026/03/04

### 1.1.4 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

# 2 関数

## 2.1 send_to_peer

    static int send_to_peer ( struct PotrContext_ *ctx, PotrPeerId peer_id, const uint8_t *ptr, size_t len, int flags, uint16_t base_flags )

## 2.2 potrSend

    POTR_EXPORT int POTR_API potrSend ( PotrHandle handle, PotrPeerId peer_id, const void *data, size_t len, int flags )

メッセージを送信します。

フラグ | 説明
--- | ---
`POTR_SEND_COMPRESS` | メッセージを圧縮して送信します。
`POTR_SEND_BLOCKING` | ブロッキング送信を行います。

通信種別に応じて以下の宛先へ UDP パケットを送信します。

通信種別 | 送信先
--- | ---
POTR_TYPE_UNICAST | 接続相手の dst_port 宛にユニキャスト送信
POTR_TYPE_MULTICAST | multicast_group:dst_port へ送信
POTR_TYPE_BROADCAST | broadcast_addr:dst_port へ送信
POTR_TYPE_UNICAST_BIDIR (N:1) | peer_id で指定したピアへ送信

compress に `POTR_SEND_COMPRESS` を指定した場合、内部で圧縮処理を行ってから送信します。
圧縮後のサイズが元のサイズ以上になった場合は、自動的に非圧縮で送信します。
受信側の PotrRecvCallback には、解凍済みの元メッセージが渡されます。
送受信ともにフラグメント化と組み合わせて使用できます。

### 2.2.1 引数

- handle [in] potrOpenService() で取得したセッションハンドル。
- peer_id [in] 送信先ピア識別子。
  N:1 モード: 有効なピア ID (`POTR_PEER_NA` / `POTR_PEER_ALL` 以外) を指定します。
  N:1 モード: POTR_PEER_ALL を指定すると全接続ピアへ一斉送信します。
  N:1 モード: POTR_PEER_NA を指定すると POTR_ERROR を返します。
  1:1 モードおよびその他の通信種別: POTR_PEER_NA または POTR_PEER_ALL を指定します (通常は POTR_PEER_NA を使用)。
- data [in] 送信するメッセージへのポインタ。
- len [in] 送信するメッセージのバイト数。
- flags [in] 送信オプションフラグ。以下のフラグを論理和で組み合わせて指定します。 0 を指定すると非圧縮・ノンブロッキング送信になります。

### 2.2.2 戻り値

成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。

### 2.2.3 補足

圧縮フォーマットには raw DEFLATE (RFC 1951) を使用します。
Linux (zlib) と Windows (Compression API MSZIP|COMPRESS_RAW) は 同一フォーマットを出力するため、クロスプラットフォーム通信に対応します。
圧縮効果がない場合 (圧縮後サイズ >= 元サイズ) は、アプリケーションへの通知なしに 内部で非圧縮に切り替えて送信します。送受信のデータ内容に影響はありません。

### 2.2.4 警告

handle が NULL の場合は失敗を返します。
data が NULL の場合は失敗を返します。
len が 0 の場合は失敗を返します。
len が POTR_MAX_MESSAGE_SIZE を超える場合は失敗を返します。
送信スレッドが停止している場合 (potrCloseService 呼び出し後など) は失敗を返します。
N:1 モードで peer_id = POTR_PEER_NA (0) を指定した場合は失敗を返します。
TCP 通信種別 (POTR_TYPE_TCP / POTR_TYPE_TCP_BIDIR) で全 TCP path が切断中に
呼び出した場合は POTR_ERROR_DISCONNECTED (1) を返します
(connect スレッドが非同期に接続を試みている間)。

### 2.2.5 ノンブロッキング送信 (flags に POTR_SEND_BLOCKING を指定しない場合)

メッセージを内部送信キューに登録して即座に返ります。
実際の sendto はバックグラウンド送信スレッドが非同期に実行します。
キューが満杯の場合は空きが生じるまで待機してからメッセージを登録し、登録後に返ります。

### 2.2.6 ブロッキング送信 (flags に POTR_SEND_BLOCKING を指定した場合)

呼び出し前に滞留しているノンブロッキング送信のメッセージが すべて sendto 完了するまで待機します。
その後、本呼び出しのメッセージをキューを通じて sendto して返ります。
本関数が返った時点で、自身のメッセージの sendto は完了しています。

### 2.2.7 スレッド セーフティ

本関数はスレッドセーフではありません。
同一ハンドルへの並行呼び出しは未定義動作です。
送信は 1 スレッドから行ってください。

# 3 定数、マクロ

## 3.1 POTR_MUTEX_LOCK_LOCAL

    #define POTR_MUTEX_LOCK_LOCAL ( m )
        pthread_mutex_lock(m)

## 3.2 POTR_MUTEX_UNLOCK_LOCAL

    #define POTR_MUTEX_UNLOCK_LOCAL ( m )
        pthread_mutex_unlock(m)