说明:
本文的开发环境是——
Windows XP SP2+ VC++6.0
。文中使用的
oSIP
协议栈是
libosip2-3.0.3
和
libeXosip2-3.0.3
。本文将依次对
osipparser2
、
osip2
、
exosip2
的编译方法进行介绍。
一、
osipparser2
的编译
1
、
动态库
以
osipparser2
为工程名,创建空的动态库工程,
File-> New-> Projects-> Win32 Dynamic-Link Library
:
Project Name
输入
osipparser2
,点击
OK
即可。
将
libosip2-3.0.3/src/osipparser2
文件夹下的文件全部复制到我们刚创建的工程的根目录下,并在
VC++6.0
下将所有的源文件和头文件都加入到工程内,
Project-> Add To Project-> Files
:在打开的对话框中选择全部
*.c
和
*.h
文件,点击
OK
即可。
将
libosip2-3.0.3
中的
INCLUDE
文件夹导入到创建的工程中,
Tools-> Options-> Directories
:新建
-
选择浏览
-
确定。
保存工程,编译,成功!在
Debug
文件夹中生成
osipparser2.dll
!
2
、
静态库
以
osipparser2
为工程名,创建空的静态库工程,
File-> New-> Projects-> Win32 Static Library
:
Project Name
输入
osipparser2
,点击
OK
即可。
导入
libosip2-3.0.3/src/osipparser2
文件夹下的所有源文件和头文件至工程。
导入
libosip2-3.0.3
中的
INCLUDE
文件夹。
保存工程,编译,成功!在
Debug
文件夹中生成
osipparser2.lib
!
二、
osip2
的编译
1
、
动态库
基本方法同
osipparser2
,相似处不再赘述。
以
osip2
为工程名,创建空的动态库工程。
导入
libosip2-3.0.3/src/osip2
文件夹下的所有源文件和头文件至工程。
导入
libosip2-3.0.3
中的
INCLUDE
文件夹。
导入刚才编译成功的
osipparser2.lib
,
Project-> Settings-> Link
:
Object/library modules
填入
osipparser2.lib /NODEFAULTLIB:LIBCD.lib
(避免
Warning LNK4098
)。
增加
OSIP_MT
宏,以启用线程库,
Project-> Settings-> C/C++
:
Preprocessor definitions
填入
OSIP_MT
。
选择
run-time library
为
Debug Multithreaded DLL, Project-> Settings-> C/C++
:
Category
选择
Code Generation
,在
Use run-time library
中调整。
安装完毕之后,进行下面操作。
导入
Microsoft Platform SDK
的
INCLUDE
文件夹,移至最上。
导入
Microsoft Platform SDK
的
LIB
文件夹,
Tools-> Options-> Directories
:选择
LIB FILES
后,新建
-
选择浏览
-
确定,移至最上。
保存工程,编译,成功!在
Debug
文件夹中生成
osip2.dll
!
2
、
静态库
以
osip2
为工程名,创建空的静态库工程。
导入
libosip2-3.0.3/src/osip2
文件夹下的所有源文件和头文件至工程。
导入
libosip2-3.0.3
中的
INCLUDE
文件夹。
加入
OSIP_MT
宏,以启用线程库。
导入
Microsoft Platform SDK
的
INCLUDE
文件夹,移至最上。
导入
Microsoft Platform SDK
的
LIB
文件夹,移至最上。
保存工程,编译,成功!在
Debug
文件夹中生成
osip2.lib
!
三、
exosip2
的编译
1
、
动态库
以
exosip2
为工程名,创建空的动态库工程。
导入
libeXosip2-3.0.3/src
文件夹下的所有源文件和头文件至工程。
加入
OSIP_MT
宏,以启用线程库。
选择
run-time library
为
Debug Multithreaded DLL, Project-> Settings-> C/C++
:
Category
选择
Code Generation
,在
Use run-time library
中调整。
导入刚才编译成功的
osipparser2.lib osip2.lib
和
/NODEFAULTLIB: LIBCD.lib
。
导入
WSock32.Lib IPHlpApi.Lib WS2_32.Lib
(
Microsoft Platform SDK
的
LIB
文件夹中的文件)。
导入
libosip2-3.0.3
中的
INCLUDE
文件夹。
导入
libeXosip2-3.0.3
中的
INCLUDE
文件夹。
导入
Microsoft Platform SDK
的
INCLUDE
文件夹,移至最上。
保存工程,编译,成功!在
Debug
文件夹中生成
exosip2.dll
!
2
、
静态库
以
osip2
为工程名,创建空的静态库工程。
导入
libosip2-3.0.3/src/osip2
文件夹下的所有源文件和头文件至工程。
导入
libosip2-3.0.3
中的
INCLUDE
文件夹。
加入
OSIP_MT
宏,以启用线程库。
选择
run-time library
为
Debug Multithreaded, Project-> Settings-> C/C++
:
Category
选择
Code Generation
,在
Use run-time library
中调整。
导入
Microsoft Platform SDK
的
INCLUDE
文件夹,移至最上。
导入
Microsoft Platform SDK
的
LIB
文件夹,移至最上。
保存工程,编译,成功!在
Debug
文件夹中生成
exosip2.lib
!
NAT TRAVERSAL Reference Collection
1) NAT Traversal 技术 NATTraversal的解决方案提出的和实现的都不少,方案包括最开始看到的STUN(不支持很常用的对称NAT),TURN,ICE。ICE是一个基于STUN和TURN的框架,目前还是草案,没有找到相关的实现项目。刚刚看到了一个NAT Traversal BestPractices的文档,里面对TURN的评价是实现困难,而ICE也不是100%有效。根据这个文档中提到的两个目前较好的解决方案是开源的OpenSER和MediaProxy(分别针对SIP中的signal和media流)。
2) 相关资源
VOCAL——无NAT Traversal相关内容,但其网站上有STUND的源码,可用。http://www.vovida.org/
OpenSER——用于SIP signal穿越NAT,http://openser.org
MediaProxy——用于SIP media穿越NAT,http://mediaproxy.ag-projects.com/,http://www.ag-projects.com/MediaProxy.html
在查资料的时候,有个意外的发现,就是看到了YATE(
Yet Another Telephony Engine)作者写的文章,里面提到了他们这个项目如何穿越NAT,SKYPE如何穿越NAT。http://freshmeat.net/articles/view/2079/
NAT BestPractices是MediaProxy项目的人写的,有一定参考价值;另外那个文档没有什么新鲜的内容,但是里面对STUN介绍比较多,推荐在需要了解STUN RFC中提到的4类防火墙的时候和STUN技术的时候参考这个文档,因为它配有示意图,容易理解。
|