GB28181學習之路——eXosip獲取IP和端口

當設備註冊進來時,我們需要記錄下設備的IP和端口,以便後續與其進行通信,其實好多地方都可以獲取到,但是不一定是準確的,尤其是經過映射的地址更是不好難以捕捉。

今天寫一下怎麼樣獲取設備的IP和端口,對映射與非映射同樣有效。先構造獲answer,然後再answer的Via header中取,這時answer中含有映射地址的信息:

if (MSG_IS_REGISTER(je->request))
{
    int i = eXosip_message_build_answer (m_Ctx, je->tid, 200, &asw_register);
    if(i != 0)
        return;
    char addr[20];
    int port;
    memset(addr, '\0', strlen(addr));
    osip_via_t* via = nullptr;
    osip_message_get_via(asw_register, 0, &via);
    if(!via || !via->host)
    {
        eXosip_lock (m_Ctx);
        eXosip_message_send_answer (m_Ctx, je->tid, 400, NULL);
        eXosip_unlock (m_Ctx);
        return;
    }
    osip_generic_param_t* br = nullptr;
    osip_via_param_get_byname (via, "received", &br);
    if (br != NULL && br->gvalue != NULL)
        strcpy(addr, br->gvalue);
    else
        strcpy(addr, via->host);
    
    osip_via_param_get_byname(via, "rport", &br);
    if(!br || !br->gvalue)
    {
        eXosip_message_send_answer (m_Ctx, je->tid, 400, NULL);
        return;
    }
    port = atoi(br->gvalue);
    eXosip_lock (m_Ctx);
    eXosip_message_send_answer (m_Ctx, je->tid, 200, asw_register);
    eXosip_unlock (m_Ctx);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章