reSIProcate SIP协议栈的使用 && 如何让reSIProcate支持对话外(out of dialog INFO)的INFO...

reSIProcate SIP协议栈的使用

&& 如何让reSIProcate支持对话外(out of dialog INFO)的INFO


好久没有写过代码了,最近又开始搞代码,感觉挺好。之前Java搞得比较多,最近要搞SIP协议栈,从oSIP切换成reSIProcate,基于C++的。

总的感觉,reSIProcate没有oSIP简单易用,但上手之后,发现oSIP做得还是很不错的,跨平台、可扩展性强。


至于具体怎么用,可以参考reSIProcate现成的例子。如果使用VS,打开reSIProcate_9_0.sln后,里面有示例工程“basicCall”,这个例子虽小,但对UAS、UAC两种模式的使用,做了很好的演示,同时这个例子中UAC如何发送对话外的消息,UAS如何接收对话外的消息,都给了示例。把这个例子彻底搞透了,基于reSIProcate做一般UAS、UAC的开发,已经足够。

当然,上面的例子,只是一小部分的示例代码,SIP其实很庞大,reSIProcate对SIP规范实际上是非常好的。如一些基本消息的处理、SDP的解析和构造等,支持得也非常好。一开始搞reSIProcate我还担心不知道怎么搞,等我找到自带的很多示例代码后,发现reSIProcate真的做的非常完善,在resiprocate-1.6\resip\stack\test这个目录下,有很多示例代码,我能想到的一些常见问题,在这里面都可以找到示例用法,参考着做就可以了。

另外,在resiprocate-1.6\resip\dum\doc下,你可以找到很多有价值的文档和图示,对大家应该有帮助。我自己没有怎么看过,说实话我搞SIP已经有一年多了,对SIP的基本知识已经有足够的认识,里面的有些图示就是基于SIP的消息处理流程来输出reSIProcate内部函数处理的流程。如果你对SIP有基本认识,看那个图还是比较轻松的。


总的来说,SIP协议栈的切换还是比较轻松的,不过中间也出现一点小问题,就是reSIProcate默认不支持对话外的INFO(out of dialog INFO),当然也就不支持对话外INFO的响应消息了。这个问题还是让我郁闷了半天,一开始一直以为是配置的原因,后来搞了半天发现不是那么回事,后来又找同事了解了一下,据说RFC内对INFO的描述非常模糊,到底要不要支持对话外的INFO,RFC也没有明确指出,所以reSIProcate就不支持对话外的INFO。

后来,我又单步跟踪了一下代码,进一步确认了我的观点,reSIProcate确实不支持对话外的INFO,如果要让reSIProcate支持对话外的INFO,只能自己去修改代码了。我尝试了,改动三四处即可,reSIProcate即可以支持对话外的INFO了,我测试了一下,效果挺好,不过担心会不会有内存泄漏。


修改的文件不多,不过都在公司,如果有需要的朋友,可以给我发站内消息。我可以在家里修改好然后把文件上传作为附件。


另外,如果你有在Linux上使用reSIProcate的需要,编译前先运行 ./configure,其中的大部分选项都是reSIProcate的一些高级特性,建议你选NO。然后运行 make all 即可编译。如果你在32位的Linux上运行,可能还会遇到一个未定义的EOF错误,这个问题,你可以在出错函数的上方加上一句 #define EOF -1 ,就可以解决对应的编译错误了。

 

我个人还是比较喜欢在Linux上做一些代码测试,比如编译出来的BasicCall在Windows上无法抓包分析,这个比较痛苦。当然,如果要调试程序,还是VS来得方便,所以像reSIProcate还是比较好的,支持跨平台,Windows、Linux上都可以测试,非常方便。

你可能感兴趣的:(reSIProcate SIP协议栈的使用 && 如何让reSIProcate支持对话外(out of dialog INFO)的INFO...)