Visual Studio 2010下编译osip及eXosip并搭建开发环境的方法

第一步,下载:
到http://download.savannah.gnu.org/releases/osip/libosip2-3.6.0.tar.gz下载最新的osip库并解压。

到http://download.savannah.gnu.org/releases/exosip/libeXosip2-3.6.0.tar.gz下载最新的eXsoip库并解压。

第二步,编译osip2:
1.用VS2010打开libosip2-3.6.0/platform/vsnet/osip.sln
2.对osip2和osipparser2项目分别编译生成Debug DLL

第三步,编译eXosip2:
1. 将刚刚生成的,位于libosip2-3.6.0/platform/vsnet/Debug DLL/下的osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll文件拷贝到 libeXosip2-3.6.0\libeXosip2-3.6.0\platform\vsnet\Debug目录下 
2. 用VS2010打开libeXosip2-3.6.0\platform\vsnet\eXosip.sln         
3. 我们暂时用不到openSSL,所以 工程名-->右击-->属性-->配置属性-->C/C++-->预处理器-->预处理器定义里面的HAVE_OPENSSL_SSL_H宏去掉
4. 在工程名-->右击-->属性-->配置属性-->C/C++ --> 常规 --> 附加包含目录: 将osip的头文件libosip2-3.6.0\include包含进来 
5. 编译,生成eXosip.lib

至此,在libeXosip2-3.6.0\platform\vsnet\Debug下生成osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll,eXosip.lib 5个文件

第四步,新建SIP通信项目 
1. 工程名-->右击-->属性-->配置属性-->链接器 --> 输入 --> 附加依赖项:增加静态库引用:Dnsapi.lib;Iphlpapi.lib;Ws2_32.lib;osip2.lib;osipparser2.lib;exosip.lib; 
2. 工程名-->右击-->属性-->配置属性-->C/C++ -->常规 -->附加包含目录: 将osip和eXosip的头文件libosip2-3.6.0\include,libeXosip2-3.6.0\include包含进来
3. 工程名-->右击-->属性-->配置属性-->链接器 --> 常规  --> 附加库目录:将osip和eXosip的库包含进来,libeXosip2-3.6.0\platform\vsnet\Debug, libosip2-3.6.0\platform\vsnet\Debug
4. 将之前编译完成的osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll,eXosip.lib 5个eXosip库文件放到项目下面的Debug目录下即可。


在项目编译过程中有可能会出现error LNK2019 无法解析的外部符号的错误,如下图所示。
产生这些错误是因为需要用到的一些函数在osip库在def文件中没导出。需要修改\libosip2-3.6.0\platform\vsnet目录下面的osip2.def、osipparser2.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
保存,关闭。回到第二步重新执行即可。


