パケット構築・解析モジュール。
c-modernization-kit sample team
1.0.0
2026/03/04
Copyright (C) CompanyName, Ltd. 2026. All rights reserved.
static uint64_t hton64 ( uint64_t v )static uint64_t ntoh64 ( uint64_t v )static void fill_session_hdr ( PotrPacket *packet, const PotrPacketSessionHdr *shdr )int packet_build_nack ( PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t nack_num )NACK パケットを構築します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
int packet_build_ping ( PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t seq_num, uint32_t ack_num )PING パケットを構築します。
ヘルスチェックパケットです。ペイロードなし (payload_len=0)。
通番には送信側の next_seq(次に送出する DATA に割り当てる通番)を格納します。
PING はウィンドウに登録されません(NACK・再送の対象外)。
ack_num == 0 は PING 要求。受信者は seq_num を上限として欠番を一括 NACK します。
ack_num != 0 は PING 応答 (unicast_bidir 専用)。受信者は gap スキャンを行いません。
応答時は ack_num = req_seq_num + 1 を指定することで、req_seq_num=0 でも ack_num=0 になりません。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
int packet_build_reject ( PotrPacket *packet, const PotrPacketSessionHdr *shdr, uint32_t seq_num )再送不能通知 (REJECT) パケットを構築します。
受信者から NACK を受け取ったが、送信ウィンドウに該当パケットが存在しない場合に 送信者が返すパケットです。受信者はこのパケットを受け取ると即時 DISCONNECTED を 発火し、欠落通番をスキップして後続パケットの配信を継続します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
int packet_build_fin ( PotrPacket *packet, const PotrPacketSessionHdr *shdr )正常終了通知 (FIN) パケットを構築します。
送信者が potrCloseService 時に送出する終了通知パケットです。ペイロードなし。
受信者はこのパケットを受け取ると即座に POTR_EVENT_DISCONNECTED を発火します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
int packet_build_packed ( PotrPacket *out, const PotrPacketSessionHdr *shdr, uint32_t seq_num, const void *packed_payload, size_t payload_len )データパケット (パックコンテナ) を構築します。
すべてのデータパケットはパックコンテナ形式で送受信します。
ペイロードエレメントが 1 件のみの場合も同じ形式を使用します。
再送・順序整列の単位は外側パケット (本関数が構築する UDP ペイロード) であり、 通番は外側パケットの seq_num フィールドで管理します。
ペイロードエレメントの形式は flags(2) + payload_len(4) + payload(N) です。
受信者は POTR_FLAG_DATA を検出後 packet_unpack_next() でペイロードエレメントを展開します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
int packet_unpack_next ( const PotrPacket *container, size_t *offset, PotrPacket *elem_out )データパケットから次のペイロードエレメントを取り出します。
ペイロードエレメントの形式は flags(2) + payload_len(4) + payload(N) です。
通番は外側パケットで管理するためペイロードエレメントには含まれません。
container->payload_len はホストバイトオーダー (packet_parse() 変換済み) で参照します。
elem_out の session 情報は container から引き継ぎます。
ペイロードエレメントを取り出せた場合は POTR_SUCCESS、 末尾に達した場合またはエラーの場合は POTR_ERROR を返します。
int packet_parse ( PotrPacket *packet, const void *buf, size_t buf_len )受信バイト列をパケット構造体に解析します。
各フィールドをホストバイトオーダーに変換して構造体に格納します。
成功時は POTR_SUCCESS、失敗時は POTR_ERROR を返します。
size_t packet_wire_size ( const PotrPacket *packet )パケットのヘッダー + ペイロードの合計バイト数を返します。
UDP 送信時に sendto() へ渡すバイト数を求めるために使用します。
内部で ntohs(packet->payload_len) を呼ぶため、引数は必ず NBO 状態で渡してください。
パケットの送信サイズ (バイト)。packet が NULL の場合は 0。