UDP议定书图像高速传输无损失程序
下面的程序实现UDP没有图像数据的高速传输协议损耗,测试数据egtest01图片库,实现PC和图像的传输嵌入式结束。变速箱+读写速度可以达到10+M/S。考
server端程序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <sys/time.h> #define DEST_PORT 3000
#define MAX_DATA 51200 //50kb
#define DEST_IP_ADDRESS "10.42.0.1" //"192.168.1.113"//"10.42.0.1" //"192.168.1.19"//"169.254.9.36" #ifndef bool
#define bool int
#define true 1
#define false 0
#endif int main(int argc,char* argv[])
{
int sock_fd;
int send_num;
int recv_num;
int dest_len;
char send_buf[100];
char recv_buf[MAX_DATA];
char recv_path[1024];
char recv_over[12]="receive over";
char send_again[18]="send package again";
struct sockaddr_in addr_serv; sock_fd=socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd<0)
{
perror("socket error\n");
exit(1);
}else
{
printf("socket success\n");
} memset(&addr_serv,0,sizeof(struct sockaddr_in));
addr_serv.sin_family=AF_INET;
addr_serv.sin_port=htons(DEST_PORT);
addr_serv.sin_addr.s_addr=inet_addr(DEST_IP_ADDRESS); dest_len=sizeof(struct sockaddr_in); //设置超时时间
struct timeval tv_out;
tv_out.tv_sec=3;
tv_out.tv_usec=0;
setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&tv_out,sizeof(tv_out)); printf("begin send\n"); struct timeval tpstart,tpend;
double timeuse;
gettimeofday(&tpstart,NULL); int index=0;
for(index=0;index<1821;index++)
{
sprintf(send_buf,"frame%0.5d.bmp",index);
send_num=sendto(sock_fd,send_buf,14,0,(struct sockaddr*)&addr_serv,dest_len);
if(send_num<0)
{
perror("send error\n");
exit(1);
}else
{
printf("request for %s success\n",send_buf);
} //printf("begin receive\n");
sprintf(recv_path,"/opt/imagedata/egtest01_bmp/%s",send_buf);
FILE *fd=fopen(recv_path,"wb+"); int onums=0;
while(fd==NULL)
{
onums++;
perror("open fail");
printf("try to open %s for receiving %d\n",recv_path,onums);
fd=fopen(recv_path,"wb+"); //exit(1);
} long int position=0;
unsigned long saposition=0;
int recv9=0;
while(1)
{
memset(recv_buf,0,sizeof(recv_buf));
recv_num=recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&addr_serv,&dest_len);//MSG_DONTWAIT //printf("recv_num: %d\n",recv_num);
if(recv_num<0)
{
//perror("receive error");
fseek(fd,saposition,SEEK_SET);
position=saposition;
send_num=sendto(sock_fd,send_again,18,0,(struct sockaddr*)&addr_serv,dest_len);
continue;
}
else if(recv_num==9&&(position==921654||recv9>=3))
{
fclose(fd);
break;//接收一个文件结束
}
else if(recv_num==51200||recv_num==54)
{
//printf("position is in %ld\n",position);
fseek(fd,position,SEEK_SET);
fwrite(recv_buf,1,recv_num,fd); saposition=position;
position+=recv_num;
send_num=sendto(sock_fd,recv_over,12,0,(struct sockaddr*)&addr_serv,dest_len);
}
else
{
//printf("recv_num error: %d\n",recv_num);
recv9++;
fseek(fd,saposition,SEEK_SET);
position=saposition;
continue;
//exit(-1);
}
} }
close(sock_fd); gettimeofday(&tpend,NULL);
timeuse=1000*(tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_usec-tpstart.tv_usec)/1000; printf("processor time is %lf ms\n",timeuse);
return 0; }
client程序
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define SERV_PORT 3000
#define MAX_DATA 51200 //50kb
#define FILE_LENGTH 921654 //图片大小 #ifndef bool
#define bool int
#define true 1
#define false 0
#endif int main(int argc,char* argv[])
{
int sock_fd;
int recv_num;
int send_num;
int client_len;
char recv_buf[20];
char send_buf[MAX_DATA];
char send_path[1024];
char send_over[9]="send over";
struct sockaddr_in addr_serv;
struct sockaddr_in addr_client;
FILE *fd=NULL; sock_fd=socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd<0)
{
perror("socket error\n");
exit(1);
}else
{
printf("socket success\n");
} memset(&addr_serv,0,sizeof(struct sockaddr_in));
addr_serv.sin_family=AF_INET;
addr_serv.sin_port=htons(SERV_PORT);
addr_serv.sin_addr.s_addr=htonl(INADDR_ANY);//随意本地址 client_len=sizeof(struct sockaddr_in); if(bind(sock_fd,(struct sockaddr*)&addr_serv,sizeof(struct sockaddr_in))<0)
{
perror("bind error\n");
exit(1);
}else
{
printf("bind success\n");
} //设置超时时间
struct timeval tv_out;
tv_out.tv_sec=3;
tv_out.tv_usec=0;
setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&tv_out,sizeof(tv_out)); bool recv_ask_flag=true;
bool send_over_flag=false;
bool send_again_flag=false; while(1)
{
//printf("begin receive\n");
unsigned long saposition; memset(recv_buf,0,sizeof(recv_buf));
recv_num=recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&addr_client,&client_len); //printf("recv_num: %d, recv_buf: %s\n",recv_num,recv_buf);
if(recv_num<0)
{
perror("receive error");
continue;
}else if(recv_num==12)
{
recv_ask_flag=true;
}else if(recv_num==18)
{
recv_ask_flag=true;
send_again_flag=true;
if(fd==NULL)//文件最后一个包出错须要重发的情况
{
fd=fopen(send_path,"rb");
fseek(fd,saposition,SEEK_SET);
}
}
else
{
if(fd!=NULL)
fclose(fd);
printf("receive request success : %s\n",recv_buf);
sprintf(send_path,"/opt/imagedata/egtest01_bmp/%s",recv_buf);
fd=fopen(send_path,"rb");
if(fd==NULL)
{
printf("fail to open %s for sending\n",send_path);
exit(1);
}
recv_ask_flag=true;
send_over_flag=false;
} //printf("begin send\n");
long int position=0;
while(recv_ask_flag&&fd!=NULL)
{
position=ftell(fd); if(fread(send_buf,1,MAX_DATA,fd)==0)
{
//perror("read file");
recv_ask_flag=false;
send_again_flag=false;
send_over_flag=true;
break;
} //printf("position is in %ld\n",position); long int send_size=(position+MAX_DATA)>FILE_LENGTH?(FILE_LENGTH-position):MAX_DATA;
send_num=sendto(sock_fd,send_buf,send_size,0,(struct sockaddr*)&addr_client,client_len);
//printf("send_num: %d\n",send_num); if(send_num<0||send_again_flag==true)
{
//perror("send error");
fseek(fd,saposition,SEEK_SET);
send_again_flag=false;
continue;
} saposition=position; recv_ask_flag=false;
send_again_flag=false; } if(send_over_flag&&position==921654&&fd!=NULL)
{
send_num=sendto(sock_fd,send_over,9,0,(struct sockaddr*)&addr_client,client_len); if(fd!=NULL)
{
fclose(fd);
fd=NULL;
}
} } close(sock_fd);
return 0; }
版权声明:本文博主原创文章,博客,未经同意不得转载。
UDP议定书图像高速传输无损失程序的更多相关文章
- tsunami:一种基于UDP协议的高速传输
一. 需求 近期在做数据库迁移.常常须要打包实例传输.传统scp感觉非常慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源代码make ...
- udp如何实现可靠性传输?
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1udp与tcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的 ...
- 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...
- [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结
TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...
- 分享CCNTFS小工具,在 macOS 中完全读写、修改、访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,简单设置即可高速传输外接NTFS硬盘文件
CCNTFS [ 下载 ] 在 macOS 中完全读写.修改.访问Windows NTFS硬盘的文件,无须额外的驱动(原生驱动)更稳定,安装后进行简单设置即可高速传输外接NTFS硬盘文件,可全程离线使 ...
- UDP如何实现可靠传输
概述 UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响. 传输层无法保证数据的可靠传输 ...
- 五、Socket之UDP异步传输文件-实现传输中取消传送
上一篇文章四.Socket之UDP异步传输文件中,只实现了传输开始前拒绝接收文件,没有实现文件传输进行的时候取消传送,这篇文章中我们就来介绍怎样实现这个功能. 在传输过程中取消文件的传送,有很多地方要 ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
- DICOM医学图像处理:WEB PACS初谈二,图像的传输
背景: 如前一篇专栏博文所述,借助于CGI或FastCGI技术转发浏览器发送过来的用户请求,启动本地的DCMTK和CxImage库响应.然后将处理结果转换成常规图像返回到浏览器来实现Web PACS. ...
随机推荐
- POJ 3974 最长回文字串(manacher算法)
题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...
- TComponent明明实现了IDispatch接口,但是却不加上声明,难道是因为FVCLComObject实体对象不存在?
TComponent明明实现了IDispatch接口,可是它的声明却是: TComponent = class(TPersistent, IInterface, IInterfaceComponent ...
- 百度地图之UI控制
在本文中主要介绍百度地图UI控制功能,即控制地图是否有缩放.平移.双击放大.旋转.俯视的功能以及控制是否显示内置缩放组件.指南针位置等.在文中采用标签监听使每个控制功能的方法见名知义,代码原型来源百度 ...
- GC日志分析
JVM的GC日志的主要參数包含例如以下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的具体日志 -XX:+PrintGCTimeStamps 输出GC ...
- Flume传输数据事务分析
Flume传输数据事务分析 本文基于ThriftSource,MemoryChannel,HdfsSink三个组件,对Flume传输数据的事务进行分析.假设使用的是其它组件.Flume事务详细的处理方 ...
- fastdfs storage server的设计与实现
fastdfs是一个针对互联网应用设计的分布式文件系统.具有架构简单.结构清晰.代码量小等特点. 详细的介绍及架构请參考分布式文件系统FastDFS架构剖析(http://www.program ...
- 开源 免费 java CMS - FreeCMS1.9 会员组管理
项目地址:http://www.freeteam.cn/ 会员组管理 会员组分为两种,一级是经验会员组,一种是特殊会员组. 经验会员组的会员会依据经验自己主动变更,特殊会员组不会自己主动变更,须要管理 ...
- PSU 离11.2.0.3.0 -> 11.2.0.3.11 如果解决冲突的整个
Oracle rdbms 扑灭psu离11.2.0.3.0升级到11.2.0.3.11 参考patch :18522512 停止应用,停止听音乐并DB,将db的oracle_home在下面OPatch ...
- 查看mysql当前表使用的存储引擎(转)
说明:当我们创建表 “test”表时 CREATE TABLE test ( id INT(11) default NULL auto_increment, s char(60) default NU ...
- HttpClient 4.3教程(转载)
HttpClient 4.3教程(转载) 转自:http://www.yeetrack.com/?p=779 前言 Http协议应该是互联网中最重要的协议.持续增长的web服务.可联网的家用电器等都在 ...