PJSIP/PJNATH ポート パンチング ライブラリ (STUN/TURN/ICE 用) を使用しており、パンチされたポートを介して独自の UDP ベースのトランスポートを作成したいと考えています。
NAT マッピングの内部ポートを保持するデータ構造が見つかりません。内部ポート (両側) が必要な理由は、UDP ソケットを内部ポートにバインドするためです (OS がランダムなポートを選択するのではなく)。図を参照してください。
icedemo
サンプル アプリは、(ポートをパンチした後) インターネット上でデータを送受信できることがわかりました。そのため、内部 UDP ポートにバインドする必要があります。内部ポートを保持しているデータ構造を知る必要があるだけです。
ファイル内のpj_ice_sess_send_data
関数は、ice_session.c
変数をダンプする有望な場所のように見えました。ただし、NAT マッピングの内部ポートを含むものはありません。
//my attempt did *not* work
pj_ice_sess_cand *cand;
cand = comp->valid_check->lcand;
char addrinfo[80];
pj_sockaddr_print(&cand->base_addr, addrinfo, sizeof(addrinfo), 3);
printf("***Local address %s\n", addrinfo);
参考までに、パブリック IP:Port はすぐに利用できます。
背景
PJNATH ライブラリは、標準ベースの STUN/TURN/ICE プロトコルを実装し、両側からホスト/サーバーリフレクティブ/リレー IP:ポートを交換した後、ICE-UDP チェックを使用して UDP ポートをパンチします。