当前位置:  技术问答>linux和unix

udp接收并存储怎么做?速度大约能到多少?疯了,求助!!

    来源: 互联网  发布时间:2016-07-15

    本文导语:  我用UDP接受其他机器发送过来的数据,包大小是1024,并且存储到硬盘。 为什么速度到30Mb左右也会丢包?这也太慢了吧? 发送数据后用netstat查看 发现里面的:udp包接收错误,还有最后的 接收缓冲错误 的数值都很...

我用UDP接受其他机器发送过来的数据,包大小是1024,并且存储到硬盘。
为什么速度到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!!

    
 
 

您可能感兴趣的文章:

  • Qt:UDP:如何划分接收到的UDP包的界限
  • 请问如何清除UDP接收缓存?????????????
  • 求助:UDP编程,无法接收广播数据包
  • 能否设置在UDP接收组播时,就拒绝接受单播数据
  • UDP协议在实现时有没有在发送端或者接收端设置缓冲区?
  • 50求教一个菜鸟级别的UDP套接字问题,关于UDP server端只能接收一次数据的问题?在线等,一直等............
  • 飞秋聊天程序UDP接收问题
  • 利用UDP时客户端为何接收到不到服务器发来的消息????
  • linux 如何接收网内UDP的广播包
  • LINUX tcpdump工具接收udp端口的包
  • udp接收不到数据问题 急!!
  • 求助,udp文件传输发送端发送完了,接收端却接受到一半就bad address?
  • UDP怎么检测对方socket已关闭无法接收数据?
  • 想找一个从终端设备以串口接收数据然后在ARM(linux内核)板上做一个透明转发以UDP型式发送到一台PC机上程序的人员。有意详读下文!
  • udp服务器不能接收到数据包??急!!!
  • udp视频录像文件存储服务器设计问题探讨!高手请赐教!
  • udp视频录像文件存储服务器设计问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • udp包大于1500字节网络传输会分包吗?udp tcp多大的包比较合适?
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • tcp和udp套接字有何不同?在什么情况下用tcp什么情况下用udp????
  • udp方式抓取网页
  • python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
  • udp socket客户端和udp服务端程序示例分享
  • TCP与UDP通信问题!
  • 请问下怎么关闭SUSE 9.1下UDP的checksum?
  • 如何判断udp端口可达
  • 关于epoll&udp的问题?
  • UDP包怎么生成啊?用什么函数??简单问题,帮个忙哈
  • 对于socket UDP传输,一个端口只能被一个进程绑定?
  • IP,UDP,TCP的校验和计算
  • 基于UDP的数据传输 UDT
  • 服务进程收到的第一个UDP包的远端地址不对?
  • udp问题
  • 关于udp sendto时候端口选定问题
  • jme 0000:07:00.5:eht0:udp checksum error
  • udp的暂时连接
  • udp连接问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3