arm_linux与windows 利用RTP协议进行多播通信

作为多播数据的发送端,arm_linux端加入多播组不是必须的,可以加入,也可以不加入。

arm_linux端数据发送程序:(只给出功能函数)

void multicast_thread()
{
 RTPSession sess;
 int portbase = 6000;
 int status;
 //int length;
 int loop;
 bool iscast;
 unsigned long destip;
 unsigned long localip;
 char *buff = "multicasting test";
 int length = strlen(buff);
 destip = inet_addr("233.0.0.1");
 localip = inet_addr("172.29.26.101");
 if(destip == INADDR_NONE || localip == INADDR_NONE)
 {
  printf("Bad IP address specfied/n");
  return;
 }
 destip = ntohl(destip);
 localip = ntohl(localip);
 status = sess.Create(portbase,localip);
 checkerror(status);
 iscast = sess.SupportsMulticasting();
 if(!iscast)
 {
  sess.Destroy();
  printf("the rtp library was not complied with multicasting support/n");
  return;
 }
 /*************************************************************
 * as a sender to a multicastgroup, it doesn't have to add to * 
 * the group.both can send the data successfully.       *
 **************************************************************/
 //sess.JoinMulticastGroup(destip);
 status = sess.AddDestination(destip,portbase);
 checkerror(status);
 for(loop=0;loop<1000;loop++)
 {
  status = sess.SendPacket(buff,length,1,false,25);
  printf("send packet: %d/n",loop+1);
  sleep(1);
 }
 sess.ClearDestinations();
 //sess.LeaveMulticastGroup(destip);
 sess.Destroy();
 return;
}

windows端接收数据程序,需要加入多播组:

UINT Multicast_Thread(LPVOID)
{
 CAdminToolDlg *dlg=(CAdminToolDlg*)AfxGetApp()->GetMainWnd();
 RTPSession sess;
 int portbase,status,length;
 unsigned long destip;
 unsigned char *RawData;
 bool iscast;
 //CString str;
 portbase = 6000;
 destip  = inet_addr(MULTICAST);
 if(destip == INADDR_NONE)
 {
  AfxMessageBox("多播地址无效");
  return -1;
 }
 destip  = ntohl(destip);
 status  = sess.Create(portbase);
 dlg->checkerror(status);
 iscast = sess.SupportsMulticasting();
 if(!iscast)
 {
  sess.Destroy();
  AfxMessageBox("不支持多播");
  return -1;
 }
 if(sess.JoinMulticastGroup(destip) < 0)
 {
  AfxMessageBox("加入多播组失败");
  return -1;
 }
 //sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
 //sess.AddToAcceptList(destip,1,portbase);
 dlg->recvBytes = 0;
 dlg->count     = 0;
 while(1)
 {
  sess.PollData();
  if(sess.GotoFirstSourceWithData())
  {
   //AfxMessageBox("收到数据");
   RTPPacket *pack;
   while((pack = sess.GetNextPacket()) != NULL)
   { 
    length = pack->GetPayloadLength();
    RawData = pack->GetPayload();
    for(int i=0;i<length;i++)
    {
     dlg->data[dlg->recvBytes]  = RawData[i];
     dlg->recvBytes++;
    }
    dlg->count++;
   }
  }
  if(dlg->exitFlag == 1 || purview == 0)
  {
   dlg->m_brtprunning = FALSE;
   sess.Destroy();
   ExitThread(-1);
   
  }
 }
 sess.LeaveMulticastGroup(destip);
 sess.Destroy();
 AfxMessageBox("会话结束 /n");
 dlg->m_brtprunning = FALSE;
 return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值