freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

osip協(xié)議棧及exosiportp等使用入門(編輯修改稿)

2024-08-26 16:56 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 參考作用了。 eXosip_init()是 eXosip的初始化函數(shù),我們來看看它的內(nèi)部實(shí)現(xiàn): 首行是定義的 osip_t*osip,這在 oSIP 的官方手冊(cè)里我們看到,所有使用oSIP 的程序都要在最開始處聲明一個(gè) osip_t 的指針,并使用 osip_init(amp。osip)來初始化這個(gè)指針。 我們可以在代碼中看到很多 OSIP_TRACE,這是調(diào)試輸出宏調(diào)用了函數(shù)osip_trace,可以用 ENABLE_TRACE 宏來打開調(diào)試以方便我們開發(fā)調(diào)試。 其它就是很多的 eXosip_t 的全局變量 eXosip 的一些初始化操作,包括最上面的 memset(amp。eXosip,0,sizeof(eXosip))完全清空和下面的類似=osip_strdup(eXosip/EXOSIP_VERSION)的 exosip 變量的一些初始值設(shè)置,其中有一個(gè) =0 應(yīng)該是一個(gè)狀態(tài)機(jī)開關(guān),后面可以看到很多代碼檢測(cè)這個(gè)變量來決定是否繼續(xù)流程處理,默認(rèn)置成了 0表示現(xiàn)在 exosip 的處理流程是就緒的,即 ua是 not stop 的。 osip_set_application_context(osip,amp。eXosip)是比較有意思的,它讓下面的 eXosip_set_callbacks(osip)給 osip 設(shè)置大量的回調(diào)函數(shù)時(shí),能讓 osip能訪問到 eXosip 這個(gè)全局變量中設(shè)置的大量程序運(yùn)行時(shí)交互的信息,相當(dāng)于我們?cè)?VC 下開啟一個(gè)線程時(shí),給線程傳入的一個(gè) void 指針指向我們的 MFC 應(yīng)用程序的當(dāng)前 dialog 對(duì)象實(shí)例,可以用void*osip_get_application_context(osip_t*osip)這個(gè)函數(shù)來取出指針來使用,不過好象 exosip 中并沒有用到它,可能是留給個(gè)人自已擴(kuò)展的吧 還能看到初始化代碼前面有一段 WIN32 平臺(tái)下的 SOCK 的初始化代碼,可以知道 eXosip 是用的原生的 winsock api 函數(shù),也就是我們可能以前學(xué)過的用VC和 WINAPI 寫 sock 程序時(shí) (不是 MFC),用到的那段 SOCK 初始代碼,還有一段有意思的代碼,就是 jpipe()函數(shù),它們返回的是一個(gè)管道,一個(gè)有 2個(gè)整型數(shù)值的數(shù)組 (一個(gè)進(jìn)一個(gè)出 ),查看其代碼發(fā)現(xiàn),非 WIN32 平臺(tái)是直接使用的pipe 系統(tǒng)函數(shù),而 WIN32 下則是用一對(duì) TCP 的本地 SOCK 連接來模擬的管道,一個(gè) SOCK 寫一個(gè) SOCK 讀,這段代碼是比較有 參考價(jià)值的: ) j=50; while(aport++amp。amp。j0) { =htons((short)aport); if(bind(s,(struct sockaddr*)amp。raddr,sizeof(raddr))0) { OSIP_TRACE(osip_trace(__FILE__,__LINE__,OSIP_WARNING,NULL, Failed to bind one local socket%i! \n,aport)); }else break; } 含義即,依次檢 測(cè) 50個(gè)端口,從 static int aport=10500;即10500~10550 端口找出一個(gè)可用的本地端口來綁定 listen 模擬 pipe 的一對(duì)sock。 eXosip_set_callbacks(osip)沒有什么好看的,無非是和 oSIP 官方文檔介紹的一樣,設(shè)置一大堆的回調(diào)函數(shù),關(guān)鍵是回調(diào)函數(shù)的實(shí)現(xiàn),這也是許多初學(xué)者使用 oSIP 被卡殼的主要原因,不知道 oSIP 構(gòu)建的程序是怎樣跑起來的,隨便選幾個(gè)回調(diào)函數(shù)看一下 eXosip 是怎樣實(shí)現(xiàn)的,有許多是形如下文的函數(shù): static void cb_sndbye(int type,osip_transaction_t*tr,osip_message_t*sip) { OSIP_TRACE(osip_trace (__FILE__,__LINE__,OSIP_INFO3,NULL,cb_sndbye(id=%i)\r\n, trtransactionid)); } 即,只是打印一下調(diào)試,并沒有完整實(shí)現(xiàn)什么功能,我們學(xué)習(xí)時(shí),完全可以用相同的方法,定義一大堆回調(diào)函數(shù),并不忙想怎么完全實(shí)現(xiàn),先都是只打印一下調(diào)試信息,看具體的應(yīng)用邏輯根據(jù)抓包測(cè)試分析和看調(diào)試看程序走到 了哪一步,調(diào)用了哪一個(gè)回調(diào),來明白具體回調(diào)函數(shù)要實(shí)現(xiàn)什么用途,再來實(shí)現(xiàn)代碼就方便多了,當(dāng)然,如果看透了 RFC 文檔,應(yīng)該從字面就能知道各個(gè)回調(diào)函數(shù)的用途了,這是后話,不是誰(shuí)都能快速完全看懂 RFC 的,所以我們要參考eXosip: ) 我們對(duì)其中的重要的回調(diào)函數(shù)進(jìn)行逐個(gè)的分析: osip_set_cb_send_message(osip,amp。cb_snd_message)SIP 消息發(fā)送回調(diào)函數(shù) 這個(gè)函數(shù)可能是最重要的回調(diào)函數(shù)之一,消息發(fā)送,包括請(qǐng)求消息和回應(yīng)消息,一般情況下,狀態(tài)機(jī)的狀態(tài)就是由它控制的,發(fā)起一個(gè)消 息初始化一個(gè)狀態(tài)機(jī),回應(yīng)一個(gè)消息對(duì)狀態(tài)機(jī)修改,終結(jié)消息發(fā)送結(jié)束狀態(tài)機(jī)… 看 cb_snd_message 的函數(shù)實(shí)現(xiàn),要以發(fā)現(xiàn),其主要代碼是對(duì)參數(shù)中的要發(fā)送的消息 osip_message_t*sip 進(jìn)行分析,找出消息要發(fā)送的真實(shí)char*host,int port 的值 (這些參數(shù)可以省略,但要發(fā)送消息肯定需要 host 和port,所以要從 sip 中解析 ),最后根據(jù) sip中解析出的傳輸方式是 TCP 還是UDP 選擇最終進(jìn)行消息發(fā)送處理的函數(shù) cb_udp_snd_message,cb_tcp_snd_message 處理 (它們 的參數(shù)一致,即本函數(shù)只是補(bǔ)全一些省略的參數(shù)并對(duì)消息進(jìn)行合法性檢查 )。 *畢竟 eXosip 是一個(gè)通用的開發(fā)庫(kù),它考慮了要支持TCP,UDP,TCPs,IPV4,IPV6, WIN32,*nix,WINCE 等等多樣化的復(fù)雜環(huán)境,所以,我們可以略過我們暫時(shí)不需要的部分,比如, IPV6 相關(guān)的代碼實(shí)現(xiàn)等。 由于我們大多數(shù)情況下 SIP 是用的 UDP,所以先來看一下cb_udp_snd_message 的實(shí)現(xiàn),它從全局變量 exosip 中獲取可用的 sock,并盡最大能力解析出 host 和 port(?難道前面的函數(shù)還不夠解析徹底 ?如 最終仍無port 信息則默認(rèn)設(shè)置為 5060),使用os
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1