Linux 图片传输功能c/c++(初版)
由于深度學(xué)習(xí)任務(wù)的需要,要在程序里面嵌入一個(gè)module。
這個(gè)module 的功能是接收來自ios客戶端的圖片。并且傳送給深度學(xué)習(xí)分類器進(jìn)行處理。
于是看了看各種各樣的 module 實(shí)現(xiàn)方案。
先是用IO函數(shù)把圖片以數(shù)組的方式存起來。
再和服務(wù)器建立連接,socket傳這個(gè)數(shù)組。
然后服務(wù)器接收完數(shù)組以后就再運(yùn)用IO函數(shù) 把數(shù)組以圖片的方式存起來!
然后用各種網(wǎng)絡(luò)編程和操作系統(tǒng)的技巧,多線程接收多線程發(fā)送來改善速度。
?
現(xiàn)在先講述一種最原始的 圖片傳輸?shù)膍odule
??這是服務(wù)端進(jìn)程運(yùn)行
它將接收fish-bike.jpg 并且將之存到/root/photo_out這目錄下!
這是客戶端進(jìn)程運(yùn)行
它將發(fā)送/root/photo_in/fish-bike.jpg 給服務(wù)進(jìn)程。同時(shí)在本地/root/photo_in/復(fù)制一個(gè)fish-bike.jpg(這是本地測(cè)試的demo)
?傳送成功!但是慢!
以下是客戶端代碼
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #define SERVER_IP "127.0.0.1" #define PORT 6675int main() {int socket_fd;socket_fd=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in server_addr;//initialize sockfd memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);//6675server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);//127.0.0.1 local?memset(&(server_addr.sin_zero),0,8);//clean server addr int res =connect(socket_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));//connect server_addr printf("connect res is %d\n",res); /*while(1){printf("send send ---->\n");char input[100];char output[100]; memset(input,0,sizeof(input));gets(input);res=write(socket_fd,input,strlen(input));printf("the write resoult is %d\n",res);res=read(socket_fd,output,100);output[res]=0;printf("server says:'%s'\n",output);sleep(1);}*/char path[100];printf("please give the path of photo!\n");char input[100];gets(input);sprintf(path,"/root/photo_in/%s",input);printf("begin to write");write(socket_fd,input,strlen(input));printf("write %s success",input);FILE *out=fopen(path,"r");printf("read %s success",path);FILE *new=fopen("/root/photo_in/new.jpg","w");printf("open /root/photo_in/new.jpg success");int c;sleep(1);printf("ready to open!");while((c=fgetc(out))!=EOF)//open /root/photo_in/cat.jpg { //get c of cat.jpgchar photo[100];sprintf(photo,"%d",c);//write c into photo[]int b=atoi(photo);fputc(b,new);// printf("data %s\n",photo); write(socket_fd,photo,strlen(photo)); //write photo[]to serverusleep(1500);//sleep(?) }char *end="#";write(socket_fd,end,strlen(end));close(socket_fd);}以下是服務(wù)端代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> //sockaddr_in#define PORT 6675int main() {int socket_fd;int new_fd; //建立套接字 socket_fd=socket(AF_INET,SOCK_STREAM,0);// int socket(int domain, int... printf("socket_fd is %d\n",socket_fd);//初始化設(shè)置地址和端口號(hào)struct sockaddr_in server_addr; memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=htonl(INADDR_ANY);memset(&(server_addr.sin_zero),0,8);//設(shè)置端口可重用int contain;setsockopt(socket_fd,SOL_SOCKET, SO_REUSEADDR, &contain, sizeof(int)); //綁定fd和本機(jī)地址int res=bind(socket_fd,(struct sockaddr *)&server_addr,sizeof(server_addr));printf("bind res is %d\n",res);if(res==-1) return -1;if(listen(socket_fd,20)==-1){printf("Failed to listen!\n");return -1;}printf("after listen\n");while(1){struct sockaddr_in client_addr;int size=sizeof(client_addr);new_fd=accept(socket_fd, (struct sockaddr *)&client_addr, &size);if(new_fd==-1){printf("wait for client to connect!\n");sleep(1);continue;}printf("A connect and the new fd is %d\n",new_fd);/*while(1){ char input[100];char output[100];res=read(new_fd,input,100);input[res]=0;printf("client says '%s'\n",input); gets(output);res=write(new_fd,output,strlen(output));}*///while(1) {FILE *in;char input[100];res=read(new_fd,input,100);input[res]=0;char path[100];sprintf(path,"/root/photo_out/%s",input);printf("the path is %s\n",path);in=fopen(path,"w");printf("after path\n");char photo[10];while(1){memset(photo,0,10);res=read(new_fd,photo,10);if(res==0){printf("read nothing"); return 0;}photo[res]=0;int d=atoi(photo);// printf("data %s\n",photo);fputc(d,in);}}}close(socket_fd);close(new_fd); }?
所以接下來是不放在本地測(cè)試,而是放在騰訊云服務(wù)器上測(cè)試!
放在遠(yuǎn)端服務(wù)器上測(cè)試沒想到套接字阻塞的現(xiàn)象比本地測(cè)試更加嚴(yán)重!
就是 客戶端傳4 18 3過去?
結(jié)果?服務(wù)端把4183 當(dāng)做一個(gè)點(diǎn)的像素值寫了進(jìn)去!
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzzPark/p/6388868.html
總結(jié)
以上是生活随笔為你收集整理的Linux 图片传输功能c/c++(初版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拿起来就能翻!讯飞翻译机4.0评测:双人
- 下一篇: Linux中设置vim自动在运算符号两边