项目:基于TCP的文件传输系统

项目介绍:
模拟FTP原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,那么清空文件然后写入。
项目技术点:
TCP客户端和服务器的搭建
目录IO获取路径下的文件名用于展示
标准IO或文件IO的打开,读取以及写入操作文件
TCP协议需要考虑如何防止粘包的发生(建议发送和接收的大小一致)
参考内容:

(1)client.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int main(int argc, const char* argv[]){//1.socketint sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("socket is error:");return -1;}//绑定套接字struct sockaddr_in saddr,caddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[2]));saddr.sin_addr.s_addr = inet_addr(argv[1]);char buf[128];if(connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0){perror("connect is error:");return -1;}while(1){//选择功能printf("功能1--------list--------\n");printf("功能2--------put--------\n");printf("功能3--------get--------\n");printf("功能4--------quit-------\n");printf("请选择功能:\n");int num;scanf("%d",&num);//显示该目录下的所有文件if(num == 1){send(sockfd,&num,4,0);while(1){char stu[128];int flag = 1;send(sockfd,&flag,4,0);int res = recv(sockfd,stu,sizeof(stu),0);printf("%s\n",stu);if(stu[0] == 0){break;}}}//上传文件else if(num  == 2){printf("请输入要上传的文件名\n");send(sockfd,&num,4,0);char stu[512];scanf("%s",stu);//以只读形式打开已有文件int fd = open(stu,O_RDONLY);//判断文件是否存在if(access(stu,F_OK) == -1){printf("输入文件不存在,请重新输入:\n");break;}       while(1){char s[512];int flag = 0;int res = read(fd,s,sizeof(s));if(res == 0){break;}send(sockfd,s,sizeof(s),0);recv(sockfd,&flag,4,0);}printf("上传成功\n");}//下载文件else if(num == 3){send(sockfd,&num,4,0);printf("请输入要下载的文件\n");char c[32];scanf("%s",c);if(c[strlen(c)-1] == '\n')c[strlen(c)-1] = '\0';   send(sockfd,c,32,0); //创建新的文件并打开 int fd = open(c,O_WRONLY | O_TRUNC | O_CREAT,0666);char ct[256]="";  while(1){int flag = 1;int res = recv(sockfd,ct,sizeof(ct)-1,0);if(strlen(ct)==0){break;}//写入新的文件内,下载成功write(fd,ct,strlen(ct));}printf("下载成功\n");//关闭文件close(fd);}//退出(仅客户端),服务端仍然等待其他客户端连接else if(num == 4){send(sockfd,&num,4,0);  }else{printf("抱歉,您输入的数字有误,请重新输入\n");}}close(sockfd);   return 0;
}
(2)server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <dirent.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;int main(int argc, const char* argv[]) 
{//1.socketint sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("socket is error:");return -1;}//绑定套接字struct sockaddr_in saddr,caddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = inet_addr("0.0.0.0");int len = sizeof(caddr);char buf[128];if(bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)) < 0){perror("bind is error:");return -1;}if(listen(sockfd,5) < 0){perror("listen is error:");return -1;}while(1){printf("-------等待客户端连接-----------\n");int acceptfd = accept(sockfd,(struct sockaddr *)&caddr,&len);if(acceptfd < 0){perror("accept is error:");return -1;}printf("-------客户端连接成功------------\n");while(1){int num;printf("请选择功能\n");int res = recv(acceptfd,&num,sizeof(num),0);if(res < 0){perror("recv is error:");return -1;}else if(res == 0){printf("recv is exit:\n");break;}else{if(num == 1){struct dirent *file = NULL;DIR *dp = opendir("./");if (dp == NULL) {perror("opendir is error:");return -1;}while((file = readdir(dp)) != NULL) {if(file->d_name[0] == '.' ){continue;}int flag = 0;recv(acceptfd,&flag,4,0);send(acceptfd,file->d_name,128,0);}int flag = 0;recv(acceptfd,&flag,4,0);char bb[128] ={0};send(acceptfd,bb,128,0);}else if(num == 2){//新建文件并打开int fd = open("./3",O_WRONLY | O_TRUNC | O_CREAT,0666);while(1){char ss[512];int flag = 1;//接收内容int res = recv(acceptfd,ss,sizeof(ss),0);if(res == 0){break;}//写入write(fd,ss,strlen(ss));send(acceptfd,&flag,4,0);                         }//关闭文件close(fd);}else if(num == 3){printf("进入功能:\n");char c[32] = {0};recv(acceptfd,c,32,0);printf("%s\n",c);int fd = open(c,O_RDONLY);while(1){char st[256]="";int flag=1;   int res = read(fd,st,sizeof(st)-1);//阻塞性接收并传送回文件数据与内容if(res == 0){char dt[256]="";  send(acceptfd,dt,sizeof(dt)-1,0);break;}if(flag==1){send(acceptfd,st,sizeof(st)-1,0);			}}}else if(num == 4){break;}else{printf("抱歉,您输入的数字有误,请重新输入\n");}   }}}
close(sockfd);
return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PsConvertToGuiThread函数调用前传

PsConvertToGuiThread函数调用前传 第一部分&#xff1a;位置 chchenghaodeiMac base % grep "Kss_ErrorHandler" -nr ./ .//ntos/ke/i386/trap.asm:1026:Kss_ErrorHandler: .//ntos/ke/i386/trap.asm:1220: jae Kss_ErrorHandler ; if ae, try…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

C#面:ASP.NET MVC 中还有哪些注释属性用来验证?

在 ASP.NET MVC 中&#xff0c;除了常见的数据注解属性&#xff08;如Required、StringLength等&#xff09;&#xff0c;还有一些其他的注解属性用来验证数据。以下是一些常用的注解属性&#xff1a; Range&#xff1a;用于验证数字类型的属性值是否在指定的范围内。 [Range(…

中文乱码解决方案

解决程序中的中文乱码问题通常涉及到几个关键点&#xff1a;字符编码的设置、环境变量的配置以及程序内部处理方式。这里提供一些常见的解决方案&#xff1a; 1. 设置正确的输入输出流编码 如果你的应用程序是在读取或写入文件时出现乱码&#xff0c;确保设置了正确的文件编码…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时&#xff08;1分钟间隔&#xff09;的路口的各向通行状况、红绿灯及溢出情况。 优势&#xff1a; 投入少&#xff0c;效果好&#xff0c;无需安装设备&#xff1b; 缺陷&#xff1a; 时间间隔…

人工智能在网络安全领域的应用探索

随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为制约数字化进程的重要瓶颈。人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正逐步在网络安全领域展现出其巨大的潜力和价值。本文旨在探讨人工智能在网络安全领域的应用现状、优势…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…

单HTML文件集成Vue2+axios的使用

1、下载vue2.js和axios.js到本地 2、建一个HTML文件&#xff0c;内容如下&#xff1a; <html> <head><meta charset"UTF-8"><script src"./js/vue2.js"></script><script src"./js/axios.js"></script&…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

Array常用的函数

在JavaScript中&#xff0c;Array 对象提供了许多实用的方法来操作数组。以下是常用的几个函数及其简要说明&#xff1a; 1. Array.prototype.forEach forEach 用于遍历数组中的每个元素&#xff0c;并执行一个提供的函数。 语法 array.forEach(callback(currentValue[, in…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…

【自动驾驶】控制算法(六)前馈控制与航向误差

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

vue按钮弹框

在Vue中实现按钮点击后弹出对话框&#xff08;弹框&#xff09;的功能&#xff0c;通常可以使用一些Vue的UI组件库&#xff0c;如Element UI、Vuetify、BootstrapVue等&#xff0c;这些库提供了丰富的组件&#xff0c;包括对话框&#xff08;Dialog&#xff09;、模态框&#x…

如何使用Gogs搭建自己的git服务器

最近偶然发现一款轻量级的git服务器&#xff0c;以前一直用的svn server&#xff0c;最近想搞个git服务器&#xff0c; 用gitlab资源占用太多了&#xff0c;gogs是一款轻量级git服务器&#xff0c;非常适合个人使用。 项目地址&#xff1a;GitHub - gogs/gogs: Gogs is a painl…

(十八)Flink CEP 详解

目录 Flink CEP 引用 模式 API 单个模式 组合模式 模式组 匹配后跳过策略 检测模式 从模式中选取 CEP 库中的时间 实用案例 Flink CEP 是在 Flink 上层实现的复杂事件处理库。它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的部分。Flink CEP …

图书项目要点

一、搭建项目 使用tarojs/cli进行搭建 taro init [项目名] 二、具体页面 页面声明&#xff1a; 在【app.config.ts】中对主页面进行声明&#xff1a;组件页面可以不用声明 pages: ["pages/index/index",pages/user/index,pages/book/index,], tabbar制作&…

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 &#xff08;1&#xff09;select &#xff08;2&#xff09;epoll 注&#xff1a;select与epoll文件描述符限制的区别是指同时涌入的客户端数量&#xff0c;select最大只能有1024个&#xff0c;epoll可以超…

MSR810配置本地认证的有线802.1X认证

正文共&#xff1a;1567 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 IEEE 802.1X协议又称DOT1X协议&#xff0c;是一种基于端口的网络接入控制协议&#xff08;Port based network access control protocol&#xff09;&#xff0c;即在局域网接入设备的端口上对所接…