提供一种思路,将pjnath非阻塞函数改造为阻塞函数,同样适用其他非阻塞接口。
背景:
开源库有时候提供的接口并不人性化,例如:
pjnath里的pj_ice_strans_create用来创建一个ice,它调用了sess_init_update(用来检测ice的候选candidate的)。
我们知道本机客户端获取的自身candidate一般需要两个以上才能够有效的实现对remote实现negotiation,negotiation成功之后才能进行NAT的数据发送。
其中一个是自己局域网地址信息,另一个是外网的地址信息,前者是实现局域网连接,后者是实现外网NAT的关键。
针对turn类型的server时:
pj_ice_strans_create-》pj_ice_strans_init_ice-》pj_ice_strans_enum_cands
按上面的顺序调用时,获得的candidate只有一个本机地址信息,没有外网地址信息,无法用于NAT negotiatioin。
而我在跟踪时发现是函数是异步所导致的。stun_on_status和turn_on_state是回调函数,收到socket信息后被才调用,因此存在网络延时,不能及时将外网的candidate更新。
stun_on_status中运行到/* Otherwise update the address */ 后面的cand->status = PJ_SUCCESS;对candidate进行了修改。
turn_on_state 的old_state new_state状态改变时会对candidate进行修改,阻塞可选在函数末尾