当前位置: 技术问答>linux和unix
udp接收并存储怎么做?速度大约能到多少?疯了,求助!!
来源: 互联网 发布时间:2016-07-15
本文导语: 我用UDP接受其他机器发送过来的数据,包大小是1024,并且存储到硬盘。 为什么速度到30Mb左右也会丢包?这也太慢了吧? 发送数据后用netstat查看 发现里面的:udp包接收错误,还有最后的 接收缓冲错误 的数值都很...
我用UDP接受其他机器发送过来的数据,包大小是1024,并且存储到硬盘。
为什么速度到30Mb左右也会丢包?这也太慢了吧?
发送数据后用netstat查看
发现里面的:udp包接收错误,还有最后的 接收缓冲错误 的数值都很大。
数据主要丢在这两个值上了,请问这大约是什么原因造成的?怎么改善?
而接受缓冲区也没有溢出(netstat显示)。
程序运行在酷睿1.6的笔记本上,100M网卡,双机直连,使用FTP,飞鸽等软件一切正常。
下面是我的代码,是不是有什么问题?
为什么速度到30Mb左右也会丢包?这也太慢了吧?
发送数据后用netstat查看
发现里面的:udp包接收错误,还有最后的 接收缓冲错误 的数值都很大。
数据主要丢在这两个值上了,请问这大约是什么原因造成的?怎么改善?
而接受缓冲区也没有溢出(netstat显示)。
程序运行在酷睿1.6的笔记本上,100M网卡,双机直连,使用FTP,飞鸽等软件一切正常。
下面是我的代码,是不是有什么问题?
#include
#include
#include
#include
#include
int main(void)
{
int n, fd;
socklen_t cli_addr_len;
char buf[1024] = {0};
unsigned long int npak=0;
struct sockaddr_in servaddr, cliaddr;
FILE *fp;
int KZ=0;
int sendbufsize,recvbufsize;
int size=4;
printf("n%20 printf or 1 printf or no printf(2/1/0)?");//多少个包打印一次
scanf("%d", &KZ);
printf("stat:n");
if((fp=fopen("udp.dat", "wb")) == NULL)
{
printf("error - open file.");
return 0;
}
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
printf("socket error!n");
exit(0);
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8000);
bind(fd, (struct sockaddr *)&servaddr, sizeof(servaddr));
//设置系统缓冲区大小
size = sizeof(int);
recvbufsize = 0;
if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&recvbufsize, &size) == 0)
printf("recvbufsize = %dn", recvbufsize);
recvbufsize = 128*1024;
if(setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&recvbufsize, sizeof(int)) == 0 )
printf("recvbufsize = %dn", recvbufsize);
if(getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&recvbufsize, &size) == 0)
printf("recvbufsize = %dn", recvbufsize);
while(1)
{
cli_addr_len = sizeof(cliaddr);
n =recvfrom(fd, buf, 1024, 0, (struct sockaddr *)&cliaddr, &cli_addr_len);//接收数据
npak++;
if((KZ==2) && !(npak%20))
printf("%dn", npak);
else if(KZ == 1)
printf("%dn", npak);
fwrite(buf, 1024, 1, fp);//写硬盘,每一个包一写
}
fclose(fp);
return 0;
}
|
同意楼上的观点,你每个包就写一次(这是关键),所以很慢。你先把数据存到一个大的缓冲区,积累到一定的量再用另一个线程写入到文件(并行起来可能快点)。
另外你把缓冲区加得很大,肯定会有帮助的。我也遇过类似问题。才128k,而你每秒就是30MB!!