eXosip入门学习(一):注册流程

本文章借鉴:

尊重原作者创作,我只是学习。基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二) - 程序人生qq1269122125 - 博客园 (cnblogs.com)https://www.cnblogs.com/qq1269122125/p/3966794.htmlRMG类 .h

class RMg
{
public:
    RMg();
    ~RMg();
    //RMg(string m_UAIP,string m_UACODE,string m_UAPORT,string m_NAME,string m_PWD);
    int ServerInit();
    int SendRegister(int& registerId,CSipFromToHeader& from, CSipFromToHeader& request_line, CContracHeader& contact,
        const string& username, const string& pwd, const int expires, int iType);
    static void Register(string m_UAIP, string m_UACODE, string m_UAPORT, string m_NAME, string m_PWD);
    static void RefreshRegister();
    static void UnRegister(string m_UAIP, string m_UACODE, string m_UAPORT, string m_NAME, string m_PWD);
    void parserRegisterInfo(osip_message_t* request, int iReqId, sipRegisterInfo& regInfo);
    void sendRegisterAnswer(sipRegisterInfo& info);
    void OnRegister(eXosip_event_t* osipEvent);
    static void BeginServer();
private:
};

RMG.cpp

RMg::RMg()
{
}

RMg::~RMg()
{
}


int RMg::ServerInit()
{
    
    int result = OSIP_SUCCESS;
    if (OSIP_SUCCESS != (result = eXosip_init()))
    {
        return -1;
    }
    if (OSIP_SUCCESS != eXosip_listen_addr(IPPROTO_UDP, NULL, UACPORTINT, AF_INET, 0))
    {
        eXosip_quit();
        return -1;
    }
    if (OSIP_SUCCESS != eXosip_set_option(EXOSIP_OPT_SET_IPV4_FOR_GATEWAY, LISTEN_ADDR))
    {
        return -1;
    }
    return OSIP_SUCCESS;
}

int RMg::SendRegister(int& registerId,CSipFromToHeader& from, CSipFromToHeader& request_line, CContracHeader& contact,
    const string& username, const string& pwd, const int expires, int iType)
{
    cout << "registerId :" << registerId << endl;
    cout << "request_line :" << request_line.GetFormatHeader() << endl;
    cout << "from :" << from.GetFormatHeader() << endl;
    cout << "contact :" << contact.GetConFormatHeader()<< endl;
    cout << "userName :" << username << endl;
    cout << "pwd :" << pwd << endl;
    cout << "expires :" << expires << endl;
    static osip_message_t* regMsg = 0;
    int ret = 0;
    eXosip_add_authentication_info(username.c_str(), username.c_str(), pwd.c_str(), "MD5", NULL);
    eXosip_lock();
    cout << "in success" << endl;
    if (0 == registerId)
    {
        registerId = eXosip_register_build_initial_register(from.GetFormatHeader().c_str(), request_line.GetFormatHeader().c_str(), contact.
            GetConFormatHeader().c_str(), expires, &regMsg);
        if (registerId <= 0)
        {
            cout << "initial field" << endl;
            return -1;
        }
    }
    else
    {
        ret = eXosip_register_build_register(registerId, expires, &regMsg);
        if (ret != OSIP_SUCCESS)
        {
            cout << "build field" << endl;
            return ret;
        }
        if (expires == 0)
        {
            osip_contact_t* scontact = NULL;
            char tmp[128];

            osip_message_get_contact(regMsg, 0, &scontact);

            osip_list_remove(&regMsg->contacts, 0);
            osip_message_set_contact(regMsg, tmp);
            osip_message_set_header(regMsg, "logout-reason", "logout");
        }
    }
    ret = eXosip_register_send_register(registerId, regMsg);
    if (ret != OSIP_SUCCESS)
    {
        cout << "send field" << endl;
        registerId = 0;
        return -2;
    }
    cout << "send success" << endl;
    eXosip_unlock();
    return ret;
}

