标签:
杂谈 |
分类: rtpproxy |
rtpproxy启动
./rtpproxy
参数解释如下:
-A
-l
-s
-n
-F
-d
-m
-M
-d
log_level为日志级别,值如下
{"LOG_CRON", LOG_CRON},
{"LOG_DAEMON", LOG_DAEMON},
{"LOG_KERN", LOG_KERN},
{"LOG_LOCAL0", LOG_LOCAL0},
{"LOG_LOCAL1", LOG_LOCAL1},
{"LOG_LOCAL2", LOG_LOCAL2},
{"LOG_LOCAL3", LOG_LOCAL3},
{"LOG_LOCAL4", LOG_LOCAL4},
{"LOG_LOCAL5", LOG_LOCAL5},
{"LOG_LOCAL6", LOG_LOCAL6},
{"LOG_LOCAL7", LOG_LOCAL7},
{"LOG_LPR", LOG_LPR},
{"LOG_MAIL", LOG_MAIL},
{"LOG_NEWS", LOG_NEWS},
{"LOG_USER", LOG_USER},
{"LOG_UUCP", LOG_UUCP}, #if !defined(__solaris__) && !defined(__sun) && !defined(__svr4__)
{"LOG_AUTHPRIV", LOG_AUTHPRIV},
{"LOG_FTP", LOG_FTP},
{"LOG_SYSLOG", LOG_SYSLOG}, #endif
{NULL, 0}
-
int
main(int argc, char **argv) -
{
-
int i, len, timeout, controlfd, alarm_tick;
-
double sptime, eptime, last_tick_time;
-
unsigned long delay;
-
struct cfg cf;
-
char buf[256];
-
-
-
-
init_config(&cf, argc, argv);
-
-
//将1~255数随机存储在cf.stable.rand_table[256]数组中 -
init_hash_table(&cf.stable);
-
-
//初始化媒体流端口,-m
50002 端口范围用于媒体流中转,并且成对使用-M 50020 -
//此函数将指定的端口范围保存在cf.stable.port_table[65536]数组中,保存端口对中的一个. 并将对port_table[]下标查找的最大值保存在cf.port_table_idx -
init_port_table(&cf); -
-
//创建与opensips命令交互的socket,并进行端口绑定,绑定的端口为
-s 传进来的参数 -
controlfd = init_controlfd(&cf);
-
-
//日志初始化,利用的是系统日志,在启动参数中配置
-
glog = cf.stable.glog = rtpp_log_open(&cf.stable, "rtpproxy", NULL, LF_REOPEN);
-
- //创建一个超时通知线程rtpp_notify_queue_run,绑定的socket端口为 -n传进来的参数
-
if (cf.timeout_socket != NULL) {
-
-
}
-
- //写pid到/var/run/rtpproxy.pid文件中
-
i = open(pid_file, O_WRONLY | O_CREAT | O_TRUNC, DEFFILEMODE);
-
len = sprintf(buf, "%u\n", (unsigned int)getpid());
-
write(i, buf, len);
-
close(i);
-
-
//设置此进程的user ID和group
ID,对应配置参数为-u uname:gname
-
if (cf.stable.run_uname != NULL || cf.stable.run_gname != NULL)
-
-
cf.stable.controlfd = controlfd;
-
cf.sessinfo.sessions[0] = NULL;
-
cf.sessinfo.nsessions = 0;
-
cf.rtp_nsessions = 0;
-
//创建rtpp_cmd_queue_run线程监听和处理
controlfd的数据 -
rtpp_command_async_init(&cf);
-
sptime = 0;
-
eptime = getdtime();
-
last_tick_time = 0;
-
timeout = 1000 / POLL_RATE;
-
for (;;) {
-
delay = (eptime - sptime) * 1000000.0;
-
if (delay <= 0) {
-
sptime = eptime;
-
last_tick_time = 0;
-
} else if (delay < (1000000 / POLL_RATE)) {
-
sptime += 1.0 / (double)POLL_RATE;
-
usleep((1000000 / POLL_RATE) - delay);
-
} else {
-
sptime = eptime;
-
}
-
pthread_mutex_lock(&cf.sessinfo.lock);
-
if (cf.sessinfo.nsessions > 0) {
-
i = poll(cf.sessinfo.pfds, cf.sessinfo.nsessions, timeout);
-
pthread_mutex_unlock(&cf.sessinfo.lock);
-
if (i < 0 && errno == EINTR)
-
continue;
-
} else {
-
pthread_mutex_unlock(&cf.sessinfo.lock);
-
usleep(timeout * 1000);
-
}
-
eptime = getdtime();
-
if (eptime > last_tick_time + TIMETICK) {
-
alarm_tick = 1;
-
last_tick_time = eptime;
-
} else {
-
alarm_tick = 0;
-
}
-
pthread_mutex_lock(&cf.glock);
-
process_rtp(&cf, eptime, alarm_tick);
-
if (cf.rtp_nsessions > 0) {
-
process_rtp_servers(&cf, eptime);
-
}
-
pthread_mutex_unlock(&cf.glock);
-
}
-
exit(0);
-
}