JRTPLIB在arm和pc间收不到数据包的问题
来源:互联网 发布:linux虚拟机 限制cpu 编辑:程序博客网 时间:2024/04/30 07:05
1. 下载jrtplib-3.7.1和jthread-1.2.1。
2. pc上编译很简单,windows下编译过程如下:
首先编译jthread库。然后解压缩jrtplib,打开jrtplib.dsw工程,注意工程的include路径设置,要包含jrtplib和jthread的头文件,然后编译。将编译生成的jrtplib.lib和jthread.lib拷贝到Microsoft Visual Studio的VC98/Lib目录下。在编译jrtplib.lib和jthread.lib的时候,在project——settings——C/C++——Code generation:use run-time library中,对于debug,选择:Debug Multithreaded DLL,对于release,则选择:Multithreaded DLL。那些example的编译,需要在cpp文件开头加上:#pragma comment(lib, "jrtplib.lib")#pragma comment(lib, "jthread.lib")#pragma comment(lib, "WS2_32.lib")//pragma的作用自己上网查吧编译的时候,同样选择编译选项:Debug Multithreaded DLL(对于debug);Multithreaded DLL(对于release)。然后在windows上测试example1,这是一个往指定IP的端口上发包的程序,同样也可以收包,测试通过。
3.jrtplib库的移植,主要参考了这篇文章http://blog.csdn.net/neohuo/archive/2006/03/08/618684.aspx
编译器我用的arm-linux-gcc3.4.1,2.95.3也用过,不过需要修改一下rtperror里面的代码。可能还有些问题没提到,自己注意一下吧。
4.移植成功后,我遇到了第一个棘手的问题,提示can't retrieve login name,建立不了rtpsession。
后来发现是RTPSession::CreateCNAME这个函数搞得鬼
这个函数会从系统调用里获取loginname,但是一般的板子由于内核和文件系统的原因都没有loginname,所以
if (!gotlogin) { char *logname = getenv("LOGNAME"); if (logname == 0) return ERR_RTP_SESSION_CANTGETLOGINNAME;//这里return了一个error strncpy((char *)buffer,logname,*bufferlength); }
所以我强制将logname的值设为root,就ok了。
5.有些人会遇到arm和pc无法互相接受数据包的问题,但是pc和pc,arm和arm就可以收到。我用sniffer抓了一下包发现确实是有数据包的,所以应该不是程序的问题。这个问题上网查了一下,也没人说的明白,只有一个高人点了一下,可能是字节序和位域的问题。自己又研究了一下,也是一知半解。
一般x86的pc机是用小端字节序(little endian),而嵌入式平台一般是大端字节序(big endian),可能是由于字节序的不同,导致了明明存在数据包,却认不出来的问题。其实,JRTPLIB的开发者可能已经考虑到了这个问题(真牛),在rtpstructs.h中,有这样的代码定义:
struct RTPHeader{#ifdef RTP_BIG_ENDIAN uint8_t version:2; uint8_t padding:1; uint8_t extension:1; uint8_t csrccount:4; uint8_t marker:1; uint8_t payloadtype:7;#else // little endian uint8_t csrccount:4; uint8_t extension:1; uint8_t padding:1; uint8_t version:2; uint8_t payloadtype:7; uint8_t marker:1;#endif // RTP_BIG_ENDIAN uint16_t sequencenumber; uint32_t timestamp; uint32_t ssrc;}; 这是一个位域结构体,明眼人一下子就看出来了,jrtplib库使用哪种字节序完全取决于RTP_BIG_ENDIAN的定义,这样问题就简单化了。
我看了一下我编译arm下jrtplib库的rtpconfig_unix.h这个文件,里面果然定义了一个RTP_BIG_ENDIAN,所以要和pc采用的小端字节序一样,将这个定义取消掉,重新编译库。
最后运行exmaple1例子,pc 和arm可以互相接受数据包拉!:)这样会引起其他什么问题我还不知道,明天就可以动手编写自己的程序了,呵呵。
zz:http://foxlf823.bokee.com/viewdiary.16593022.html
- JRTPLIB在arm和pc间收不到数据包的问题
- 补充上一篇(JRTPLIB在arm和pc间收不到数据包的问题)
- 使用Jrtplib编译的arm程序和pc无法通信的问题
- 安卓真机上UDP程序收不到PC机数据包的解决方法
- 安卓真机上UDP程序收不到PC机数据包的解决方法
- SQlite在PC和ARM上的编译移植
- SQlite在PC和ARM上的编译移植
- SQlite在PC和ARM上的编译移植
- SQlite在PC和ARM上的编译移植
- SQlite在PC和ARM上的编译移植
- 在嵌入式系统arm中R15和pc的关系
- Fiddler:在PC和移动设备上抓取HTTPS数据包
- ARM PC的值问题
- jrtplib的编译问题
- arm 的pc和lr寄存器
- ARM的PC和LR寄存器
- 无线网卡收不到数据包
- 数据库sqlite3.7.3 在PC端 和开发板arm的安装及编译
- CUBE、ROLLUP 、COMPUTE 使用详解
- 第一次来
- 对C/C++可变参数表的深层探索
- DataGridView控件与数据源绑定方法
- 开博拉!
- JRTPLIB在arm和pc间收不到数据包的问题
- 大连一游
- 通用缓存信息类
- 读后感:软件开发的葵花宝典
- eclipse不能自动构建class文件
- Oracle监听器启动失败的解决办法
- MySQL++在Visual studio 2005上配置
- word目录生成与页码处理
- 苏联27.5万亿美元消失的真相