void RMg::Register(string m_UAIP, string m_UACODE, string m_UAPORT, string m_NAME, string m_PWD)
{
    RMg test1;
    if (iCurrentStatus == 1)
    {
        return;
    }
    CSipFromToHeader request_line;
    request_line.SetHeader(m_UACODE, m_UAIP, m_UAPORT);
    CSipFromToHeader stfrom;
    stfrom.SetHeader(UACCODE, LISTEN_ADDR, UACPORT);
    CContracHeader stContact;
    stContact.SetContracHeader(UACCODE, LISTEN_ADDR, UACPORT);
    int registerId = 0;
    if (0 > test1.SendRegister(registerId,stfrom, request_line, stContact, m_NAME, m_PWD, 3000, 0))
    {
        cout << "Send field" << endl;
        return;
    }
    cout << "Send success" << endl;
    iCurrentStatus = 1;
    iHandle = registerId;
    eXosip_event_t* osipEventPtr = NULL;
    while (true)
    {
        osipEventPtr = ::eXosip_event_wait(0, 200);
        {
            eXosip_lock();
            //一般处理401/407采用库默认处理
            eXosip_default_action(osipEventPtr);
            eXosip_unlock();
        }
        if (NULL == osipEventPtr)
        {
            continue;
        }
        else
        {
            break;
        }
    }

}

void RMg::RefreshRegister()
{
    RMg test1;
    if (iCurrentStatus == 0)
    {
        return;
    }
    CSipFromToHeader request_line;
    request_line.SetHeader(UASCODE, UAS_ADDR, UAS_PORT);
    CSipFromToHeader stfrom;
    stfrom.SetHeader(UACCODE, UAS_ADDR, UAS_PORT);
    CContracHeader stContact;
    stContact.SetContracHeader(UACCODE, LISTEN_ADDR, UACPORT);
    if (0 > test1.SendRegister(iHandle,stfrom, request_line, stContact, UACCODE, UACPWD, 3000, 1))
    {
        return;
    }
}

void RMg::UnRegister(string m_UAIP, string m_UACODE, string m_UAPORT, string m_NAME, string m_PWD)
{
    RMg test1;
    if (iCurrentStatus == 1)
    {
        return;
    }
    CSipFromToHeader request_line;
    request_line.SetHeader(m_UACODE, m_UAIP, m_UAPORT);
    CSipFromToHeader stfrom;
    stfrom.SetHeader(UACCODE, UAS_ADDR, UAS_PORT);
    CContracHeader stContact;
    stContact.SetContracHeader(UACCODE, LISTEN_ADDR, UACPORT);
    int registerId = 0;
    if (0 > test1.SendRegister(registerId,stfrom, request_line, stContact, m_NAME, m_PWD, 0, 2))
    {
        return;
    }
    iCurrentStatus = 0;
    iHandle = -1;
    eXosip_event_t* osipEventPtr = NULL;
    while (true)
    {
        osipEventPtr = ::eXosip_event_wait(0, 200);
        {
            eXosip_lock();
            //一般处理401/407采用库默认处理
            eXosip_default_action(osipEventPtr);
            eXosip_unlock();
        }
        if (NULL == osipEventPtr)
        {
            continue;
        }
        else
        {
            break;
        }
    }
}

void  RMg::parserRegisterInfo(osip_message_t* request, int iReqId, sipRegisterInfo& regInfo)
{
    std::stringstream stream;
    regInfo.baseInfo.method = request->sip_method;
    regInfo.baseInfo.from.SetHeader(request->from->url->username,request->from->url->host, request->from->url->port);
    regInfo.baseInfo.proxy.SetHeader(request->to->url->username,request->to->url->host, request->to->url->port);
    //获取expires
    osip_header_t * header = NULL;
    {
        osip_message_header_get_byname(request, "expires",0, &header);
        if (NULL != header && NULL != header->hvalue)
        {
            regInfo.baseInfo.expires = atoi(header->hvalue);
        }
     }
    //contact 字段
    osip_contact_t * contact = NULL;
    osip_message_get_contact(request, 0, &contact);
    if (NULL != contact)
    {
         regInfo.baseInfo.contact.SetContacHeader(contact->url->username,contact->url->host, contact->url->port,
             regInfo.baseInfo.expires);
    }
    //注册返回 由发送方维护的请求ID 接收方接收后原样返回即可
    regInfo.baseInfo.sipRequestId = iReqId;
    //CALL_ID
    {
        stream.str("");
        stream << request->call_id->number;
        regInfo.baseInfo.callId = stream.str();
    }
    //解析content消息
    osip_body_t * body = NULL;
    osip_message_get_body(request, 0, &body);
    if (body != NULL)
    {
        stream.str("");
        stream << body->body;
        regInfo.baseInfo.content = stream.str();
    }
        //鉴权信息
    osip_authorization_t * authentication = NULL;
    {
        osip_message_get_authorization(request, 0, &authentication);
        if (NULL == authentication)
        {
             regInfo.isAuthNull = true;
        }
        else
        {
             regInfo.isAuthNull = false;
             stream.str("");
             stream << authentication->username;
             regInfo.authInfo.userName = stream.str();
             stream.str("");
             stream << authentication->algorithm;
             regInfo.authInfo.algorithm = stream.str();
             stream.str("");
             stream << authentication->realm;
             regInfo.authInfo.digestRealm = stream.str();
             stream.str("");
             stream << authentication->nonce;
             regInfo.authInfo.nonce = stream.str();
             stream.str("");
             stream << authentication->response;
             regInfo.authInfo.response = stream.str();
             stream.str("");
             stream << authentication->uri;
             regInfo.authInfo.uri = stream.str();
        }
    }
    authentication = NULL;
}

