1. 程式人生 > >VS2013下編譯osip和exosip的5.0版本靜態庫及搭建和簡單例子的實現

VS2013下編譯osip和exosip的5.0版本靜態庫及搭建和簡單例子的實現

# include <eXosip2/eXosip.h>  
# include <stdio.h>  
# include <stdlib.h>  
# include <Winsock2.h>  




int main(int argc, char *argv[])
{
struct eXosip_t *context_eXosip = eXosip_malloc();
eXosip_event_t *je = NULL;
osip_message_t *ack = NULL;
osip_message_t *invite = NULL;
osip_message_t *answer = NULL;
sdp_message_t *remote_sdp = NULL;
int call_id, dialog_id;
int i, j;
//int id;  
char *sour_call = "sip:
[email protected]
";
char *dest_call = "sip:[email protected]:15060";//client ip  
//char command;  
char tmp[4096];
//char localip[128];  
int pos = 0;
//初始化sip  
i = eXosip_init(context_eXosip);
if (i != 0)
{
printf("Can't initialize eXosip!\n");
return -1;
}
else
{
printf("eXosip_init successfully!\n");
}
i = eXosip_listen_addr(context_eXosip, IPPROTO_UDP, NULL, 15061, AF_INET, 0);
if (i != 0)
{
eXosip_quit(context_eXosip);
fprintf(stderr, "eXosip_listen_addr error!\nCouldn't initialize transport layer!\n");
}
for (;;)
{
//偵聽是否有訊息到來  
je = eXosip_event_wait(context_eXosip, 0, 50);
//協議棧帶有此語句,具體作用未知  
eXosip_lock(context_eXosip);
eXosip_default_action(context_eXosip, je);
//eXosip_automatic_refresh(context_eXosip);
eXosip_unlock(context_eXosip);
if (je == NULL)//沒有接收到訊息  
continue;
// printf ("the cid is %s, did is %s/n", je->did, je->cid);  
switch (je->type)
{
case EXOSIP_MESSAGE_NEW://新的訊息到來  
printf(" EXOSIP_MESSAGE_NEW!\n");
if (MSG_IS_MESSAGE(je->request))//如果接受到的訊息型別是MESSAGE  
{
{
osip_body_t *body;
osip_message_get_body(je->request, 0, &body);
printf("I get the msg is: %s\n", body->body);
//printf ("the cid is %s, did is %s/n", je->did, je->cid);  
}
//按照規則,需要回復OK資訊  
eXosip_message_build_answer(context_eXosip, je->tid, 200, &answer);
eXosip_message_send_answer(context_eXosip, je->tid, 200, answer);
}
break;
case EXOSIP_CALL_INVITE:
//得到接收到訊息的具體資訊  
printf("Received a INVITE msg from %s:%s, UserName is %s, password is %s\n", je->request->req_uri->host,
je->request->req_uri->port, je->request->req_uri->username, je->request->req_uri->password);
//得到訊息體,認為該訊息就是SDP格式.  
remote_sdp = eXosip_get_remote_sdp(context_eXosip, je->did);
call_id = je->cid;
dialog_id = je->did;


eXosip_lock(context_eXosip);
eXosip_call_send_answer(context_eXosip, je->tid, 180, NULL);
i = eXosip_call_build_answer(context_eXosip, je->tid, 200, &answer);
if (i != 0)
{
printf("This request msg is invalid!Cann't response!\n");
eXosip_call_send_answer(context_eXosip, je->tid, 400, NULL);
}
else
{
/*snprintf(tmp, 4096,
"v=0\r\n"
"o=anonymous 0 0 IN IP4 0.0.0.0\r\n"
"t=1 10\r\n"
"a=username:rainfish\r\n"
"a=password:123\r\n");
*/
//設定回覆的SDP訊息體,下一步計劃分析訊息體  
//沒有分析訊息體,直接回復原來的訊息,這一塊做的不好。  
osip_message_set_body(answer, tmp, strlen(tmp));
osip_message_set_content_type(answer, "application/sdp");


eXosip_call_send_answer(context_eXosip, je->tid, 200, answer);
printf("send 200 over!\n");
}
eXosip_unlock(context_eXosip);


//顯示出在sdp訊息體中的attribute 的內容,裡面計劃存放我們的資訊  
printf("the INFO is :\n");
while (!osip_list_eol(&(remote_sdp->a_attributes), pos))
{
sdp_attribute_t *at;


at = (sdp_attribute_t *)osip_list_get(&remote_sdp->a_attributes, pos);
printf("%s : %s\n", at->a_att_field, at->a_att_value);//這裡解釋了為什麼在SDP訊息體中屬性a裡面存放必須是兩列  


pos++;
}
break;
case EXOSIP_CALL_ACK:
printf("ACK recieved!\n");
// printf ("the cid is %s, did is %s/n", je->did, je->cid);   
break;
case EXOSIP_CALL_CLOSED:
printf("the remote hold the session!\n");
// eXosip_call_build_ack(dialog_id, &ack);  
//eXosip_call_send_ack(dialog_id, ack);   
i = eXosip_call_build_answer(context_eXosip, je->tid, 200, &answer);
if (i != 0)
{
printf("This request msg is invalid!Cann't response!\n");
eXosip_call_send_answer(context_eXosip, je->tid, 400, NULL);


}
else
{
eXosip_call_send_answer(context_eXosip, je->tid, 200, answer);
printf("bye send 200 over!\n");
}
break;
case EXOSIP_CALL_MESSAGE_NEW://至於該型別和EXOSIP_MESSAGE_NEW的區別,原始碼這麼解釋的  
/*
// request related events within calls (except INVITE)
EXOSIP_CALL_MESSAGE_NEW,          < announce new incoming request.
// response received for request outside calls
EXOSIP_MESSAGE_NEW,          < announce new incoming request.
我也不是很明白,理解是:EXOSIP_CALL_MESSAGE_NEW是一個呼叫中的新的訊息到來,比如ring trying都算,所以在接受到後必須判斷
該訊息型別,EXOSIP_MESSAGE_NEW而是表示不是呼叫內的訊息到來。
該解釋有不妥地方,僅供參考。
*/
printf(" EXOSIP_CALL_MESSAGE_NEW\n");
if (MSG_IS_INFO(je->request)) //如果傳輸的是INFO方法  
{
eXosip_lock(context_eXosip);
i = eXosip_call_build_answer(context_eXosip, je->tid, 200, &answer);
if (i == 0)
{
eXosip_call_send_answer(context_eXosip, je->tid, 200, answer);
}
eXosip_unlock(context_eXosip);
{
osip_body_t *body;
osip_message_get_body(je->request, 0, &body);
printf("the body is %s\n", body->body);
}
}
break;
default:
printf("Could not parse the msg!\n");
}
}
}

