TCP實現文件傳輸以及下載

目錄

1.上傳文件思路

2.下載文件思路

3.上傳文件代碼

4.下載文件代碼

5.運行格式


1.上傳文件思路

上傳文件就相當于客戶端發送文件

步驟:

  1. 創建套接字
  2. 連接服務器
  3. 獲取文件大小
  4. 循環少量多次發送
  5. 關閉文件和套接字

2.下載文件思路

下載文件就相當于服務器端接收文件

步驟:

  1. 創建套接字
  2. 綁定服務器信息
  3. 監聽
  4. 接收數據
  5. 關閉文件描述符

3.上傳文件代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>#define MSG_LEN 4096// 相當于客戶端上傳文件
// a.out 服務器端IP 服務器端口 要上傳文件路徑
int main(int argc, char *argv[])
{if (argc != 4){printf("參數有誤!\n");return -1;}// 先檢查文件存不存在if (access(argv[3], F_OK) == -1){printf("文件不存在\n");return -1;}// 創建套接字int send_fd = socket(AF_INET, SOCK_STREAM, 0);if (send_fd == -1){perror("socker error...");return -1;}struct sockaddr_in send_inf;send_inf.sin_family = AF_INET;send_inf.sin_addr.s_addr = inet_addr(argv[1]);send_inf.sin_port = htons(atoi(argv[2]));// 連接if (connect(send_fd, (struct sockaddr *)&send_inf, sizeof(send_inf)) == -1){perror("connnect error...");return -1;}else{// 發送數據// 先獲取文件大小struct stat sb;memset(&sb, 0, sizeof(sb));stat(argv[3], &sb);long file_size = sb.st_size;printf("文件大小是:%ld\n", file_size);int file_fd = open(argv[3], O_RDONLY);if (file_fd == -1){perror("open error...");return -1;}char msg[MSG_LEN] = "\0";int i;// 循環發送數據for (i = 0; i < (file_size / MSG_LEN); i++){memset(msg, 0, sizeof(char) * MSG_LEN);// 先讀int read_ret = read(file_fd, msg, MSG_LEN);if (read_ret == -1){perror("read error...");printf("%d\n", __LINE__);return -1;}// 再寫int write_ret = write(send_fd, msg, read_ret);if (write_ret == -1){perror("write error...");return -1;}usleep(2000);}if (file_size % MSG_LEN != 0){// 最后一次memset(msg, 0, sizeof(char) * MSG_LEN);int read_ret = read(file_fd, msg, MSG_LEN); // 因為read是安全的,所以可以直接讀MSG_LEN,即使數據不夠也不會多讀if (read_ret == -1){perror("read error...");return -1;}// 再寫int write_ret = write(send_fd, msg, read_ret);if (write_ret == -1){perror("write error...");return -1;}}printf("發送成功!\n");// 關閉文件描述符close(send_fd);close(file_fd);}return 0;
}

4.下載文件代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>#define MSG_LEN 4096// 相當于服務器接收文件
// a.out 服務器端口 存放文件路徑
int main(int argc, char *argv[])
{if (argc != 3){printf("參數有誤!\n");return -1;}// 創建套接字int rec_fd = socket(AF_INET, SOCK_STREAM, 0);if (rec_fd == -1){perror("socker error...");return -1;}struct sockaddr_in rec_inf;rec_inf.sin_family = AF_INET;rec_inf.sin_addr.s_addr = htonl(INADDR_ANY);rec_inf.sin_port = htons(atoi(argv[1]));// 綁定if (bind(rec_fd, (struct sockaddr *)&rec_inf, sizeof(rec_inf)) == -1){perror("bind error...");return -1;}// 監聽if (listen(rec_fd, 20) == -1){perror("listen error...");return -1;}int send_fd = accept(rec_fd, NULL, NULL);if (send_fd == -1){perror("accpet error...");return -1;}else{// 接收數據char msg[MSG_LEN] = "\0";umask(0000);int file_fd = open(argv[2], O_CREAT | O_WRONLY, 0777);if (file_fd == -1){perror("open error...");return -1;}while (1){memset(msg, 0, sizeof(char) * MSG_LEN);int read_ret = read(send_fd, msg, MSG_LEN);if (read_ret == -1){perror("read error...");return -1;}else if (read_ret == 0){break;}else{if (write(file_fd, msg, strlen(msg)) == -1){perror("write error...");return -1;}}}close(file_fd);close(rec_fd);}return 0;
}

