libMSRP for Windows

MSRP (Message Session Relay Protocol) 是一个基于 SIP,用于文本、消息交换的协议,主要用来在一个 session 里进行文本交换、消息传递、文件传输等,是开发基于 SIP/SIMPLE 方面应用的重要协议。我们知道用 SIP/SIMPLE 协议写的文字聊天工具只能支持无 session 的会话,也就是说 A 发一条消息,B 收到一条消息,A 和 B 之间没有 session(会话)。如果语音聊天就是有 session 的,A 打语音给 B,A 和 B 之间保持会话,保持一个连接状态的 session. 有 session 的文字聊天会带来什么好处呢?一个好处就是在保持连接的同时能互相传递文件,还有就是可以共享桌面、白板什么的。

2007年 VPSee 在一个 VoIP 开发项目中需要用到文件传输,我们的 VoIP 项目基于 SIP 协议而且要求支持 Mac 和 Windows 跨平台,所以要做文件传输自然而然就想到 MSRP,不幸的是当时只有一个 Linux C 版本的 Open Source MSRP 实现 libMSRP,Mac 天生就是 BSD 系统,libMSRP 可以直接在 Mac 上编译,我们还需要一个 Windows 版本的 libMSRP 库,就这样 VPSee 花了点时间把 libMSRP 移植到了 Windows 平台,特别是大家比较熟悉的 Visual Studio 开发环境下,当然我也针对 Window 上的 Unix 开发环境(MinGW)写了 Makefile,你也可以在 Window 平台上通过 make/gcc 编译通过。补充一句,现在又多了一个选择,一个 Python 版本的 MSRP 实现和库(http://msrprelay.org/)。

在移植过程中遇到很多小问题和 libMSRP 本身的 bug,不过总的说来 libMSRP 的代码量很小,移植还是比较顺利的,最麻烦的几个问题是:

  1. gcc 有一个很方便的扩展就是 typeof 宏,可以方便的得到数据的类型,但是 vc 不支持;
  2. Windows 里面没有 pthread 相关系统调用,需要用类似的 API 替换相关函数,为了不大量改动原 libMSRP 的代码保持源代码的清晰,我用了大量宏定义来做替换 ,比如:
    #define pthread_mutex_lock(pobject) WaitForSingleObject(*pobject,INFINITE)
    #define pthread_mutex_unlock(pobject) ReleaseMutex(*pobject)
    ⋯⋯
  3. Windows API 里没有 socketpair,需要自己写个函数模拟 Linux 下的 socketpair 函数的功能。

libMSRP 遵循 GNU General Public License (GPL) 协议,libMSRP for Windows 也遵循同样的开放版权协议。详细的编译方法和源代码下载在这里:http://www.vpsee.com/projects,projects 使用英文页面,希望对更多的人会有帮助。

评论 (2 Comments)

  1. vpsee大,我是个新手,您能不能提供一些asterisk中集成libmsrp的资料,或者您给提点两句,小弟不胜感激!!
    我目前想把libmsrp集成到asterisk中去,只是有个想法,苦无头绪,望您能百忙中指点一二。

  2. >>Windows API 里没有 socketpair,需要自己写个函数模拟 Linux 下的 socketpair 函数的功能。
    这个功能怎么实现的?我在sourceforge中找到的Msrp中没有看到该函数在windows下的实现。我正想使用这个功能,还不知道是否有回音,,,,若能给我一份windows下的实现,不胜感激额!
    amiaogong@163.com

发表评论