使用rtp协议,用D类地址“224.1.1.1”,端口号=5040;TTl=255,进行组播,客户端只能接收几分钟,几分钟后接收不到数据包;将服务器和客户端放在同一台机器上,客户端完全可以接收。为什么将客户端和服务器分开,客户端只能接收几分钟?

解决方案 »

  1.   

    To zoutaiqi(水乡船哥) :我发送的时候是Sleep(27);如果缓冲区溢出,那么在同一机器为什么不会出现这种情况。还有你知道发送的视频流数据包每次应该有多大?
      

  2.   

    客户端放到2000下,用网络监视器看一下。把你设置组播的代码贴上来,我是这样做的,没有问题:
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(MULTI_ADD);
    mreq.imr_interface.s_addr = INADDR_ANY;
    if(!m_pSocket->SetSockOpt(IP_ADD_MEMBERSHIP, \
    (char*)&mreq, sizeof(mreq),IPPROTO_IP))
    {
    MessageBox("SetSockOpt MULTICAST is not ok","注意");
    delete m_pSocket;
    m_pSocket = NULL;
    return;
    }
      

  3.   

    可能是发送速度大于网络速度所致。
    服务器全速发送数据,几分钟就可以发完全部数据。
    而客户端用它能分得的网络带宽,在相同时间之内收不完全部数据。
    Sleep(27);只睡了27ms,比Windows的典型时间片20ms大不了多少。
    这么小的延迟造成数据包丢失是很正常的。
    也可能是其他原因。
    人家广播的视频流每一数据包都携带同步信息,这样即使客户端少收了几个包,也能从同步信息里恢复状态。
    如果你的广播仅仅是把光盘里的数据分段播出,这样的话,客户端即便少收了1个包,也会出错。而出错的表现则根据客户端程序的不同而不同,可能是缓冲区溢出死机、非正常退出、停止接受、等待数据包等等等等
      

  4.   

    你用的是UDP协议吧,我用的是RTP协议,具体的函数已经封装好了:服务器端设置:unsigned long IP;
    IP = inet_addr("224.1.1.1");
    if (IP == INADDR_NONE)
    {
        AfxMessageBox("Bad IP address specified");

    }
    m_vilist.portbase=5040;
    m_vilist.destport=5042;
    sess.Create(m_vilist.portbase);
    if(sess.SupportsMulticasting()!=TRUE)
    {
    AfxMessageBox("Cann't supports Multicasting!");
                      return;
    }
    sess.SetMulticastTTL(255);
    sess.AddDestination(destip,m_vilist.destport); 客户端加入组接收。帮助看一下,谢谢!
      

  5.   

    To: icansaymyabc(学习与进步) 非常感谢你的参与,我的服务器是将mpeg1文件分包发送出去,如果我将以前的地址“224.1.1.1”改为“192.168.0.36”(客户机地址)完全可以接收播放到结束。这是怎么回事?
      

  6.   

    把你的组播地址改到234.x.x.x看看怎么样
      

  7.   

    这到底是是什么原因,熟悉RTP组播的高手,请帮助看看。这个问题已经困饶我多天了。我用的是JRTPLIB_2.6.LIB中的函数。
      

  8.   

    有用过JRTPLIB_2.6.LIB的吗?请帮助...
      

  9.   

    是做视频流的吗?问个问题
    http://expert.csdn.net/Expert/topic/1297/1297884.xml?temp=.4454157
      

  10.   

    很有可能是发送速度太快了。另外每个rtp包的大小不要超过1500字节。否则这些包通过一些网络设备的时候,会被拆散为多个包,降低了接收端的效率。
    以前我曾经作过一个东西,用一个100M的网卡的windows向外组播rtp视音频,用一个10M网卡的linux接收rtp。后来发现,如果发送得太快,接收端就掉包。发送的sleep时间放长一些,根据实际的网络情况实验一下吧。可以用sniffer来捕捉,看看到底在哪里掉的包。
      

  11.   

    我已经Sleep(120)还是不行,大概要Sleep多长时间。
      

  12.   

    改sess.SetMulticastTTL(32),在看看客户端有没有JoinMulticastGroup;
      

  13.   

    我看了一下你用的那个RTP开发包,
    int RTPConnection::SetMulticastTTL(unsigned char ttl)
    {
    int status;
    int ttl2;

    if (!socketsopened)
    return ERR_RTP_SOCKETSNOTOPEN;

    ttl2 = (int)ttl;
    status = setsockopt(sendsock,IPPROTO_IP,IP_MULTICAST_TTL,(const char *)&ttl2,sizeof(int));
    if (status != 0)
    return ERR_RTP_CANTSETMULTICASTTTL;

    return 0;
    }是真确的,但还有一个函数
    int RTPConnection::SetMulticastTTL(unsigned char ttl)
    {
    return ERR_RTP_MULTICASTINGNOTSUPPORTED;
    }
    其中他用#ifndef RTP_MULTICAST来判断执行那个函数,在你的工程里加入#ifndef RTP_MULTICAST
    #define RTP_MULTICAST试试看。。
      

  14.   

    To  firebolt2002(霹雳) :
       谢谢你的帮助,你对这个JRTPLIB_2.6.LIB库熟悉吗?很想向你学习。
    email:[email protected]