5.運行格式

一、發送端(客戶端)

a.out 服務器端IP 服務器端口 要上傳文件路徑

二、接收端(服務器端)

a.out 服務器端口 存放文件路徑

(注意:同一臺主機端口號不能相同)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13380.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13380.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

layui+java前端傳json后端接收

項目場景&#xff1a; layui前端使用復選框選擇Table的數據傳到java后端進行業務操作 問題描述 報錯類型錯誤JSON轉換接收失敗的類型錯誤 解決方案&#xff1a; 分為前后端兩種情況 先說前端的: 前端需要是集合轉json下面是代碼案例 主界面的table選擇之后通過緩存傳到子界…

JavaScript 實現敏感信息脫敏

JavaScript 實現敏感信息脫敏 銀行卡號脫敏 要在 JavaScript 中對銀行卡信息進行脫敏&#xff0c;可以使用字符串處理方法來替換敏感信息為特定的字符。以下是一個簡單的示例代碼&#xff0c;將銀行卡號的中間數字用 “*” 替換&#xff1a; function desensitizeCardNumber…

小白git

克隆 &#xff1a;git clone 鏈接地址 如果沒有.git文件的話&#xff1a;git init 切換分支&#xff1a;cd 目錄 拉代碼&#xff1a;git pull 查看你自己改了那些文件&#xff1a;git status 添加道本地暫存區&#xff1a;git add * 提交到遠端&#xff1a;git commit …

吳恩達深度學習筆記:優化算法 (Optimization algorithms)2.9-2.10

目錄 第二門課: 改善深層神經網絡&#xff1a;超參數調試、正 則 化 以 及 優 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;優化算法 (Optimization algorithms)2.9 學習率衰減(Learning rate decay) 第二門…

HP5V80、HP5V105、HP3V28電比例驅動柱塞泵放大器

HP5V80、HP5V105、HP3V28、HP3V45、HP3V60、HP3V80、HP3V125、HP3V140帶電比例控制泵放大器&#xff0c;變排量泵的排量可通過由BEUEC比例放大器輸出到比例電磁閥電流變化而進行調整&#xff0c;控制電流范圍為300mA至800mA(24VDC)或600mA至1600mA(12VDC)。主要適合應用于工程機…

【聯通官網及APP注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞 …

「AI模型瘦身術」——知識蒸餾技術綜述

使用KD原因 遇到問題&#xff1a;從產業發展的角度來看工業化將逐漸過渡到智能化&#xff0c;邊緣計算逐漸興起預示著 AI 將逐漸與小型化智能化的設備深度融合&#xff0c;這也要求模型更加的便捷、高效、輕量以適應這些設備的部署。 解決方案&#xff1a;知識蒸餾技術 知識…

Logic Pro X for Mac v11.0.0激活版:專業音頻制作軟件

對于音樂創作者來說&#xff0c;一個穩定、高效的工作流程至關重要。Logic Pro X for Mac提供了一系列工作流程優化功能&#xff0c;讓你能夠更快捷、高效地完成音樂創作。從添加音軌、錄制音頻&#xff0c;到混音和編曲&#xff0c;每一個步驟都如絲般順滑。同時&#xff0c;L…

Maven 依賴排查

先從項目去看顯而易見&#xff0c;假如我們有一個項目&#xff0c;父工程中包含一些子工程&#xff0c;如下&#xff1a; 我們想看一下samples-account中的依賴關系&#xff0c;那么我們可以打開 samples-account的pom文件&#xff0c;查看其maven依賴關系圖。 我們可以看到此項…

Java測試框架:分享常用的Java測試框架,如JUnit, TestNG等,包括單元測試,集成測試,性能測試等

單元測試框架 JUnit JUnit簡介 JUnit是一個開源的Java測試框架,用于編寫和執行可重復的測試。它是Java開發人員的一個重要工具,用于進行單元測試、回歸測試和模塊化測試。JUnit提供了一種形式化的方式來編寫測試用例,并通過這些測試用例核實代碼的正確性。具有可預測的測試…

