# porter/libsrc/porter/thread/potrSendThread.c

# 1 ファイル

## 1.1 porter/libsrc/porter/thread/potrSendThread.c

非同期送信スレッドの実装。

送信キュー (PotrSendQueue) からペイロードエレメントを取り出して 外側パケット (POTR_FLAG_DATA) を構築し sendto を呼び出す送信スレッド。
potrOpenService (POTR_ROLE_SENDER) 時に起動し、potrCloseService 時に停止します。
potrSend の flags 引数の値によらず常に起動しており、 ノンブロッキング送信 (POTR_SEND_BLOCKING なし) 時のみキューが使用されます。

### 1.1.1 作者

c-modernization-kit sample team

### 1.1.2 バージョン

1.0.0

### 1.1.3 日付

2026/03/08

### 1.1.4 通番管理

すべてのデータパケットはパックコンテナ形式で送受信します。
再送・順序整列の単位は外側パケット (UDP datagram) であり、
通番は本スレッドが外側パケットを構築する際に付与します。
送信ウィンドウ (ctx->send_window) への登録も本スレッドが行います。

### 1.1.5 パッキング機能

POTR_MAX_PAYLOAD - POTR_PAYLOAD_ELEM_HDR_SIZE 以下のフラグメントが 複数キューに滞留している場合、送信スレッドが 1 つの外側パケットに まとめて送信します。
以下の場合は単体 (ペイロードエレメント 1 件) のコンテナとして送信します。

- MORE_FRAG フラグが付いているエントリ (フラグメント化メッセージの途中)
- キューに追加エントリが存在しない場合

### 1.1.6 著作権

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

# 2 関数

## 2.1 get_ms

    static uint64_t get_ms ( void )

## 2.2 append_payload_elem

    static void append_payload_elem ( uint8_t *packed_buf, size_t *packed_len, const PotrPayloadElem *entry )

## 2.3 tcp_send_all

    static int tcp_send_all ( PotrSocket fd, PotrMutex *mtx, const uint8_t *buf, size_t len )

## 2.4 flush_packed

    static void flush_packed ( struct PotrContext_ *ctx, size_t packed_len )

## 2.5 flush_packed_peer

    static void flush_packed_peer ( struct PotrContext_ *ctx, PotrPeerContext *peer, size_t packed_len )

## 2.6 send_packed_peer_mode

    static void send_packed_peer_mode ( struct PotrContext_ *ctx, PotrPayloadElem *first )

## 2.7 send_thread_func

    static void *send_thread_func ( void *arg )

## 2.8 potr_send_thread_start

    int potr_send_thread_start ( struct PotrContext_ *ctx )

## 2.9 potr_send_thread_stop

    void potr_send_thread_stop ( struct PotrContext_ *ctx )