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.mzph.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…