eXosip2研究笔记

本文详细介绍了eXosip2库的初始化过程,包括全局变量eXosip的结构及成员变量的初始化,以及如何通过`eXosip_init()`函数设置传输协议。此外,文章还探讨了`eXosip_listen_addr()`函数在创建套接字和绑定端口中的作用。接着,分析了`eXosip_read_message()`函数处理接收消息的流程,包括`udp_tl_read_message()`和`_eXosip_handle_incoming_message()`。最后,提到了定时器超时事件的处理,以及不同事务类型的执行过程。
摘要由CSDN通过智能技术生成

1.全局变量eXosip的初始化

全局变量eXosipeXosip2库工作的核心,它通过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)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值