ARM 交叉編譯搭建SSH

一、源碼下載 zlib&#xff1a;zlib-1.3.1.tar.xz openssl&#xff1a;openssl-0.9.8d.tar.gz openssh&#xff1a;openssh-4.6p1.tar.gz 二、交叉編譯 1、zlib 編譯參考這里 2、openssl tar -xf openssl-0.9.8d.tar.gz ./Configure --prefix/opt/ssh/openssl os/compile…

android設計模式-builder模式

builder模式可以看成是鏈式調用&#xff0c;如&#xff0c;是builder不是那個bunder new AlertDialog.Builder(this) .setTitle("對話框") .setMessage("測試") .setIcon(R.mipmap.ic_launcher) …

2024年抖店保證金交多少?保證金常見問題解答,一文解決你所有疑惑

大家好&#xff0c;我是電商花花 新手如果想要開抖音小店&#xff0c;有一個大坑是必須要避開的。 就是我們店鋪開通之后&#xff0c;我們一定要交保證金&#xff0c;如果不交&#xff0c;那就是0元開店。 很多新手聽別人說做抖音小店可以0元開店&#xff0c;不用繳納保證金就…

Voronoi路徑規劃探索

系列文章目錄 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 TODO:寫完再整理 文章目錄 系列文章目錄前言Voronoi圖的生成與更新Voronoi路徑規劃探索2.維諾圖Voronoi的生成--避障路徑Voronoi Planner一、生成與更新代價地圖costmap的方式二、生成與更新D…

開箱機選型“避坑”指南:風險識別與應對策略一網打盡

在現代化生產線上&#xff0c;開箱機作為關鍵設備之一&#xff0c;其選型過程的成功與否直接關系到生產效率與成本控制。然而&#xff0c;在選型過程中&#xff0c;往往會面臨諸多風險&#xff0c;如何有效識別并應對這些風險&#xff0c;成為企業關注的焦點。星派將為您詳細解…

JETBRAINS IDES 分享一個2099通用試用碼!DataGrip 2024 版 ,支持一鍵升級

文章目錄 廢話不多說上教程&#xff1a;&#xff08;動畫教程 圖文教程&#xff09;一、動畫教程激活 與 升級&#xff08;至最新版本&#xff09; 二、圖文教程 &#xff08;推薦&#xff09;Stage 1.下載安裝 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

[解決方法]echarts地圖/圖表縮放,側邊欄導致樣式自適應問題

&#x1f50e;嘿&#xff0c;這里是慰慰&#x1f469;&#x1f3fb;?&#x1f393;&#xff0c;會發各種類型的文章&#xff0c;智能專業&#xff0c;從事前端&#x1f43e; &#x1f389;如果有幫助的話&#xff0c;就點個贊叭&#xff0c;讓我開心一下&#xff01;&#x1f…

百度Comate插件領50京東E卡

給你分享一個AI編碼助手——百度Comate&#xff01;掃碼參與抽紅包活動&#xff0c;520寵粉&#xff01;送京東卡&#xff01;https://url.xffjs.com/sMsP7m 流程如下 點擊&#xff1a;點我傳送 驗證碼登錄賬戶 點擊個人中心 復制License 去idea或者vscode安裝插件 詢問一…

Mysql的語句執行很慢,如何分析呢?

想象一下&#xff0c;MySQL像是一本巨大的電子相冊&#xff0c;里面存放著各種照片&#xff08;數據&#xff09;。當你想要找某張照片時&#xff0c;如果相冊沒有整理&#xff0c;你可能需要一張張翻看&#xff0c;這自然就慢了。但如果你給相冊里的照片分了類&#xff0c;貼上…

【Redis】Redis 主從集群(二)

1.哨兵機制原理 1.1.三個定時任務 Sentinel 維護著三個定時任務以監測 Redis 節點及其它 Sentinel 節點的狀態 1&#xff09;info 任務&#xff1a;每個 Sentinel 節點每 10 秒就會向 Redis 集群中的每個節點發送 info 命令&#xff0c;以獲得最新的 Redis 拓撲結構 2&#xff…