void RMg::sendRegisterAnswer(sipRegisterInfo& info)
{
    osip_message_t* answer = NULL;
    int iStatus;
    if (info.isAuthNull)
       {
          iStatus = 401;
      }
    else
    {
            iStatus = 200;
      }eXosip_lock();
       {
       int result = eXosip_message_build_answer(info.baseInfo.sipRequestId,
       iStatus, &answer);
       if (iStatus == 401)
       {
        //由SIP库生成认证方法和认证参数发送客户端
        std::stringstream stream;
        string nonce = NONCE;
        string algorithm = ALGORITHTHM;
        stream << "Digest realm=\"" << info.baseInfo.from.GetRealName()
        << "\",nonce=\"" << nonce
        << "\",algorithm=" << algorithm;
        osip_message_set_header(answer, "WWW-Authenticate",stream.str().c_str());
        cout << "=======================================================""=========" << endl;
        cout << "发送401报文" << endl;
        cout << "========================================================""========" << endl;
        }
        else if (iStatus == 200)
        {
            osip_message_set_header(answer, "Contact",info.baseInfo.contact.GetContacFormatHeader(true).c_str());
            cout << "=========================================================""=======" << endl;
            cout << "发送200报文" << endl;
            cout << "==========================================================""======" << endl;
            //string_t b = "<sip: 100110000101000000@192.168.31.18:5061>;expires=600";
            //osip_message_set_header(answer, "Contact", b.c_str());
            }
        else
            {
            //Do nothing
            }
            
            if (OSIP_SUCCESS != result)
            {
                eXosip_message_send_answer(info.baseInfo.sipRequestId, 400, NULL);
            }
        else
            {
            //发送消息体
                eXosip_message_send_answer(info.baseInfo.sipRequestId, iStatus,
                                answer);
            }
        if (0 == info.baseInfo.expires)
            {
                eXosip_register_remove(info.baseInfo.sipRequestId);
            }
    }eXosip_unlock();
}

void RMg::OnRegister(eXosip_event_t* osipEvent)
{
    sipRegisterInfo regInfo;
    parserRegisterInfo(osipEvent->request, osipEvent->tid, regInfo);
    //发送应答报文
    sendRegisterAnswer(regInfo);
}

void RMg::BeginServer()
{
    RMg svr;
    eXosip_event_t* osipEventPtr = NULL;

    while (true)
    {
        osipEventPtr = eXosip_event_wait(0, 200);
        if (NULL == osipEventPtr)
        {
            cout << "svr begin" << endl;
            continue;
        }
        switch (osipEventPtr->type)
        {
            //需要继续验证REGISTER是什么类型
        case EXOSIP_REGISTRATION_NEW:
            svr.OnRegister(osipEventPtr);
            break;
        case EXOSIP_MESSAGE_NEW:
        {
            if (!strncmp(osipEventPtr->request->sip_method, "REGISTER", strlen("REGISTER")))
            {
                svr.OnRegister(osipEventPtr);
            }
            else if (!strncmp(osipEventPtr->request->sip_method, "MESSAGE", strlen("MESSAGE")))
            {
                //
            }
            break;
        default:
            break;
        }
        eXosip_event_free(osipEventPtr);
        osipEventPtr = NULL;
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值