编译jrtplib第一个例子

来源:互联网 发布:网络视听许可证 挂靠 编辑:程序博客网 时间:2024/05/16 06:15

RTP是实时 传输协议的简称. 

JRTPLIB是一个很牛的老外用C++写的一个开源的RTP协议库, 用它可以进行数据的实时传输.我现在用的是jrtplib-3.7.0版本,下载地址http://research.edm.uhasselt.be/~jori/page/index.php?n=CS.Jrtplib 

下载完后把它解压,首先需要提醒的是jrtplib只是一个库,不是可执行程序,我们只需要它编译好的jrtplib.lib文件放到我们的VC++编译环境中就可以在我们自己的程序中使用了. 


解压出来后打开jrtplib.dsw进行编译,发现了jrtplib.lib - 4 error(s), 13 warning(s), 看了一下错误的说明,都是缺少头文件jthread.h 和 jmutex.h. 因为jrtplib支持线程,所以还得去下另外一个开源的东西jthread.我现在用的是jthread-1.2.1,下载地址不记得了. 百度一下相信会有 :) . 


下载完后,打开src目录,把jmutex.h和jthread.h复制到jrtplib-3.7.0/src目录,再对其进行编译.发现还是找不到,什么原因呢,嘿嘿,别急,把#include <jmutex.h> 改成#include "jmutex.h",同样的#include <jthread.h> 改成#include "jthread.h", 这样编译就通过了. 


这里会有33个警告jrtplib.lib - 0 error(s), 33 warning(s),不用管它,算是编译器的一个BUG吧,用Win32 Debug才会出现的警告.成功以后就可以去Debug复制jrtplib.lib到D:/Program Files/Microsoft Visual Studio/VC98/Bin目录中,我的VC6.0是装在D盘. 


这时再把之前下载的jthread编译,直接编译就可以成功了,在debug目录中把jthread.lib也复制到里面.这样jrtplib就算编译完成了. 

我用的是VC6.0SP6环境 

用VC新建一个Win32的空工程,我命名为test3,把jrtplib-3.7.0/examples目录下的example1.cpp复制到该工程的目录下.在工程中建一个文件夹header专门用来保存头文件. 


把jrtplib-3.7.0/src目录中的头文件复制到header文件夹中.这时就可以在test3把example1.cpp和这些头文件加入到工程中去.(Add Files to Project..).
<!--[if !supportLineBreakNewLine]-->
<!--[endif]--> 

打开example1.cpp进行编译.发现错误e:/wu/c++/test3/example1.cpp(6) : fatal error C1083: Cannot open include file: 'rtpsession.h': No such file or directory Error executing cl.exe. 


找不到头文件 rtpsession.h, 我们把example1.cpp源码改一下#include "rtpsession.h" 改成#include "header/rtpsession.h", header就是我们建的那个文件夹名.同样的,把其它头文件包含的都改过来.有引号的改,其它像#include <stdlib.h> 是系统目录的,不用改. 


此时再次编译,又出了22个错误和5个警告.test3.exe - 22 error(s), 5 warning(s). 都是链接错误. 原因很简单了,因为我们还没把jrtplib.lib和jthread.lib引入到工程当中去,还有网络通信少不了的ws2_32.lib库,在源码的 头顶处加上 #pragma comment(lib,"jrtplib.lib")
#pragma comment(lib,"jthread.lib")
#pragma comment(lib,"ws2_32.lib")
也可以在Project -> setting -> Link 中把 jrtplib.lib jthread.lib ws2_32.lib 加进去,这样就不用在源码上改了 

加进去后,再编译,发现还是错test3.exe - 14 error(s), 6 warning(s),又是链接错误,这时还得改一个地方,也是最后一个地方,Project -> setting -> C/C++ ,Category中选择Code Generation,然后在Userun-time library中选择Multithreaded DLL,因为我们用到了多线程的链接库,得修改这个地方. 修改完后终于可以编译成功了.当时真的很高兴 呵呵.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]--> 

怀着兴奋的心情运行第一个例子. 

第一个提示 Enter local portbase: ,意思很明白,一个主机端口,我输入了8989,然后回车,第二个提示 Enter the destination IP address 输入目标IP地址,我输入了127.0.0.1本机嘛. 第三个提示 Enter the destionation port 目标端口,直接输入8888.然后回车再来个提示Number of packets you wish to be sent: 你想发送多少个包,我想发送10个就输入10吧,回车. 此时错误来了:ERROR: The specified port base is not an even number,主机端口错了...怎么回事.关了再来 输入9999 127.0.0.1 8888 10 问题还是一样.这就郁闷了,源码的问题吗,看了一个源码貌似都没有错.然后就去百度了.找了很久,终于找到一个答案:jrtplib只能用偶数的端口号.... - -!汗. 重新试了一下,输入 6666 127.0.0.1 8888 10 ,终于可以发了,
<!--[if !supportLineBreakNewLine]-->
<!--[endif]--> 

但是还有一个问题,就是发的时候为什么收不到,源码中有接收的.这个问题百度了很久,都没有答案,最后自己发现的,原来把本地端口号和目标端口号一致就可以接收得到了.输入8888 127.0.0.1 8888 10,再测试,
Sending packet 1/10
Got packet !

Sending packet 2/10

Sending packet 3/10
Got packet !
Got packet !

Sending packet 4/10

Sending packet 5/10
Got packet !
Got packet !

Sending packet 6/10
Got packet !

Sending packet 7/10
Got packet !

Sending packet 8/10
Got packet !

Sending packet 9/10
Got packet !

Sending packet 10/10
Got packet !
Press any key to continue
<!--[if !supportLineBreakNewLine]-->
<!--[endif]--> 

是数据传输需要一定的时间吧,有时候发一次包并不能立即收到.第一个例子就这样顺利编译完成. 

--------------------------
找的资料和大家分享一下

 

 

转自 http://topic.csdn.net/u/20070902/14/6dca36ee-352c-42a5-bc97-67662faf6434.html

原创粉丝点击