sip之简单注册

公司要对接一个平台,采用GB28181协议,由于以前没有接触过sip协议,所以在网上查找了一些资料后大概对注册过程有一点点了解后就写了一个注册程序,由于只懂得一些大概的sip协议所以测试程序很快写好后就遇到了问题,注册程序第一次返回401后又添加验证信息再次注册结果却给我返回404,当看到不是预期的200 ok时我就懵了,不知道哪里出错了,然后又是大量的查找资料网上很多说是sip服务器找不到用户,但是具体的又说的不清楚,所以我这个小菜鸟就查了整整两天的资料,这里把很有用的几篇文章贴出了给大家参考:http://blog.csdn.net/love_xunmeng/article/details/46008567
参考:
http://wenku.baidu.com/link?url=GwUIFHp8Ri2Z32K-4VkEZ9wvOC1VC_GDbXOuVdot1kRsgcI3UCN9Up0nbQmba-DVGmEqyD8fz7XA-KJEG8nVZms-yMPA6ZekU6tGo5Jzj0i

通过这些资料我大概知道是我uri出问题了,于是我就查看我的代码,
`sprintf(from, “sip:%s@%s”, “123456789”, “192.168.230.97”);
sprintf(proxy, “sip:%s@%s:%d”,”34020000002000000001”,”192.168.230.205”, 5060);
sprintf(contact, “sip:%s@%s:5080”, “123456789”,”192.168.230.97”); 发现是在填写from这个参数时把这里的IP地址填写成了sip服务器的ip地址而导致Request-URI 出错,这里应该填写终端的ip,下面附带我自己的测试代码和网上下载的sip服务器,这个服务器也是摸索了好久才会用。(sip服务器不会上传,我上传到我的资源里面大家下载吧)

#include <stdio.h>
#include "eXosip2/eXosip.h"
#include "osip2/osip_mt.h"
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h> 
#include <arpa/inet.h>
#include <ctype.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/tcp.h>


int main( )
{
     int  ret = 0;
     char from[100];/*sip:主叫用户名@被叫IP地址*/
     char proxy[100];/*sip:被叫IP地址:被叫IP端口*/
     char contact[100];
     osip_message_t *reg = NULL;
     eXosip_event_t *msg = NULL;
     int  reg_id = 0;
     int reg_status = 0;

     /*初始化*/
     ret = eXosip_init();/*初始化osip和eXosip协议栈*/
     if (0 != ret)
     {
         printf("eXosip_init failed ...\n");;
         return -1;
     }

     /*监听sip端口*/
     ret = eXosip_listen_addr(IPPROTO_UDP, NULL, 5080, AF_INET, 0);
     if (0 != ret)/*传输层初始化失败*/
     {
         eXosip_quit();
         printf("eXosip_listen_addr error!\r\n");
         return -1;
     }

     sprintf(from, "sip:%s@%s", "123456789", "192.168.230.97");
     sprintf(proxy, "sip:%s@%s:%d","34020000002000000001","192.168.230.205", 5060);
     sprintf(contact, "sip:%s@%s:5080", "123456789","192.168.230.97");

     /*构建一个register*/
     eXosip_lock();
     reg_id = eXosip_register_build_initial_register(from, proxy, contact, 3600, &reg);
     if (reg_id < 0)
     {
        eXosip_unlock();
        printf("eXosip_register_build_initial_register error!\r\n");
        return -1;
     }
     //osip_message_set_authorization(reg, "Capability algorithm=\"H:MD5\"");
     /*发送register*/
     ret = eXosip_register_send_register(reg_id, reg);
     eXosip_unlock();
     if (0 != ret)
     {
        printf("eXosip_register_send_register no authorization error!\r\n");
        return -1;
     }
     printf("send reg msg \n");
     for( ; ; )
     {
         msg = eXosip_event_wait(0, 50);/*侦听消息的到来*/
         if (NULL == msg)/*没有接收到消息*/
         {
             sleep(1);
             printf("msg is null\n ");
             continue;
         }
         printf("type = %d \n",msg->type);
         switch(msg->type)
         {    
             /*注册成功*/
             case EXOSIP_REGISTRATION_SUCCESS: 
             {
                 printf("reg sussess \n");  
                 reg_status = 1;
             }
             break;
             /*注册失败*/
             case EXOSIP_REGISTRATION_FAILURE: 
             {
                 printf("status_code = %d \n",msg->response->status_code);
        #if 1
                 /*收到服务器返回的注册失败/401未认证状态*/
                 if ((NULL != msg->response)&&(401 == msg->response->status_code))
                 {
                    /*发送携带认证信息的注册请求*/
                    eXosip_lock();
                    eXosip_clear_authentication_info();/*清除认证信息*/
                    /*添加主叫用户的认证信息*/
                    eXosip_add_authentication_info("zjf", "zjf", "12345678", "MD5", NULL);
                    eXosip_register_build_register(msg->rid, 3600, &reg);
                    ret = eXosip_register_send_register(msg->rid, reg);
                    eXosip_unlock();
                    if (0 != ret)
                    {
                        printf("eXosip_register_send_register authorization error!\r\n");
                        return -1;
                    }

                 }
                 else
                 {
                     printf("reg failed \n");
                 }
         #endif
             }
             break;
             default:
             printf("err msg type = %d \n",msg->type);
         }

        if(reg_status == 1)
        {
            break;
        }
     }
     eXosip_event_free (msg);
     return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C SIP源码是指开发语言为C的用于实现Session Initiation Protocol (SIP)的源代码。SIP是一种用于建立、修改和终止网络会话的通信协议,主要用于语音和视频通信。 SIP协议由一系列消息组成,这些消息在终端设备之间进行交换以实现通话功能。C SIP源码提供了实现这些消息交换的函数和数据结构。 C SIP源码的核心功能包括消息解析、消息处理和会话管理。首先,源码解析接收到的SIP消息,并将其转化为可供处理的数据结构。然后,源码根据消息类型和内容执行相应的操作,例如建立会话、修改会话或终止会话。最后,源码负责管理会话状态和处理可能发生的异常情况。 对于初学者而言,理解C SIP源码可能较为困难。因此,建议先从学习C语言基础开始,了解C语言的语法和常用函数。接下来,可以研究SIP协议的工作原理和相关标准文档。一些开源的SIP实现,如PJ ### 回答2: C SIP源码是一个用C语言编写的简单SIP协议的实现。SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体会话的通信协议。通过使用SIP,用户可以进行语音通话、视频通话和实时消息传输等多媒体通信。 C SIP源码的主要功能包括与SIP服务器的连接建立、实现SIP会话的建立和管理、SIP消息的解析和封装以及与媒体服务器的接口等。源码中涉及的核心概念和模块包括SIP请求和应答的封装和解析、SIP消息的路由和转发、SIP会话的状态管理和会话描述信息的维护。 在C SIP源码中,使用了一些基本的数据结构和算法,例如链表和哈希表。通过这些数据结构和算法,源码能够实现对SIP消息和会话的高效管理和处理。 对于开发人员来说,理解和使用C SIP源码需要对SIP协议有一定的了解,并具备C语言编程的基本能力。开发人员可以通过阅读源码来学习SIP协议的具体实现方式、学习如何对SIP消息进行解析和封装以及了解SIP会话的状态管理方法等。在实际开发中,开发人员可以根据自己的需求和业务场景对源码进行定制和扩展,以实现特定的功能和业务逻辑。 总之,C SIP源码是一个简单SIP协议实现,通过阅读和理解源码,开发人员可以学习和掌握SIP协议的具体实现方式,并能够根据需求进行自定义开发。 ### 回答3: C SIP源码是用C语言编写的一个简单SIP(Session Initiation Protocol)实现的代码库。SIP是一种用于建立、修改和终止多媒体会话的应用层协议,常用于VoIP(Voice over Internet Protocol)和实时通信应用。 这个简单的C SIP源码提供了一些基本的功能来实现SIP通信。它可能包含了处理SIP消息的函数、建立SIP会话的代码和处理SIP响应的逻辑等。 在源码中,可能会定义一些用于处理SIP请求和响应的结构和数据类型,例如SIP消息、SIP头部和SIP URI(Uniform Resource Identifier)等。 此外,源码中可能还包含了用于网络通信的函数和数据结构,以及实现SIP状态机和会话管理的代码。 这个简单的C SIP源码可能只包含了基本的SIP功能,如用户注册、呼叫建立和呼叫终止等。如果需要更复杂的功能,如安全认证、传输层协议选择和媒体处理等,可能需要在基础上进一步扩展和修改。 总而言之,简单的C SIP源码是一个提供基本的SIP功能的代码库,可以用来学习和理解SIP协议的实现原理,以及构建简单SIP应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿木小呆呆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值