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
如果要檢查文件傳輸過程有沒有出錯,可以通過命令: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
?
總結
- 上一篇: Linux系统压缩及解压缩
- 下一篇: 前端知识点总结---面试专用