我发现,在 ICE“完整”上,lcand
数据结构的一部分确实保存了本地绑定的 IP 和端口。在大多数消费者 NAT 中,这是令人费解的相同端口号(确实如此)。在尝试了一些企业级 NAT 之后,我发现映射两侧的端口号不同。
你可以用这样的东西打印它......
static void cb_on_ice_complete(pj_ice_strans *ice_st,
pj_ice_strans_op op,
pj_status_t status)
{
const char *opname =
(op==PJ_ICE_STRANS_OP_INIT? "initialization" :
(op==PJ_ICE_STRANS_OP_NEGOTIATION ? "negotiation" : "unknown_op"));
if (status == PJ_SUCCESS)
{
PJ_LOG(3,(THIS_FILE, "ICE %s successful", opname));
if ( op == PJ_ICE_STRANS_OP_NEGOTIATION )
{
const pj_ice_sess_check *check;
check = pj_ice_strans_get_valid_pair(icedemo.icest, 1);
if ((check != NULL) && (check->nominated == PJ_TRUE)) { //local (l) and remote(r) candidate
pj_sockaddr_print(&check->lcand->addr, icedemo.local_ip_port,
sizeof(icedemo.local_ip_port), 3);
pj_sockaddr_print(&check->rcand->addr, icedemo.remote_ip_port,
sizeof(icedemo.remote_ip_port), 3);
pj_sockaddr_print(&check->lcand->base_addr, icedemo.local_bound_ip_port, sizeof(icedemo.local_bound_ip_port), 3);
}
else
{
PJ_LOG(3,(THIS_FILE, "err: unable to get valid pair for ice1 "
"component %d", icedemo.icest, 1));
}
}
}
else
{
char errmsg[PJ_ERR_MSG_SIZE];
pj_strerror(status, errmsg, sizeof(errmsg));
PJ_LOG(1,(THIS_FILE, "ICE %s failed: %s", opname, errmsg));
pj_ice_strans_destroy(ice_st);
icedemo.icest = NULL;
}
}