- 论坛徽章:
- 0
|
我想基于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;
} |
|