相關推薦

VS2013編譯osipexosip的5.0版本靜態搭建簡單例子實現

# include <eXosip2/eXosip.h>  # include <stdio.h>  # include <stdlib.h>  # include <Winsock2.h>  int main(int argc, char *argv[]){s

Linux系統 MySQL 5.78.0 版本安裝指南

一. 準備工作 1 刪除本地7中的mariadb: 檢視系統中是否已安裝 mariadb 服務: rpm -qa | grep mariadb 或 yum list installed | grep mariadb 如果已安裝則刪除 mariadb及其依賴的包: yum -y remove ma

iOS 9 平臺上 AFNetworking 框架 3.0 版本號解決的問題問題解決

mon ans net 介紹 otto rac -a div das iOS 9 平臺上 AFNetworking 框架 3.0 版本號解決的問題和問題解決太陽火神的漂亮人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商業用途-保持

【軟件編譯vs2013編譯notepad++源碼

編譯notepad++1 下載notepad++源碼 登錄notepad++官網https://notepad-plus-plus.org/2 對scintilla進行編譯,獲得SciLexer.dll文件 具體編譯方法請自行谷歌,本人趕時間,直接從已安裝的notepad++中復制了一份。

VS2013編譯json-c,並簡單生成json格式數據

ray string 數組 ring std bject sub obj ++ #include "stdafx.h"#include "json-c/json.h" int _tmain(int argc, _TCHAR* argv[]){ // 正常的json格式 js

Win 7 安裝 MIB-BROWSER 8.0 版本

