多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > UDP協議來快速無丟失傳輸圖像程序

UDP協議來快速無丟失傳輸圖像程序

來源:程序員人生   發布時間:2014-09-14 21:18:41 閱讀次數:2841次

以下程序實現了UDP協議下無丟失快速的傳輸圖像數據,測試數據是egtest01圖像庫,實現了PC和嵌入式端的圖像傳輸,傳輸+讀寫的速度可以實現10+M/S,貼上代碼可作為參考



服務器端程序

<span style="font-family:SimSun;font-size:18px;">#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 "); exit(1); }else { printf("socket success "); } 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 "); exit(1); }else { printf("bind success "); } //設置超時時間 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 "); 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_num); printf("recv_buf: %s ",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; } else { if(fd!=NULL) fclose(fd); printf("receive request success : %s ",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 ",send_path); exit(1); } recv_ask_flag=true; send_over_flag=false; } //printf("begin send "); long int position=0; send_over_flag=false; while(recv_ask_flag&&fd!=NULL) { position=ftell(fd); if(fread(send_buf,1,MAX_DATA,fd)==0) { perror("read file"); fclose(fd); fd=NULL; recv_ask_flag=false; send_again_flag=false; send_over_flag=true; break; } printf("position is in %ld ",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 ",send_num); if(send_num<0||send_again_flag==true) { perror("send error"); fseek(fd,position,SEEK_SET); send_again_flag=false; continue; } recv_ask_flag=false; send_again_flag=false; } if(send_over_flag) { send_num=sendto(sock_fd,send_over,9,0,(struct sockaddr*)&addr_client,client_len); send_over_flag=false; } } close(sock_fd); return 0; } </span>



客戶端程序

<span style="font-family:SimSun;font-size:18px;">#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.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 "); exit(1); }else { printf("socket success "); } 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 "); struct timeval tpstart,tpend; double timeuse; gettimeofday(&tpstart,NULL); int index=0; for(index=0;index<1821;index++)//821 { 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 "); exit(1); }else { printf("request for %s success ",send_buf); } printf("begin receive "); sprintf(recv_path,"/opt/imagedata/egtest01_bmp/%s",send_buf); FILE *fd=fopen(recv_path,"wb"); if(fd==NULL) { printf("fail to open %s for receiving",recv_path); exit(1); } /* int onums=0; while(fd==NULL) { onums++; printf("try to open %s for receiving %d ",recv_path,onums); fd=fopen(recv_path,"wb"); //exit(1); } */ long int position=0; bool recv_error_flag=false; 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 ",recv_num); if(recv_num<0) { perror("receive error"); //recv_error_flag=true; //break; send_num=sendto(sock_fd,send_again,18,0,(struct sockaddr*)&addr_serv,dest_len); continue; } else if(recv_num==9) { break;//接收一個文件結束 } else { printf("position is in %ld ",position); fseek(fd,position,SEEK_SET); fwrite(recv_buf,1,recv_num,fd); position+=recv_num; send_num=sendto(sock_fd,recv_over,12,0,(struct sockaddr*)&addr_serv,dest_len); } } if(recv_error_flag) { printf("receive error occur in %s ",recv_path); exit(1); } else { //printf("have writen the received data to %s ",recv_path); } } close(sock_fd); gettimeofday(&tpend,NULL); timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000;//ms printf("processor time is %lf ms ",timeuse); return 0; }</span>



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人精品日本亚洲专一区 | 亚洲精品免费视频 | 成人亚洲在线 | 今天免费中文字幕视频 | 精品一区二区三区高清免费观看 | 噜噜嘿在线视频免费观看 | 午夜激情啪啪 | 国产一区二区福利久久 | 国内精品伊人久久大香线焦 | 国产精品久久久久国产精品三级 | 激情免费视频 | xxxx 欧美| l欧美18一19sex性 | 国内精品久久国产 | 亚洲人成高清 | 亚洲成人一区二区 | 欧美一区二区三区国产精品 | 国产成+人+综合+亚洲不卡 | 抖音毛片 | 在线观看三级视频 | 国产成人在线视频观看 | 欧美日韩第一页 | 国产九色 | 好吊妞在线成人免费 | 亚洲精品国产精品国自产观看 | 2022国产成人精彩在线视频 | 国产成人在线播放视频 | 欧美亚洲一区二区三区 | 福利一区二区三区视频午夜观看 | 91色网站| 日韩精品亚洲人成在线播放 | 亚洲欧洲精品成人久久曰 | 成人做爰免费视频免费看 | 一本大道卡一卡二卡三视频 | 亚洲精品第一页中文字幕 | 欧洲乱码专区一区二区三区四区 | 国产xxxxfreexxxxxvideo | 欧美一区二区在线视频 | 中国日本高清免费视频网 | 国产在线视频国产永久视频 | 老司机午夜精品视频在线观看免费 |