osip編譯
A. 跪求VS2008下如何編譯exosip
當我有這個問題的時候,就一直Mark你的問題,結果等到我解決了你的問題還沒人回答。
我來回答下吧。
OK,先從http://download.savannah.gnu.org/releases/exosip/ 下載exosip2最新項目,我是用的
libeXosip2-3.6.0,編譯工具VS2008
前期需要什麼?osip2開源項目,openssl開源項目,或者直接下載已經編譯好的lib和dll
自己新建一個空的dll項目,將其中exosip2中的源代碼和頭文件都加進來,在自己的項目目錄下建一個include和一個lib目錄。include里將osip和openssl的頭文件加進來,lib里將osip和openssl的lib文件加進來。(官方放出的源代碼里竟然有個低級變數沒聲明的錯誤,自己改過來)然後就是搞人的項目屬性問題了。按照下面的來
編譯的附加包含目錄指定之前建好的include目錄
鏈接的附加庫目錄指定之前建好的lib目錄
預處理宏定義處:SRV_RECORD;_CRT_SECURE_NO_DEPRECATE;HAVE_OPENSSL_SSL_H;EXOSIP_EXPORTS;_DEBUG;ENABLE_TRACE;WIN32;_WINDOWS;_USRDLL;OSIP_MT;_MT
鏈接器附加依賴項:
osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.Lib WS2_32.Lib Dnsapi.lib ssleay32.lib libeay32.lib Crypt32.Lib
編譯自己建好的exosip2項目,如果有鏈接錯誤,檢查出錯的函數的頭文件和lib文件是否被正確指明路徑。我在編譯的時候很多osip的函數連接錯誤,發現osip2的def文件里有些函數沒聲明,所以接著改def文件,重新編譯osip2,再返回exosip項目編譯。
總之折騰半天後算是通過了,生成exosip2.lib 和exosip2.dll。
希望能幫到你,我就這樣解決了。
B. 使用VC++2008編譯exosip的動態庫文件dll遇到無法解析的外部符號問題。
產生這些錯誤是因為需要用到的一些函數在osip庫在def文件中沒導出。需要修改\libosip2-3.6.0\platform\vsnet目錄下面的osip2.def、osipparser2.def兩個文件,在文件的末尾導出這些函數,具體如下:
osip2.def:
osip_transaction_set_naptr_record @138
osipparser2.def:
osip_realloc @416
osip_strcasestr @417
__osip_uri_escape_userinfo @418
C. 如何用c++調用pjsip庫實現一個簡單的sip伺服器
1、開源的sip伺服器端,比較好用的是Asterisk,標准C程序實現,代碼清晰。
2、sip的client相對比較多,主要有exosip,pjsip和opal。exosip簡單易用,在PC上用比較方便。但是涉及的相關資源太多,用了osip,srtp,ms2等眾多的開源庫,ms2下面還用到了ffmpeg,別的不說,光編譯就是噩夢。opal功能最強,雖然也用到了ffmpeg ,但是自己封裝的非常好,採用插件方式,調用靈活。opal採用class方式提供封裝,介面非常友好。感覺唯一不爽的地方,就是低層使用了ptlib,雖然多平台下都很好用,但放在嵌入式下感覺稍龐大了一些。pjsip精巧,方便移植,嵌入式下應該是首選。不過視頻頻支持方面擴展起來比opal麻煩。個人感覺,對於windows開發者來說,pjsip最大的好處就是代碼調試方便。整個工程一次編譯通過,另外兩個庫還要找很多相關的資源
。
3、其他的一些協議棧也調試過,比如reSipphone,好象是這個名字,還有Yate,不過從快速開發角度看,都不太合適。現在搞sip開發的,一開始就是先找好協議棧。linphone,ekiga什麼的,但龐大。對於剛開始做的,最好是一個精簡的demo。後來找到pjsip下面的幾個例子,慢慢地了解了sip的工作流程,當然少不了抓包工具和tcpmp。
不過,其實,sip沒有想像中的那麼麻煩。現在回頭看,剛開始做項目,使用協議棧絕對不是好想法。如果換個方向,先熟悉SIP基本協議,然後自己改造一個,或完全寫一個,可能效果更好。
D. 大家來看這個main函數是不是大大的有問題啊
運行的時候命令行輸入呀,裡面不是有例子么,
你編譯出來文件名是tvia,輸入的文件名為vias.txt
那麼要執行就是在cmd裡面輸入tvia vias.txt回車
argv[0]就是文件名,argv[1]表示第一個命令行參數,在這里就是vias.txt
E. 如何修改環境變數LD
在linux下的編程,毫無疑問的遲早都要用到LD_LIBRARY_PATH這個環境變數,不過這個環境變數是基於shell的,也就是說只有在當前設置了的shell里才會有作用,因此每次打開新的shell運行程序不停地設置LD_LIBRARY_PATH,是一件非常麻煩的事情,所以我們就會想有不有什麼一勞永逸地方法,使得設置之後就不用再去設置了?答案是肯定的,即在~/目錄下打開.bash_profile文件,設置環境變數如下:
Java代碼
1.LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
2.export LD_LIBRARY_PATH
LD_LIBRARY_PATH=dir:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH 那麼以後打開新的shell執行程序是,再也不用每次打開shell就設置LD_LIBRARY_PATH環境變數了。
附:
linux共享庫位置配置(LD_LIBRARY_PATH環境變數 或者 更改/etc/ld.so.conf 或者 使用-R選項)今天下午嘗試使用libosip2,安裝比較簡單,按照自帶的help文檔裡面的操作進行即可。
$>mkdir linux-build
$>cd linux-build
$>../libosip2-2.2.0/configure
$>make (最後2步要在管理員許可權下執行)
# make install
完成之後,會在/usr/local/lib路徑下生成一些lioosipXXX.so的文件,在/usr/local/include下生成關於 osip的頭文件。
為了測試安裝是否正確,在eclipse下建了個測試項目,寫了很簡單的代碼:
#include <sys/time.h>//不加的話,編譯時會報錯,可能osip依賴於time.h
#include <osip2/osip.h>
//之所以能找到/usr/local/include下關於osip的頭文件,是因為eclipse默認把/usr/local/include 放到Include directories裡面了。在eclipse的項目屬性-->C++ General-->Path and symbols -->Include裡面可以看到。
F. 如何編譯osip和exosip
1.進入libosip2-3.6.0\platform\vsnet目錄,用VS2010直接打開osip.sln文件,項目自動轉換
2.更改libosip2-3.6.0\platform\vsnet\osip2.def 文件,在文件末尾追加
osip_transaction_set_naptr_record @138
3.更改libosip2-3.6.0\platform\vsnet\osipparser2.def 文件,在文件末尾追加
osip_realloc @416 osip_strcasestr @417
__osip_uri_escape_userinfo @418
4.先編譯osipparser2,再編譯osip2,最後在libosip2-3.6.0\platform\vsnet\Debug DLL下生成庫文件:
G. 畢業設計 SIP協議的實現
我們先進行一個簡單的純SIP信令(不帶語音連接建立)的UAC的SIP終端的程序開發的試驗(即一個只能作為主叫不能作為被叫的的SIP軟電話模型),我們創建一個MFC應用程序,對話框模式,照上面的說明,設置工程包含我們上面得到的oSIP的相關開發庫及SDK的一些開發庫,並且由於默認LIBC的沖突,需要排除MSVCRT[D]開發庫(其中D代表Debug模式下,沒有D表示Release模式下),直接使用eXosip的幾個主要函數就可以創建一個基本的SIP軟電話模型。
其主要流程為:
初始化eXosip庫-啟動事件監聽線程-向SIP Proxy注冊-向某SIP終端(電話號碼)發起呼叫-建立連接-結束連接
初始化代碼:
int ret = 0;
ret = eXosip_init ();
eXosip_set_user_agent("##YouToo0.1");
if(0 != ret)
{
AfxMessageBox("Couldn't initialize eXosip!\n");
return false;
}
ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);
if(0 != ret)
{
eXosip_quit ();
AfxMessageBox("Couldn't initialize transport layer!\n");
return false;
}
啟動事件監聽線程:
AfxBeginThread(sip_uac,(void *)this);
向SIP Proxy注冊:
eXosip_clear_authentication_info();
eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);
real_send_register(30); /* 自定義函數代碼請見源碼 */
發起呼叫(構建假的SDP描述,實際軟電話使用它構建RTP媒體連接):
osip_message_t *invite = NULL; /* 呼叫發起消息體 */
int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");
if (i != 0)
{
AfxMessageBox("Intial INVITE failed!\n");
}
char localip[128];
eXosip_guess_localip (AF_INET, localip, 128);
snprintf (tmp, 4096,
"v=0\r\n"
"o=josua 0 0 IN IP4 %s\r\n"
"s=conversation\r\n"
"c=IN IP4 %s\r\n"
"t=0 0\r\n"
"m=audio %s RTP/AVP 0 8 101\r\n"
"a=rtpmap:0 PCMU/8000\r\n"
"a=rtpmap:8 PCMA/8000\r\n"
"a=rtpmap:101 telephone-event/8000\r\n"
"a=fmtp:101 0-11\r\n", localip, localip, "9900");
osip_message_set_body (invite, tmp, strlen(tmp));
osip_message_set_content_type (invite, "application/sdp");
eXosip_lock ();
i = eXosip_call_send_initial_invite (invite);
eXosip_unlock ();
掛斷或取消通話:
int ret;
ret = eXosip_call_terminate(call_id, dialog_id);
if(0 != ret)
{
AfxMessageBox("hangup/terminate Failed!");
}
H. 如何學習sip,eXosip/osip!!!希望給點建議。
1、先了解sip協議本身
2、閱讀exosip、osip相關文檔
3、下載和編譯exosip、osip源碼
4、寫demo
I. sip協議如何用C語言實現
1、開源的sip伺服器端,比較好用的是Asterisk,標准C程序實現,代碼清晰。
2、sip的client相對比較多,主要有exosip,pjsip和opal。exosip簡單易用,在PC上用比較方便。但是涉及的相關資源太多,用了osip,srtp,ms2等眾多的開源庫,ms2下面還用到了ffmpeg,別的不說,光編譯就是噩夢。opal功能最強,雖然也用到了ffmpeg ,但是自己封裝的非常好,採用插件方式,調用靈活。opal採用class方式提供封裝,介面非常友好。感覺唯一不爽的地方,就是低層使用了ptlib,雖然多平台下都很好用,但放在嵌入式下感覺稍龐大了一些。pjsip精巧,方便移植,嵌入式下應該是首選。不過視頻頻支持方面擴展起來比opal麻煩。個人感覺,對於windows開發者來說,pjsip最大的好處就是代碼調試方便。整個工程一次編譯通過,另外兩個庫還要找很多相關的資源
。
3、其他的一些協議棧也調試過,比如reSipphone,好象是這個名字,還有Yate,不過從快速開發角度看,都不太合適。現在搞sip開發的,一開始就是先找好協議棧。linphone,ekiga什麼的,但龐大。對於剛開始做的,最好是一個精簡的demo。後來找到pjsip下面的幾個例子,慢慢地了解了sip的工作流程,當然少不了抓包工具和tcpmp。
不過,其實,sip沒有想像中的那麼麻煩。現在回頭看,剛開始做項目,使用協議棧絕對不是好想法。如果換個方向,先熟悉SIP基本協議,然後自己改造一個,或完全寫一個,可能效果更好。