至此,eXosip开发的环境已经搭建完成,下面可以直接编码执行。将eXosip开发手册上的例子放在下面以供参考。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <WinSock2.h>  
  4. #include <ws2tcpip.h>     
  5. #include <eXosip2/eXosip.h>  
  6. #include <string.h>  
  7.   
  8. #define   BUFFSIZE   1024     
  9. #define   DEST_CALL    "sip:172.16.2.13"    
  10. #define   SOURCE_CALL  "sip:172.16.5.30:5060"  
  11. #define   DEST_PORT   5061   
  12.   
  13. //发送subscribe数据包  
  14. int SendSubscribe()  
  15. {  
  16.     eXosip_event_t *je;  
  17.     int i = 0;  
  18.     osip_message_t *subscribe;  
  19.     char tmp[BUFFSIZE];  
  20.   
  21.     //初始化  
  22.     i = eXosip_init();  
  23.     if (i != 0)  
  24.     {  
  25.         printf("Can not initialize eXosip!\n");  
  26.         return -1;  
  27.     }  
  28.     else  
  29.     {  
  30.         printf("eXosip_init successfully!\n");  
  31.           
  32.     }  
  33.   
  34.     //绑定端口  
  35.     i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5061, AF_INET, 0);  
  36.     if (i != 0)  
  37.     {  
  38.         eXosip_quit();  
  39.         printf("eXosip_listen_addr failed!\n");  
  40.     }  
  41.     else  
  42.     {  
  43.         printf("eXosip_listen_addr sucess\n");  
  44.     }  
  45.   
  46.     //subscribe,发起呼叫请求  
  47.     i=eXosip_subscribe_build_initial_request(&subscribe, DEST_CALL, SOURCE_CALL, NULL, "SE-INFO", 3600);  
  48.   
  49.     if(i != 0)  
  50.     {  
  51.         fprintf(stderr, "Initial INVITE failed!, %s\n", strerror(errno));  
  52.                   
  53.     }  
  54.     else  
  55.     {  
  56.         printf("Initial INVITE sucess!\n");  
  57.     }  
  58.   
  59.     snprintf (tmp, 1024,  
  60.                 "GET:FirmwareVer\r\n"  //话机的版本  
  61.                 "GET:MacAddress\r\n"   //话机的MAC地址  
  62.                 "GET:ConfigVer\r\n"   //配置文件的版本  
  63.                 //"SET:Telnet ip=192.168.3.108 port=5060\r\n"  
  64.                 //"SET:Reboot\r\n"  
  65.                 );  
  66.                   
  67.        
  68.           
  69.     osip_message_set_body(subscribe,tmp,strlen(tmp));  
  70.       
  71.     osip_message_set_content_type(subscribe,"application/SEM-TEXT");  
  72.       
  73.     eXosip_lock();  
  74.     i=eXosip_subscribe_send_initial_request(subscribe);   
  75.     eXosip_unlock();  
  76.   
  77.     while (1)  
  78.     {  
  79.         je = eXosip_event_wait (0, 200);    
  80.         if (je == NULL)    
  81.         {    
  82.             continue;  
  83.         }  
  84.         else  
  85.         {  
  86.             switch(je->type)   //可能会到来的事件类型  
  87.             {  
  88.   
  89.                 case EXOSIP_SUBSCRIPTION_ANSWERED:   //announce a 200ok  
  90.                     printf("收到200 OK!!\n");  
  91.                     break;  
  92.   
  93.                 case EXOSIP_SUBSCRIPTION_NOTIFY: //announce new NOTIFY   
  94.                     {  
  95.                         printf("收到EXOSIP_SUBSCRIPTION_NOTIFY!\n");  
  96.                         osip_body_t *body;  
  97.                         osip_message_get_body (je->request, 0, &body);  
  98.                           
  99.                         printf("%s\n", body->body);  
  100.                           
  101.                     }  
  102.                     break;  
  103.   
  104.                 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE:   // announce a request failure  
  105.                     printf("EXOSIP_SUBSCRIPTION_REQUESTFAILURE!\n");  
  106.                     break;  
  107.   
  108.                 case EXOSIP_CALL_ANSWERED: //收到200 OK,表示请求已经被成功接受,用户应答  
  109.                     printf("收到200 OK!\n");  
  110.                     //int call_id=je->cid;  
  111.                     //int dialog_id=je->did;  
  112.                     printf("call_id is %d,dialog_id is %d, je_status is %s, %s\n",je->cid,je->did, je->ss_status, je->ss_reason);  
  113.   
  114.                     //回送ack应答消息  
  115.                     //eXosip_call_build_ack(je->did,&ack);  
  116.                     //eXosip_call_send_ack(je->did,ack);  
  117.                     break;  
  118.                       
  119.                 case EXOSIP_SUBSCRIPTION_PROCEEDING:  
  120.                     {  
  121.                         printf("EXOSIP_SUBSCRIPTION_PROCEEDING!\n");  
  122.                         break;  
  123.                     }  
  124.   
  125.                 case EXOSIP_SUBSCRIPTION_REDIRECTED:  
  126.                     {  
  127.                         printf("EXOSIP_SUBSCRIPTION_REDIRECTED!\n");  
  128.                         break;  
  129.                     }  
  130.   
  131.                 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:  
  132.                     {  
  133.                         printf("EXOSIP_SUBSCRIPTION_SERVERFAILURE!\n");  
  134.                         printf("call_id is %d,dialog_id is %d, je_status is %s, %s\n",je->cid,je->did, je->ss_status, je->ss_reason);  
  135.                         break;  
  136.                     }  
  137.   
  138.                 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:  
  139.                     {  
  140.                         printf("EXOSIP_SUBSCRIPTION_GLOBALFAILURE!\n");  
  141.                         break;  
  142.                     }  
  143.   
  144.                 case EXOSIP_IN_SUBSCRIPTION_NEW:  
  145.                     {  
  146.                         printf("EXOSIP_IN_SUBSCRIPTION_NEW!\n");  
  147.                         break;  
  148.                     }  
  149.   
  150.                 default//收到其他应答  
  151.                     printf("other response!\n");  
  152.                       
  153.                     if (je->textinfo[0]!='/0')  
  154.                     {  
  155.                         printf( "(%i %i %i %i) %s", je->cid, je->sid, je->nid, je->did, je->textinfo);  
  156.                     }  
  157.                     break;  
  158.                 }  
  159.                   
  160.         }  
  161.   
  162.     }  
  163.         eXosip_event_free(je); //Free ressource in an eXosip event  
  164. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值