1、turn的RELAYED-ADDRESS端口号分配都在文件turn_ports.c中实现。
_turnports是关键的结构体类型:
struct _turnports {
u64bits status[PORTS_SIZE];
u64bits low;
u64bits high;
u16bits range_start;
u16bits range_stop;
int ports[PORTS_SIZE];
TURN_MUTEX_DECLARE(mutex)
};
PORTS_SIZE:
值为65536;
u64bits status[PORTS_SIZE]:
数组以port端口号为下标,对应单元存的值可能为5种状态:
//这种情况存的值代表的是数组ports[] 的下标, 这种情况的端口也处于可分配状态。
#define TPS_OUT_OF_RANGE ((u64bits)(-1)) //端口不在配置的端口范围内,不可被分配
#define TPS_TAKEN_SINGLE ((u64bits)(-2)) //端口已被使用,不可被再次分配
#define TPS_TAKEN_EVEN ((u64bits)(-3)) //端口已被使用,作为奇数端口,不可被再次分配
#define TPS_TAKEN_ODD ((u64bits)(-4)) //端口已被使用,作为偶数端口,不可被再次分配
int ports[PORTS_SIZE]:
下标的意义代表位置(position),对应单元存的值是端口号;这个数组存储的是可分配的端口序列。
u64bits low;
u64bits high;
这两个成员定义成了8字节的无符号整型数。low与high都代表ports数组的下标。Ports数组是用来存储可分配端口的数组, low指向可分配序列的开始位置,high指向可分配队列的结尾位置。
u16bits range_start;
u16bits range_stop;
这两个成员为2字节无符号整型。代表的是配置文件中配置的可分配端口范围。
TURN_MUTEX_DECLARE(mutex)
互斥锁,turnservcer是多线程的,这个锁用来保护端口分配的线程安全。
2、端口分配流程
(1)初始化
static void turnports_init(turnports* tp, u16bits start, u16bits end) {
tp->low=start; //端口范围;