Qt调用jrtplib实现单播、多播和广播1.单播
单播是一种“一对一”模式,在单播通信方式下,当一端发送数据报到一个指定的主机时,首先可能会引发ARP把目的IP地址映射为MAC地址,然而ARP就是基于广播模式的实现。当以太网帧到达一个主机时,以太网接口便会把自己的MAC地址与帧中的MAC地址相比较,如果相符,以太网接口便会接收该帧,并按协议栈向上递交,如果不想符,该帧将会忽略该帧。其他的以太网接口做同样的操作,最后接收该帧的只有一个主机。在此之后,然后以太网帧向上递交到IP层目的主机会核对IP分组中的目的IP与本机IP(多宿主机),符合,根据协议类型向上递交到传输层相应的协议处理这即时单播通信的过程。典型的TCP 通信就是单播模式的。
单播在网络中得到了广泛的应用,网络上绝大部分的数据都是以单播的形式传输的,只是一般网络用户不知道而已。例如,你在收发、浏览网页时,必须与邮件服务器、Web 服务器建立连接,此时使用的就是单播数据传输方式。但是通常使用“点对点通信”(Point to Point)代替“单播”,因为“单播”一般与“多播”和“广播”相对应使用。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
#include "crtpthread.h"
#include <QDebug>
CRtpThread::CRtpThread():
m_runFlag(true)
{
#ifdef RECEIVER
uint8_t destIP[]={192,168,1,168};
#else
uint8_t destIP[]={192,168,1,183};
#endif
initialRTP(destIP);
}
CRtpThread::~CRtpThread()
{
m_session.BYEDestroy(RTPTime(10,0),0,0);
m_runFlag=false;
#ifdef WIN32
WSACleanup();
#endif // WIN32
}
void CRtpThread::run()
{
while(m_runFlag)
{
usleep(1);
m_session.BeginDataAccess();
if (m_session.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = m_session.GetNextPacket()) != NULL)
{
int recvSize = pack->GetPayloadLength();
uint8_t * recvData=pack->GetPayloadData();
dispatch(recvData, recvSize);
m_session.DeletePacket(pack);
}
} while (m_session.GotoNextSourceWithData());
}
m_session.EndDataAccess();
#ifndef RTP_SUPPORT_THREAD
int status = m_session.Poll();
if (status < 0)
{
qDebug()<< RTPGetErrorString(status).c_str();
}
#endif
}
}
void CRtpThread::dispatch(uchar *dataBuf, int dataLen)
{
emit signalRtpData(dataBuf,dataLen);
#ifdef RECEIVER
/
/将收到的数据转发
rtpSendData(dataBuf, dataLen);
#endif
}
void::CRtpThread::initialRTP(uint8_t *ip)
{
#ifdef WIN32
WSADA TA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
//每秒发送10个样本
m_sessionparams.SetOwnTimestampUnit(1.0/10.0);
//设置本地端口
m_transparams.SetPortbase(27000);
int status = m_session.Create(m_sessionparams,&m_transparams);
if (status < 0)
{
qDebug()<< RTPGetErrorString(status).c_str();
}
//设置目的IP和端口
RTPIPv4Address addr(ip,27000);
status = m_session.AddDestination(addr);
if (status < 0)
{
qDebug()<< RTPGetErrorString(status).c_str();
}
//这里设置了默认值,发送的时候只用指定数据和长度SendPacket((void *)dataBuf,dataLen)。
//否则发送时需指定后三个参数,例如SendPacket((void *)dataBuf,dataLen,0,false,10)。
m_session.SetDefaultPayloadType(0);
m_session.SetDefaultMark(false);
m_session.SetDefaultTimestampIncrement(10.0);
m_session.SetMaximumPacketSize(65535);
}
void CRtpThread::rtpSendData(uchar *dataBuf, int dataLen)
{
int status = m_session.SendPacket((void *)dataBuf,dataLen);
if (status < 0)
{
qDebug() << RTPGetErrorString(status).c_str();
}
}
通过注释或放开.pro中的DEFINES +=RECEIVER来控制是发送端还是接收端,接收端会把收到的数据\n转发给发送端。因为是单播,所以在构造函数中需要指定两个IP地址,然后调用initialRTP函数进行RTP的初始化。
发送端和接收端分别如下图所示:
2.多播
多播是一种“一对一组”的模式,也就时加入同一个组的主机才会接收到数据,他综合了单播和广播的优点,可以只对特定的主机进行通信,其他的主机通信不受影响。多播通常被指IP多播,IP多播是一种通过使用一个多播地址将数据在同一时间以高效的方式发往处于TCP/IP网络上的多个接收者的协议。但是对于IP多播,扩容不容易。
“多播”也可以称为“组播”,在网络技术的应用并不是很多,网上视频会议、网上视频点播特别适合采用多播方式。因为如果采用单播方式,逐个节点传输,有多少个目标节点,就会有多少次传送过程,这种方式显然效率极低,是不可取的;如果采用不区分目标、全部发送的广播方式,虽然一次可以传送完数据,但是显然达不到区分特定数据接收对象的目的。采用多播方式,既可以实现一次传送所有目标节点的数据,也可以达到只对特定对象传送数据的目的。IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。Windows 2000中的DHCP管理器支持多播IP 地址的自动分配。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
#include "crtpthread.h"
#include <QDebug>
CRtpThread::CRtpThread():
m_runFlag(true)
{
uint8_t destIP[]={224,212,118,99};
initialRTP(destIP);
}
CRtpThread::~CRtpThread()
{
m_session.BYEDestroy(RTPTime(10,0),0,0);
m_runFlag=false;
#ifdef WIN32
WSACleanup();
#endif // WIN32
}
void CRtpThread::run()
qt进程间通信{
while(m_runFlag)
{
usleep(1);
m_session.BeginDataAccess();
if (m_session.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = m_session.GetNextPacket()) != NULL)
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论