exosip的安装与使用(原创)/SDP的解析

   转载请注明 http://hi.csdn.net/hust_ch

   exosip是对osip的又一次封装,使得用户可以比较简单的构建自己的SIP协议栈,实现SIP协议。

   下载和编译不说了,网上有很多的例子。

   下面简要说下exosip的调用流程。

 

   1) eXosip_init(),主要是进行网络的一些初始化,如判定本机地址,网络初始化等。

   2) eXosip_set_user_agent() 设置user_agent(),可以不写,主要是在SIP request/response里填写user_agent字段用的。

   3)eXosip_listen_addr()创建监听地址,可以直接写成 eXosip_listen_addr(IPPROTO_UDP,0,0,AF_INET,0);

   4)创建事件线程,用于接受处理sip消息

        CreateThread(0,0,SIP_Event_Thread,this,0,0)

       这里创建了一个SIP_Event_Thread线程并用于接受参数,传入一个this参数。

    5) 在下面的SIP线程里处理,类似的函数很多。

    DWORD SIP_Event_Handler::PTC_SIP_Event_Thread(LPVOID param)

 

   有关exosip需要注意的是

   1) 本机多网卡或多IP时,exosip猜测本机地址时经常会猜错,比如本机有一个公网的PPPOE的IP,另外配有一个私网IP如192.168.1.22 ,则exosip_guess_local_ip会一直返回PPPOE的IP,所以当exosip登陆私网的SIP服务器时,在后续的SIP处理中会一直出错。这里可以通过判断用户输入的SIP服务器是否位于公网,来设置正确的自己的IP地址。

   2)  eXosip_event_wait(0, WAIT_TIME );中的WAIT_TIME不要过小,否则在exosip工作时的定时器时间偏差会越来越大,没有太深入看过exosip和osip的源码,感觉可能是频繁的中断造成误差。

   3) exosip处理有关401和407的错误,可以简单的用下面的函数:

     eXosip_lock();    

     eXosip_default_action(je);

     eXosip_unlock(); 

   或者是

      eXosip_lock();

      eXosip_automatic_refresh();

      eXosip_unlock();

 

     下面这段代码示范了如何用exosip提取SDP里想要的值

     SDP是会话初始协议,不仅用于SIP协议,也广泛用于如RTSP等多媒体描述协议。

 

     bool   get_audiog729_param(const eXosip_event_t *event,

                                         string &audio_ip,

                                         string &audio_port,

                                         string &rtp_pt_type,

                                         string &bitrate,

                                         string &encode_type)

   {

      int dlgid = event->did;

      sdp_message_t *sdp_msg = eXosip_get_remote_sdp(dlgid);

     if ( !sdp_msg )

           return false;

      sdp_connection_t *connection = eXosip_get_audio_connection(sdp_msg);

      if ( !connection )

            return false;

      audio_ip = connection->c_addr; //audio_ip

      sdp_media_t * audio_sdp = eXosip_get_audio_media(sdp_msg);

      if ( !audio_sdp ) 

          return false;

      audio_port = audio_sdp->m_port; //audio_port

      for ( int i = 0 ; i < audio_sdp->a_attributes.nb_elt; i ++ )

     {

          sdp_attribute_t *attr = (sdp_attribute_t*)osip_list_get(&audio_sdp->a_attributes,i);

          if ( attr )

          {

               string audio_filed = attr->a_att_field;

          if ( audio_filed == "rtpmap")

          {

               string g726_value = attr->a_att_value;

               if ( ! strstr(g726_value.c_str(),"726"))

                    continue;

             string::size_type pt_idx = g726_value.find_first_of(0x20);

             if ( pt_idx == string::npos )

                    return false;

             rtp_pt_type = g726_value.substr(0,pt_idx);

 

           string::size_type bitrate_idx = g726_value.find_first_of('/');

           if (bitrate_idx == string::npos )

                  return false;

           bitrate = g726_value.substr( bitrate_idx+ 1 );

           encode_type = g726_value.substr(pt_idx+1,bitrate_idx - pt_idx -1);

           return true;

           }

          }

      }

     return true;

}

 

    其中event是在SIP_Event_Thread里得到的事件,其他的形参也作为结果传出来供调用者用。

    对于SDP,重点了解以下几个字段的含义即可。

    o= 表示发起者

    c= 表示connector,比较重要

    m = 表示媒体信息,每个media对应多个attribute("也就是a=")字段

    a= 是m=的子属性

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eXosip中的401状态码表示服务器需要用户再次发送带认证信息的注册请求。当用户第一次发送注册请求后,如果收到了401状态码的响应,用户可以根据这个状态码来判断是否需要重新发送带认证信息的注册请求。在处理EXOSIP_REGISTRATION_FAILURE事件时,可以选择两种方式进行处理。 第一种方式是自动处理。在eXosip事件处理循环中调用eXosip_automatic_action()函数,该函数会自动帮助用户处理401状态码,用户不需要手动发送带认证信息的注册请求,只需要在第一次注册时就添加好认证信息即可。 第二种方式是手动处理。在EXOSIP_REGISTRATION_FAILURE事件中,可以添加以下代码来处理401状态码: ```c if ((event->response != NULL) && (event->response->status_code == 401)) { osip_message_t *reg = NULL; eXosip_lock(); eXosip_clear_authentication_info(); // 清空认证信息 eXosip_add_authentication_info(username, username, password, "MD5", NULL); // 添加认证信息 eXosip_register_build_register(event->rid, expires, &reg); eXosip_register_send_register(event->rid, reg); // 发送注册请求 eXosip_unlock(); } else { // 注册失败处理 ... } ``` 以上代码会在收到401状态码时,清空认证信息并添加新的认证信息,然后重新构建并发送带认证信息的注册请求。 总结起来,当eXosip收到401状态码时,用户可以选择自动处理或手动处理来发送带认证信息的注册请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值