Я использую библиотеку пробивки портов PJSIP/PJNATH (для STUN/TURN/ICE) и хочу создать свой собственный транспорт на основе UDP через перфорированные порты.
Я не могу найти структуру данных, содержащую внутренний порт сопоставления NAT. Причина, по которой мне нужен внутренний порт (с обеих сторон), заключается в том, чтобы привязать сокет UDP к внутреннему порту (вместо того, чтобы ОС выбирала случайный порт). Пожалуйста, смотрите схему.
Я понимаю, что пример приложения 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-адрес: порт легко доступен.
Предыстория
Библиотека PJNATH реализует основанный на стандартах протокол STUN/TURN/ICE и перфорирует порты UDP с помощью проверок ICE-UDP после обмена IP-адресом хоста/сервера-рефлексивного/ретранслятора с обе стороны.