browser mib win7 Win 7 下安裝 MIB-BROWSER 8.0 版本,安裝沒有問題,但是在啟動時總是提示:failed to register ocx components。找到幫助文件發現需要運行以下兩個文件(Please note that you have to run

ubuntu同時安裝使用不同版本

工作中我們時常需要在不同版本的庫間切換,如果同時安裝了多個版本的庫,將會讓我們的工作更加輕鬆.本文介紹了在ubuntu下安裝並使用不同版本庫的方法. 安裝 ubantu 下常用的庫安裝位置有兩個:/usr 和/usr/local. 通過apt-get 安裝的庫位於/usr,自己make

Ubuntu編譯SqlCipher以及解密微信資料庫EnMicroMsg.db過程

wget https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.4.2 ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=

Ubuntu18.04安裝配置Caffe-SSD-GPU版本並MNIST模型測試matlab caffe介面測試

Ubuntu18.04->sogou->顯示卡驅動->matlab2018a->cuda9.0->cudnn5.01->opencv3.4.1->caffe opencv 和caffe 比較難裝。其中opencv最為慢,主要make 一次太久。

jiacrontab 1.4.0 版本釋出,任務定時常駐管理工具

jiacrontab 是一款完全自主設計並實現的定時任務&常駐任務管理工具。 提供了方便的介面用於完全控制系統中執行的定時任務和常駐任務。 軟體結構 主要包括以下特點: 1、允許設定每個指令碼的超時時間,超時操作可選擇郵件通知管理者,或強殺指令碼程序。

mysql 5.55.6版本關於timestamp插null0的處理

Server version: 5.5.33-31.1-log Percona Server (GPL), Release rel31.1, Revision 566 mysql> CREATE TABLE `t1` ( `ID` int(11) N

Centos6編譯安裝gcc6.4.0

轉載自部落格園 https://www.cnblogs.com/milton/p/7653760.html 儲存學習用。 Centos6自帶的gcc4.4.7不支援c++11, 於是編譯安裝最新版的gcc wget https://gmplib.org/download

編譯原理(九) LR(0)文法分析法(演算法描述C++程式碼實現)

後期DEBUG發現make_set函式和make_go存在問題,於2015年12月4日更新了程式碼,見諒 概念梳理 最左推導:每一步替換最左邊的非終結符 最右推導:每一步替換最右邊的非終結符,最右推導稱為規範推導 短語:令G是一個文法,S是文法的開始符號

[筆記]Win10編譯Tesseract-OCR 4.0

Tesseract-OCR 4.0使用了LSTM網路,準確性相比3.x版本提升不少。 官網提供的安裝包會提供一堆DLL,而我需要的是一個靜態連結的exe檔案,所以只能重新編譯。 編譯環境 Windows 10 專業版 Visual Studio 2017 需要選擇開發桌面程式的相關元件,並

記levelDB在vs2013編譯測試過程

條件 boost (此次編譯採用boost_1-55-0版本) level windows版本 獲取地址:https://github.com/google/leveldb/tree/windows 過程 (注意boost和levelDB是否都是x86或x64版本

linuxg++ 編譯時動態靜態的連結標頭檔案問題

原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。  動態庫在編譯時不會被連線到目的碼中,而是在程式執行

CUDA8.09.0版本切換

CUDA deb方式安裝後,nvcc –version無效的問題 sudo apt-get autoremove nvidia-cuda-toolkit //檢視/usr/local/cuda/bin中是否有nvcc的可執行檔案 //在~/.bashrc中新增 export PATH=$

[環境配置]Ubuntu16.04編譯安裝gcc6.3.0

上一篇的SVS要用gcc6.3編譯,否則結果不正確,本來以為gcc很好裝,結果發現用apt-get安裝gcc6只能安裝6.5版本,程式碼作者奇特的要求只能用gcc6.3,沒辦法只能用原始碼裝了,期間碰見了各種各樣的問題,特此記錄。 1.環境要求 安裝gcc之前要安裝gmp,mpfr,mpc,isl這幾個庫

Bminer從11.0.0版本開發支援Ethash (ETH) Tensority (BTM) 的雙挖

Bminer從11.0.0版本開發支援Ethash (ETH) 和Tensority (BTM) 的雙挖 步驟1:訪問Bminer官網下載11.0.0版本。 如圖所示,紅框部分的包。    步驟2:找到您下載的Bminer檔案,並解壓。 步驟3:編輯mi

Centos 6.5 X64 環境編譯 hadoop 2.6.0 --已驗證

詳細參照原始碼路徑下的BUILDING.txt檔案 Centos 6.5 x64 hadoop 2.6.0 jdk 1.7 protobuf-2.5.0 maven-3.0.5 set environment export JAVA_HOME=/home/linux/jdk export