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

2024-08-29 18:12
文章标签 系统 项目 tcp 文件传输

本文主要是介绍项目:基于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;
}

这篇关于项目:基于TCP的文件传输系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118586

相关文章

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整