1.全局变量eXosip的初始化
全局变量eXosip是eXosip2库工作的核心,它通过osip成员变量与osip库中的osip对应起来,整个协议栈的实现,都是在eXosip的基础上运行的。首先我们看看eXosip_t结构体。
struct eXosip_t
{
struct eXtl_protocol *eXtl;
char transport[10];
char *user_agent; /*消息中会添加这个头域,类似于打广告! */
eXosip_call_t *j_calls; /* my calls */
#ifndef MINISIZE
eXosip_subscribe_t *j_subscribes; /* my friends */
eXosip_notify_t *j_notifies; /* my susbscribers */
#endif
osip_list_t j_transactions;
eXosip_reg_t *j_reg; /* my registrations */
#ifndef MINISIZE
eXosip_pub_t *j_pub; /* my publications */
#endif
#ifdef OSIP_MT
void *j_cond;
void *j_mutexlock;
#endif
osip_t *j_osip;
int j_stop_ua;
#ifdef OSIP_MT
void *j_thread;
jpipe_t *j_socketctl;
jpipe_t *j_socketctl_event;/*事件管道 */
#endif
osip_fifo_t *j_events;
jauthinfo_t *authinfos;
int keep_alive;
int learn_port;
#ifndef MINISIZE
int http_port;
char http_proxy[256];
char http_outbound_proxy[256];
int dontsend_101;
#endif
int use_rport; /*这两个整形参数是干嘛的呢?*/
int use_naptr;
char ipv4_for_gateway[256];
char ipv6_for_gateway[256];
#ifndef MINISIZE
char event_package[256];
#endif
struct eXosip_dns_cache dns_entries[MAX_EXOSIP_DNS_ENTRY];
struct eXosip_account_info account_entries[MAX_EXOSIP_ACCOUNT_INFO];
struct eXosip_http_auth http_auths[MAX_EXOSIP_HTTP_AUTH];
CbSipCallback cbsipCallback;
};
初始化函数的定义如下:
int
eXosip_init (void)
{
osip_t *osip;
int i;
memset (&eXosip, 0, sizeof (eXosip));
snprintf (eXosip.ipv4_for_gateway, 256, "%s", "217.12.3.11");
snprintf (eXosip.ipv6_for_gateway, 256, "%s",
"2001:638:500:101:2e0:81ff:fe24:37c6");
#ifndef MINISIZE
snprintf (eXosip.event_package, 256, "%s", "dialog");
#endif
#ifdef WIN32
/* Initializing windows socket library */
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD (1, 1);
i = WSAStartup (wVersionRequested, &wsaData);
if (i != 0)
{
OSIP_TRACE (osip_trace
(__FILE__, __LINE__, OSIP_WARNING, NULL,
"eXosip: Unable to initialize WINSOCK, reason: %d/n", i));
/* return -1; It might be already initilized?? */
}
}
#endif
eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION);
if (eXosip.user_agent == NULL)
return OSIP_NOMEM;
eXosip.j_calls = NULL;
eXosip.j_stop_ua = 0;
#ifdef OSIP_MT
eXosip.j_thread = NULL;
#endif
i = osip_list_init (&eXosip.j_transactions);
eXosip.j_reg = NULL;
#ifdef OSIP_MT
#if !defined (_WIN32_WCE)
eXosip.j_cond = (struct osip_cond *) osip_cond_init ();
if (eXosip.j_cond == NULL)
{
osip_free (eXosip.user_agent);
eXosip.user_agent = NULL;
return OSIP_NOMEM;
}
#endif
eXosip.j_mutexlock = (struct osip_mutex *) osip_mutex_init ();
if (eXosip.j_mutexlock == NULL)
{
osip_free (eXosip.user_agent);
eXosip.user_agent = NULL;
#if !defined (_WIN32_WCE)
osip_cond_destroy ((struct osip_cond *) eXosip.j_cond);
eXosip.j_cond = NULL;
#endif
return OSIP_NOMEM;
}
#endif
/*对eXosip的各个参数进行初始化*/
i = osip_init (&osip);
if (i != 0)
{
OSIP_TRACE (osip_trace
(__FILE__, __LINE__, OSIP_ERROR, NULL,
"eXosip: Cannot initialize osip!/n"));
return i;
}
osip_set_application_context (osip, &eXosip); /*把这两个链接起来*/
eXosip_set_callbacks (osip);/*设置各种回调函数 */
eXosip.j_osip = osip;
#ifdef OSIP_MT
/* open a TCP socket to wake up the application when needed. */
eXosip.j_socketctl = jpipe ();/*新建管道 */
if (eXosip.j_socketctl == NULL)
return OSIP_UNDEFINED_ERROR;
eXosip.j_socketctl_event = jpipe ();/*新建管道 */
if (eXosip.j_socketctl_event == NULL)
return OSIP_UNDEFINED_ERROR;
#endif
/*这两个管道的具体区别,还有待进一步研究*/
/* To be changed in osip! */
eXosip.j_events = (osip_fifo_t *) osip_malloc (sizeof (osip_fifo_t));
if (eXosip.j_events == NULL)
return OSIP_NOMEM;
osip_fifo_init (eXosip.j_events);
eXosip.use_rport = 1;
eXosip.use_naptr = 1;
eXosip.keep_alive = 17000; /*17s*/
eXtl_udp.tl_init (); /*调用udp_tl_init对进行UDP通信的一些全局变量进行初始化 */
eXtl_tcp.tl_init ();
#ifdef HAVE_OPENSSL_SSL_H
#if !(OPENSSL_VERSION_NUMBER < 0x00908000L)
eXtl_dtls.tl_init ();
#endif
eXtl_tls.tl_init ();
#endif
return OSIP_SUCCESS;
}
在这个初始化函数中,主要是对全局变量eXosip的一些成员变量进行了初始化。同时可以看到,在最后通过调用全部变量eXtl_udp(在本文中我们只考虑UDP传输情况)的成员函数tl_init(),即函数udp_tl_init(),对UDP通信的一些全局变量进行初始化。其函数定义如下:
static int
udp_tl_init (void)