日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP文件传输

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP文件传输 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面是一個簡單的TCP文件傳輸的例子,實現環境:Linux C

Server.c

// 向客戶端發送文件#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h>#define MAXBUFF 1024// 通過sock來發送指定的文件 int sendFile(char *srcFile, int sock) {int inFile;if((inFile = open(srcFile, O_RDONLY)) == -1) //只讀方式打開test.txt ,iffile文件指針{printf("找不到文件[%s]或打不開, 停止運行\n", srcFile);return -1; // 發送文件失敗}int nread;char buf[MAXBUFF] = {0};while((nread = read(inFile, buf, MAXBUFF)) > 0){if(write(sock, buf, nread) == -1) // 將緩沖區的內容寫到sockprintf("寫sock出了錯\n");}close(inFile);return 0; // 發送文件成功 }int main() {int sock,length,clilen;struct sockaddr_in server, client;/******************************建立Socket連接*********************************/sock = socket(AF_INET,SOCK_STREAM,0); //申請socket資源if (sock < 0){perror("socket");return 1;}server.sin_family = AF_INET;server.sin_addr.s_addr = INADDR_ANY; // 必然的,這里指的是Internet協議*/server.sin_port = 0; // 這里,是讓系統自動分配一個端口號,在1024到5000之間65535個端口 ,端口設為0,系統自動分配 if (bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) // 將IP地址和端口號綁到sock上{perror("bind");return 1;}length = sizeof(server);if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) /*獲得指定socket的本地地址,成功返回0,錯誤返回-1*/{perror("getsockname");return 1;}printf("Socket port #%d\n", ntohs(server.sin_port)); /* 打印出系統分的端口號,給client用*/listen(sock, 5); /*5個連接請求排隊等待,一般5個 Pause Here 等待client連接*//****************現在是等待客戶來連接,如果來客戶了,那就建好了socket,就可以當文件使用**********/clilen = sizeof(client); int msgsock = accept(sock,(struct sockaddr *)&client,(int *) &clilen); /*創建一個新的與sock相同的socket并返回其值*/if (msgsock == -1)perror("accept");else{char srcFile[] = "test.txt";if(sendFile(srcFile, msgsock) == 0)printf("發送文件[%s]成功\n", srcFile);elseprintf("發送文件[%s]失敗\n", srcFile);} close(msgsock); // 關閉臨時套接字close(sock);return 0; }


Client.c

// 功能:接收服務器發送過來的數據,保存到本地文件#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h>#define MAXBUFF 1024 #define PERM 0644 // 創建文件的默認屬性// 通過sock接收數據保存到文件destFile int recvFile(char *destFile, int sock) {int outFile, nread;char buf[MAXBUFF] = {0};if((outFile = open(destFile, O_WRONLY|O_CREAT|O_TRUNC, PERM)) == -1) //創建文件return 1;while((nread = read(sock, buf, MAXBUFF)) > 0) /*從sock讀取傳來的文件內容到緩沖區*/{ if(write(outFile, buf, nread) == -1) /*將緩沖區的內容寫到文件里*/{printf("寫文件時出錯, 中止接收文件\n");close(outFile);return 1;}}close(outFile);return 0; }int main(int argc, char *argv[]) {int sock;struct sockaddr_in server;struct hostent *hp;if(argc < 3){printf("Usage: %s <hostname> <server port>\n", argv[0]);return 1;}sock = socket(AF_INET, SOCK_STREAM, 0);if (sock < 0){perror("socket");return 1;}server.sin_family = AF_INET;hp = gethostbyname(argv[1]); /*根據主機名查地址,返回指針指向hostent結構*/if (hp == 0){fprintf(stderr, "%s: unknown host\n", argv[1]);return 1;}memcpy((char *)&server.sin_addr,(char *)hp->h_addr, hp->h_length); // 拷貝Internet地址server.sin_port = htons(atoi(argv[2])); // argv[2]是服務器端口號if (connect(sock,(struct sockaddr *)&server,sizeof(server)) < 0) // 根據server地址連接sock,建立一條真實的連接{perror("connect");close(sock);return 1;}char destFile[] = "test_out.txt";if(recvFile(destFile, sock) == 0){printf("接收文件[%s]成功\n\n", destFile);}else{printf("創建輸出文件[%s]出錯, 請檢查\n", destFile);}close(sock);return 0; }


如果要檢查文件傳輸過程有沒有出錯,可以通過命令:wc或計算MD5值來作比較。

我的檢測結果:

[zcm@t #64]$cat test.txt |wc89 183 2901 [zcm@t #65]$cat test_out.txt |wc89 183 2901 [zcm@t #66]$md5sum test.txt test_out.txt fffb6bcab6154aad9f7dfe4f5d945bc3 test.txt fffb6bcab6154aad9f7dfe4f5d945bc3 test_out.txt


?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的TCP文件传输的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。