freeswitch和sofia-sip中關於sip的消息機制

Sofia-sip內部使用消息隊列的方式對sip協議進行處理,sofia-sip和application之間是通過reactor模式進行通信,即通過回調實現,本文主要關注sofia-sip內部消息隊列的實現:


1. 需要了解sofia-sip使用到的一些oo(面向對象)技術,鏈接如下

http://sofia-sip.sourceforge.net/refdocs/programming.html

可惜這個咚咚比較久,以及使用範圍不是很廣,不然翻譯一下,鍛鍊自己


2. 幾個關鍵函數:

2.1 su_base_port.c中的“su_base_port_send”函數,用於把消息加到消息隊列中



2.2 su_base_port.c:su_base_port_getmsgs,用於取出消息隊列,然後通過“su_base_port_execute_msgs”函數把消息發送到應用程序,實現如下:




2.3 su_base_port.c:su_base_port_execute_msgs,執行消息隊列中每個消息的回調函數“f”




3. 相關的數據結構

3.1 su_base_port.c中不少函數的參數都有一個"su_port_t"類型的參數,在代碼中查找可以發現該類型的最終定義是“su_base_port_t”,在su_port.h中,如下所示:


這裏還對sofia-sip中Port進行解釋,一個單線程的reactor



3.2 vtable的定義,在su_epoll_port.c中,圖中標紅的部分就是


通過代碼查找和單步調試,總是跟到如下代碼時跟不了


實際上,"base->sup_vtable->su_port_send(self, rmsg)"這句調用的是註冊到vtable中的"su_base_port_send"函數



freeswitch和sofia-sip中關於sip的消息機制先介紹到這裏,等以後有其他收穫時再與大家分享。

Michael

1985082200

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