免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1792 | 回复: 0

关于使用JRTPlib进行多播(Multicast)的问题 [复制链接]

论坛徽章:
0
发表于 2009-03-17 22:18 |显示全部楼层
我想基于JRTPlib实现以下功能:
一台Linux/Windows主机往一个组播地址(224.1.1.1)不断发送流数据,另外多台Linux机器/终端通过加入这个组播地址来实时的收取流数据。

现在在初步在一台Fedora9机器上做测试,用两个进程,一个sender不断往组播地址(224.1.1.1)发数据;另一个receiver不断从此组播地址收数据。
目前receiver不能收到任何数据,我用的是JRTPlib3.7.1,肯定是支持组播的,在网上也看到有人做成功过。

那位路过的大家能帮忙看看我的以下代码写的有什么问题吗?不胜感激,先行谢过!
sender.cpp
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <termios.h>

void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout < < "ERROR: " < < RTPGetErrorString(rtperr) < < std::endl;
exit(-1);
}
}

struct termios oldttystate;

void set_crmode(uint8_t cr)
{
if(cr)
{
struct termios ttystate;
tcgetattr(0, &ttystate);

oldttystate = ttystate;

ttystate.c_lflag &= ~ICANON;
ttystate.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &ttystate);
}
else
{
tcsetattr(0, TCSANOW, &oldttystate);
}
}

int main(void)
{

RTPSession sess;
uint16_t localport, destport;
uint32_t destip;
int status;
uint8_t c;

RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;

localport = 5000;
destip = ntohl(inet_addr("224.1.1.1"));
//destip = ntohl(inet_addr("127.0.0.1"));
destport = 7000;

sessparams.SetOwnTimestampUnit(1.0/10.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(localport);
transparams.SetMulticastTTL(255);

status = sess.Create(sessparams, &transparams);
checkerror(status);

if(sess.SupportsMulticasting())
{
printf("Current jrtplib support multicasting!\n");
}

RTPIPv4Address addr(destip, destport);
status = sess.AddDestination(addr);
checkerror(status);

set_crmode(1);

while(1)
{
c = getchar();
//status = sess.SendPacket((void *)"A",1 ,0 ,false, 1);
status = sess.SendPacket((void *)&c,1 ,0 ,false, 1);
checkerror(status);
#ifndef RTP_SUPPORT_THREAD
status = sess.Poll();
checkerror(status);
#endif // RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1,0));
}

set_crmode(0);

sess.BYEDestroy(RTPTime(10,0),0,0);

return 0;
}

receiver.cpp
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout < < "ERROR: " < < RTPGetErrorString(rtperr) < < std::endl;
exit(-1);
}
}

int main(void)
{
RTPSession sess;
uint16_t localport;
int status;
uint32_t multicastip;

multicastip = ntohl(inet_addr("224.1.1.1"));
localport = 7000;

RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;

sessparams.SetOwnTimestampUnit(1.0/10.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(localport);

status = sess.Create(sessparams,&transparams);
checkerror(status);

RTPIPv4Address addr(multicastip, 7000);
status = sess.JoinMulticastGroup(addr);
checkerror(status);

//status = sess.AddDestination(addr);
//checkerror(status);

while(1)
{
sess.BeginDataAccess();

if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
uint32_t packetLen;
uint8_t *packetData;
uint8_t j = 11;

while ((pack = sess.GetNextPacket()) != NULL)
{
packetLen = pack->GetPacketLength() - 1;
packetData = pack->GetPacketData();
printf("RECV data: ");
while(j++ < packetLen)
{
printf("%c", *(packetData + j));
}
printf("\n");
sess.DeletePacket(pack);
}
} while (sess.GotoNextSourceWithData());
}

sess.EndDataAccess();

#ifndef RTP_SUPPORT_THREAD
status = sess.Poll();
checkerror(status);
#endif // RTP_SUPPORT_THREAD

RTPTime::Wait(RTPTime(1,0));
}

sess.BYEDestroy(RTPTime(10,0),0,0);

return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP