接收速度大,数据量大的文件的问题
我已经发过好几次贴了都没能解决问题,现在再把归总一下,麻烦知道的人提个方案吧:
服务器一直不停的发送UDP协议的数据,速度有七百多兆bps,且服务器端是不停发送,不可控制的,需要做的就是在客户端接收。我自己的在这边接收并要写成文件。注意传输的速度非常的大。
1.要尽量不丢包的接收下来,采取什么方案比较好?一个recvfrom为1240的长度,之前我先存大概一秒钟的数据到内存,然后停止接收,然后写数据,这样还是会丢包,且只能收到50%不到的数据。
此段代码如下:
for(int i=0;i<=70000;i++)
{
n=recvfrom(client,(char *)recvbuf,sizeof(recvbuf),0,(sockaddr*)&serveraddress,&len);
if(n==SOCKET_ERROR)
{
printf("recvfrom error:%d\n",WSAGetLastError());
printf("接收数据错误!\n");
closesocket(client);
WSACleanup();
break;
}
memcpy((char*)p,(char*)recvbuf,n);
p+=n;
memset(recvbuf,0,sizeof(recvbuf));
}
2.是我的程序有问题还是其他什么?有没有其他什么方案,比如多线程的思想,我没学过线程,如果这个可行的话能不能麻烦具体解说一下。
3.或者有没有其他什么可以处理高清视频的方案,麻烦高人提一下吧。
我菜鸟一个,所以分数都用来处理这个问题了,没什么分数了,但是还希望多多帮忙啊。
[解决办法]
要有缓存
开一个线程接收数据,并把数据放到缓存里
开另一个线程,写数据
如果接收的速度超过了写硬盘的数据(1000M网卡?),则需要考虑其它的模式,如分布式存储
[解决办法]
如果允许数据丢包率控制在一定比例,可以使用UDP,直接写内存,写硬盘的话恐怕是来不及的,但是需要数据处理完之后及时删掉,避免崩溃。
如果不允许数据丢包,那么可能就得使用TCP了,虽然速度不及UDP,但是可靠性增加不少,缺点么就是容易堵塞,客户端需要做一定的处理。
[解决办法]
1.换成固态硬盘当系统盘。。。。
2.使用速度快的内存,加大内存量。(也可理解成,把运行时所涉及到的东西全部放入内存)
3.降低网络带宽?(奇想,可忽视)
丢包率这么高?!这么严重的问题,可以打报告了,不可能的任务。