Linux--UDPsocket传输图片
来源:互联网 发布:多益网络手游新游戏 编辑:程序博客网 时间:2024/06/10 18:20
服务器端
#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; }
客户端
#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_image_server.c
/************linux-udp-image-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 "127.1.1.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);/*UDP 协议*/ 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; }
udp_image_client.c
/*****************linux-udp-image-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); /*UDP 协议*/ 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,"/liefyuan/study/image2/%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; }
0 0
- Linux--UDPsocket传输图片
- Linux--UDPsocket文件传输
- udpSocket
- UDPSocket
- Linux--TCPsocket传输图片
- linux下使用udpsocket时遇到的问题
- 图片传输
- 图片传输
- Linux下用XMODEM实现TR800图片传输
- Linux 图片传输功能c/c++(初版)
- 视频图片传输
- webservice 图片传输 服务端
- webservice 图片传输 客户端
- WCF传输图片解决方案
- Java Socket传输图片
- XML方式传输图片
- Android图片传输
- javaXML方式传输图片
- Source Insight中的多行注释
- 程序的装入和链接
- 实现Runable接口比继承Thread类所具有的优势
- win10 64bit python2.7 Anaconda2安装OpenCV2.4.11
- join、split、strip的学习
- Linux--UDPsocket传输图片
- 对实习医生格蕾的初步探索"
- 使用vs2013 debug xgboost C++码源
- 爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔...
- 一种复杂度的为O(n)的排序方法
- Windows下rm的等效命令
- 缓冲区溢出漏洞(一):认识缓冲区溢出漏洞.
- 算法提高 9-2 文本加密
- 给Java说句公道话---转自王垠http://www.yinwang.org/blog-cn/2016/01/18/java