组播时,出现的奇怪现象, 使用rtp协议,用D类地址“224.1.1.1”,端口号=5040;TTl=255,进行组播,客户端只能接收几分钟,几分钟后接收不到数据包;将服务器和客户端放在同一台机器上,客户端完全可以接收。为什么将客户端和服务器分开,客户端只能接收几分钟? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 To zoutaiqi(水乡船哥) :我发送的时候是Sleep(27);如果缓冲区溢出,那么在同一机器为什么不会出现这种情况。还有你知道发送的视频流数据包每次应该有多大? 客户端放到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; } 可能是发送速度大于网络速度所致。服务器全速发送数据,几分钟就可以发完全部数据。而客户端用它能分得的网络带宽,在相同时间之内收不完全部数据。Sleep(27);只睡了27ms,比Windows的典型时间片20ms大不了多少。这么小的延迟造成数据包丢失是很正常的。也可能是其他原因。人家广播的视频流每一数据包都携带同步信息,这样即使客户端少收了几个包,也能从同步信息里恢复状态。如果你的广播仅仅是把光盘里的数据分段播出,这样的话,客户端即便少收了1个包,也会出错。而出错的表现则根据客户端程序的不同而不同,可能是缓冲区溢出死机、非正常退出、停止接受、等待数据包等等等等 你用的是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); 客户端加入组接收。帮助看一下,谢谢! To: icansaymyabc(学习与进步) 非常感谢你的参与,我的服务器是将mpeg1文件分包发送出去,如果我将以前的地址“224.1.1.1”改为“192.168.0.36”(客户机地址)完全可以接收播放到结束。这是怎么回事? 把你的组播地址改到234.x.x.x看看怎么样 这到底是是什么原因,熟悉RTP组播的高手,请帮助看看。这个问题已经困饶我多天了。我用的是JRTPLIB_2.6.LIB中的函数。 有用过JRTPLIB_2.6.LIB的吗?请帮助... 是做视频流的吗?问个问题http://expert.csdn.net/Expert/topic/1297/1297884.xml?temp=.4454157 很有可能是发送速度太快了。另外每个rtp包的大小不要超过1500字节。否则这些包通过一些网络设备的时候,会被拆散为多个包,降低了接收端的效率。以前我曾经作过一个东西,用一个100M的网卡的windows向外组播rtp视音频,用一个10M网卡的linux接收rtp。后来发现,如果发送得太快,接收端就掉包。发送的sleep时间放长一些,根据实际的网络情况实验一下吧。可以用sniffer来捕捉,看看到底在哪里掉的包。 我已经Sleep(120)还是不行,大概要Sleep多长时间。 改sess.SetMulticastTTL(32),在看看客户端有没有JoinMulticastGroup; 我看了一下你用的那个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试试看。。 To firebolt2002(霹雳) : 谢谢你的帮助,你对这个JRTPLIB_2.6.LIB库熟悉吗?很想向你学习。email:[email protected] VS2010编译ACE5.5库出现错误???? 如何改变编辑框的字体颜色 有找工作的会vc++的朋友吗? ActiveX事件很不好回答的问题,莫非个中高手,可能没有人回得对 图像格式转换算法 在textBox中如何把数据以16进制显示? 求助:关于p2p在线语音聊天服务器端编程 webbrowser 读取缓存的问题 我的VS.net安装有问题,应该有人碰到过吧 多显示器Clone Mode与Extend Mode切换问题 有这种控件吗? 这个最简单不过的,我怎么就是不会呀.
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;
}
服务器全速发送数据,几分钟就可以发完全部数据。
而客户端用它能分得的网络带宽,在相同时间之内收不完全部数据。
Sleep(27);只睡了27ms,比Windows的典型时间片20ms大不了多少。
这么小的延迟造成数据包丢失是很正常的。
也可能是其他原因。
人家广播的视频流每一数据包都携带同步信息,这样即使客户端少收了几个包,也能从同步信息里恢复状态。
如果你的广播仅仅是把光盘里的数据分段播出,这样的话,客户端即便少收了1个包,也会出错。而出错的表现则根据客户端程序的不同而不同,可能是缓冲区溢出死机、非正常退出、停止接受、等待数据包等等等等
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); 客户端加入组接收。帮助看一下,谢谢!
http://expert.csdn.net/Expert/topic/1297/1297884.xml?temp=.4454157
以前我曾经作过一个东西,用一个100M的网卡的windows向外组播rtp视音频,用一个10M网卡的linux接收rtp。后来发现,如果发送得太快,接收端就掉包。发送的sleep时间放长一些,根据实际的网络情况实验一下吧。可以用sniffer来捕捉,看看到底在哪里掉的包。
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试试看。。
谢谢你的帮助,你对这个JRTPLIB_2.6.LIB库熟悉吗?很想向你学习。
email:[email protected]