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