pjsip是純C語言寫的一個sip協議庫,整個代碼寫得仍是比較模塊化的,得益於此的設計,只要理解了pjsip的設計,就能夠對其網絡層進行擴展。git
咱們項目是QT做爲主要開發工具,而PJSIP的庫默認是利用select或者io queue的,只能開啓一個線程去接受和發送,沒法直接在QT的界面線程裏面進行接受和發送。致使編程模型比較複雜,常常要在兩個線程進行通信,而且要注意內存數據競爭的問題。github
咱們項目裏面並無效率要求,不須要獨立一個IO的線程,反而穩定性更重要。爲了簡化編程模型,方便新人維護,因此仍是硬着頭皮適配了一下PJSIP的網絡層。編程
主要是要看完PJSIP的開發手冊,加上閱讀sip_transport_udp的源碼,就能仿造出一套QT UDP的適配模型了網絡
須要注意的是,PJSIP是使用純C語言開發的,而且內部直接使用了不少內存的強轉,爲了避免破壞內部的代碼結構,因此我使用的qt_sip_udp_transport用的也是pod的結構,而且使用std::is_pod和std::static_assert進行編譯器檢查,防止後續的人維護破壞了模塊化
內存結構。具體代碼以下工具
static void AutoCheck() { static_assert( std::is_pod<qt_sip_udp_transport>::value, "not pod of qt_sip_transport"); }
github地址:開發工具
https://github.com/linyilong3/qt_pjsip.git測試
尚未在實際環境中使用,基本測試已經OK了,後續使用後再看看有什麼問題。spa