免费注册 查看新帖 |

Chinaunix

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

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

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

现在在初步在一台机器上做测试,用两个进程,一个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;
}

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
发表于 2009-03-17 22:46 |显示全部楼层
1、建议2台机器做实际环境模拟测试(要求同一网段)。
2、抓包。
3、JRTP 俺不懂,自己慢慢研究吧。

论坛徽章:
0
发表于 2009-03-18 08:22 |显示全部楼层
原帖由 ssffzz1 于 2009-3-17 22:46 发表
1、建议2台机器做实际环境模拟测试(要求同一网段)。
2、抓包。
3、JRTP 俺不懂,自己慢慢研究吧。


谢谢ssffzz1  (午夜)
两台机器(A发B收)做过以下测试:
1. A机器直接往B机器的IP地址(非组播地址)发,B可以正常收到;
2. B先加入一个组(224.1.1.1),其后A往组播地址(224.1.1.1)发时B不能收到任何东西。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
发表于 2009-03-18 08:36 |显示全部楼层
这样说你就着重检查收端的问题喽。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
发表于 2018-12-17 18:25 |显示全部楼层
兄弟,我是试出来的。客户端也需要添加destination,这个addr必须和组播的IP以及端口号一致
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP