linux——客户端服务器文件传输
生活随笔
收集整理的這篇文章主要介紹了
linux——客户端服务器文件传输
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現文件傳輸并不難,只需用fopen、fread、fwrite、fclose這幾個函數對文件操作即可。文本文件就不說了,我們就已下圖為例。
我們先來看看這個圖片文件里裝的是什么,我們以notpad++打開這個圖片,結果如下,是一堆亂碼。
我們在已二進制方式打開,方式如下:
首先打開vs的一個項目
選擇一張圖片
這張圖片添加到源文件后,右鍵這張圖片,選擇打開方式
選擇二進制編輯器
結果如下
圖片文件是以二進制方式存儲的,因為二進制更加節省空間,所以我們在用fopen函數時注意都要以二進制的形式讀或寫。
我們以客戶端作發送方,服務器作接收方,先在客戶端的源碼目錄下放一張圖片123.jpg,啟動服務器后在啟動客戶端,便在服務器的目錄下產生一張與123.jpg一樣的圖片456.jpg。
服務器
#include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <netinet/in.h> int main() {struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);const int on=1;setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));if(bind(sockid,(struct sockaddr *)&sock,sizeof(sock))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in other_sock;socklen_t other_socklen=sizeof(other_sock);int client_sockid=accept(sockid,(struct sockaddr *)&other_sock,&other_socklen);printf("ip=%s,port=%d\n",inet_ntoa(other_sock.sin_addr),ntohs(other_sock.sin_port));FILE *fp=fopen("456.jpg","wb");char receive[4096]={0};int r_size=0;while(1){memset(receive,0,sizeof(receive));if((r_size=read(client_sockid,receive,sizeof(receive)))==0)//讀取文件內容,如果客戶端已全部發送,則read返回0,因為客戶端發送完后就退出{printf("已成功接收\n");break;}fwrite(receive,1,r_size,fp);//讀了多少數據就往文件里寫多少數據}close(client_sockid);close(sockid);fclose(fp);return 0; }客戶端
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> int main() {struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=inet_addr("***");//服務器ipint sockid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);socklen_t socklen=sizeof(sock);connect(sockid,(struct sockaddr *)&sock,socklen);FILE *fp=fopen("123.jpg","ab");char send[4096]={0};int r_size;while(!feof(fp))//判斷文件指針是否到達文件末尾{r_size=fread(send,1,sizeof(send),fp);//讀取文件數據write(sockid,send,r_size);,//讀多少數據就發多數據給服務器memset(send,0,strlen(send));}printf("發送成功\n");close(sockid);fclose(fp);return 0; }用這個辦法不僅可以傳輸文件,還可以傳輸視頻文件,只需把文件名稱更改一下即可
總結
以上是生活随笔為你收集整理的linux——客户端服务器文件传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC操作Excel2003的CRang
- 下一篇: Kubernetes 1.20 报错:“