lv8 嵌入式开发 网络编程开发 21 私有云盘项目

news2024/12/23 8:55:27

目录

1云盘项目简介

2 项目实现

2.1 首先实现TCP客户端、服务端

2.2 实现客户端函数简化

2.3 实现服务端函数简化

2.4 TCP数据连包现象

2.5 封装send函数和recv函数

2.6 建立readme说明

2.7 实现文件传输

2.8 读取配置文件种的ip、端口号,通过argv[1]参数实现文件传输

3 最终项目 


1云盘项目简介

常见的云盘服务软件

什么是云同步? 

  • 保持云端数据和终端数据的一致
  • 上传和下载
  • 实时同步
  • 定时同步
  • 手动同步

需求分析

  • 文件的上传和下载
  • 文件的大小不确定(文件太大,upd传输就不合适)
  • 文件的个数不确定
  • 实时同步需要获取文件事件(因为用循环太占cpu)
  • 定时同步需要设置定时器
  • 使用TCP实现手动同步

如何实现手动同步?

  • 实现TCP通信
  • 使用TCP实现文件的上传和下载
  • 实现整个目录下的文件的同步
  • 实现项目框架
  • 完成项目

2 项目实现

2.1 首先实现TCP客户端、服务端

cloud-project_v1

为了方便管理头文件,新建tcp.h

#ifndef _TCP_H
#define _TPC_H

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>

#define ErrExit(msg) do{ perror(msg); \              //异常处理宏定义
						 exit(EXIT_FAILURE);\
					   }while(0);
typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;
#define BACKLOG 5

#endif

实现server.c

#include "tcp.h"

int main(int argc, char *argv[])
{
	int ret, fd, newfd;
	Addr_in addr,client_addr;
	socklen_t addrlen = sizeof(client_addr);
	char buf[BUFSIZ] = {};


	//检查参数
	if(argc < 3)
	{
		fprintf(stderr, "%s <addr> <port>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	//创建套接字
	if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		ErrExit("socket");

	//设置通信结构体
	bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	if(inet_aton(argv[1], &addr.sin_addr) == 0)
	{
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}
	
	//绑定通信结构体
	if(bind(fd,(Addr *)&addr, sizeof(addr)))
		ErrExit("bind");

	//监听模式
	if(listen(fd, BACKLOG))
		ErrExit("listen");

	//接收客户端链接
	bzero(&client_addr,sizeof(client_addr));
	do
	{
		newfd = accept(fd, (Addr *)&client_addr, &addrlen);
	}while(newfd < 0 && errno == EINTR);
	if(newfd < 0)
		ErrExit("accept");

	//接收客户端数据
	while(1)
	{
		do 
		{
			ret = recv(newfd, buf, BUFSIZ, 0);
		}while(ret < 0 && errno == EINTR); //如果信号导致的错误,继续执行
		if(ret < 0)
		{
			ErrExit("recv");
		}
		else if(!ret)  //ret = 0 客户端退出
		{
			break;
		}
		else           //ret > 0
		{
			printf("[%s:%d]buf:%s\n", 
					inet_ntoa(client_addr.sin_addr), 
					ntohs(client_addr.sin_port), buf);
		}
	
	}

	close(newfd);
	close(fd);
	return 0;
}

实现服务端client.c(复制服务端进行改动)

#include "tcp.h"

int main(int argc, char *argv[])
{
	int ret, fd;
	Addr_in addr;
	char buf[BUFSIZ] = {"===test"};

	//检查参数
	if(argc < 3)
	{
		fprintf(stderr, "%s <addr> <port>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	//创建套接字
	if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		ErrExit("socket");

	//设置通信结构体
	bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	if(inet_aton(argv[1], &addr.sin_addr) == 0)
	{
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}
	
	//发起连接请求
	if(connect(fd,(Addr *)&addr, sizeof(addr)))
		ErrExit("bind");

	//发送数据
	while(1)
	{
		do 
		{
			ret = send(fd, buf, BUFSIZ, 0);
		}while(ret < 0 && errno == EINTR); //如果信号导致的错误,继续执行
		if(ret < 0)
		{
			ErrExit("recv");
		}
		else if(!ret)  //ret = 0
		{
			break;
		}
		printf("send data:%s\n", buf);
        fflush(stdout);
		getchar();
	
	}

	close(fd);
	return 0;
}

最终实现效果,客户端发送,服务端打印===test

2.2 实现客户端函数简化

cloud_project_v1.1客户端给服务端传文件

主要工作:

  • 封装客户端socket创建过程的函数,简化代码
  • 创建makefile

tcp.h

#ifndef _TCP_H_
#define _TCP_H_

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <arpa/inet.h>
#include <errno.h>

#define BACKLOG 5

#define ErrExit(msg) do { perror(msg); \
	exit(EXIT_FAILURE); } while(0)

typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;

void Argment(int argc, char *argv[]);
int SocketInit(char *argv[]);
#endif

tcp.c

#include "tcp.h"

void Argment(int argc, char *argv[]){
	if(argc < 3){
		fprintf(stderr, "%s <addr><port>\n", argv[0]);
		exit(EXIT_FAILURE);
	}
}

int SocketInit(char *argv[]){
	int fd;
	Addr_in addr;
	/*创建套接字*/
	if( (fd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
		ErrExit("socket");
	/*设置通信结构体*/
	bzero(&addr, sizeof(addr) );
	addr.sin_family = AF_INET;
	addr.sin_port = htons( atoi(argv[2]) );
	if (inet_aton(argv[1], &addr.sin_addr) == 0) {
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}
	/*发起连接请求*/
	if( connect(fd, (Addr *)&addr, sizeof(addr) ) )
		ErrExit("connect");
	return fd;
}

 client.c

#include "tcp.h"

int main(int argc, char *argv[])
{
	int fd;
	int ret;
	char buf[BUFSIZ] = {"===test==="};
	/*检查参数*/
	Argment(argc, argv);

	fd = SocketInit(argv);

	/*发送数据*/
	while(1){
		do {
			ret = send(fd, buf, BUFSIZ, 0);
		}while(ret < 0 && errno == EINTR); //如果信号导致的错误,继续执行
		if(ret < 0)
			ErrExit("recv");
		else if(!ret)
			break;
		printf("send data:%s", buf);
		fflush(stdout);
		getchar();
	}

	close(fd);
	return 0;
}

server.c

#include "tcp.h"

int main(int argc, char *argv[])
{
	int ret, fd, newfd;
	Addr_in addr,client_addr;
	socklen_t addrlen = sizeof(client_addr);
	char buf[BUFSIZ] = {};


	//检查参数
	if(argc < 3)
	{
		fprintf(stderr, "%s <addr> <port>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	//创建套接字
	if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		ErrExit("socket");

	//设置通信结构体
	bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
	addr.sin_port = htons(atoi(argv[2]));
	if(inet_aton(argv[1], &addr.sin_addr) == 0)
	{
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}
	
	//绑定通

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

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

相关文章

如何做好高校后勤管理?有什么好用的高校后勤管理软件?

当谈到现代校园的后勤管理时&#xff0c;广州商学院的经验提供了一个成功的案例&#xff0c;可供其他学校学习和借鉴。 一、关于广州商学院   广州商学院&#xff0c;是经教育部批准设立的一所全日制普通本科院校&#xff0c;占地面积1400多亩&#xff0c;总建筑面积55万余平…

白嫖的安信可-小安派s1开发板开箱

白嫖的安信可-小安派s1开发板开箱 前言1、主板2、SPI触摸屏3、DVP摄像头4、喇叭5、咪头 前言 今天是了解到接触到在到白嫖&#xff0c;拿到小安派的第二天&#xff0c;那就介绍一下刚刚接触的小安派。看到开发文档的烧录硬件的要求&#xff0c;安信可官方有烧录软件&#xff0…

STM32F4X SDIO(三) SD卡命令与响应

STM32F4X SDIO&#xff08;三&#xff09;SD卡命令与响应 SD卡命令命令类型通用命令与特殊命令命令的格式SD卡命令列表通用命令基础命令读操作命令写操作命令写保护命令擦除命令加锁命令特定应用命令 特殊命令 SD卡响应列表短响应R1响应(正常响应命令)R1b响应R3响应(OCR 寄存器…

15 结构型模式-外观模式

1 外观模式介绍 2 外观模式原理 public class SubSystemA {public void methodA(){//业务代码} }public class SubSystemB {public void methodB(){} }public class SubSystemC {public void methodC(){} }public class Facade {private SubSystemA obj1 new SubSystemA();pri…

2023年中国无人机环保监测产业链及市场规模分析[图]

无人机环保监测是无人机应用场景的重要组成部分&#xff0c;无人机环保监测为通过无人机飞行平台&#xff0c;搭载环保监测仪器进行大气环境、水环境、生态环境监测的一种环境监测模式。 无人机环保监测分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; …

高中数学之向量

1.向量基本概念 1.既有大小又有方向的量叫做向量 2.只有大小没有方向的量叫做数量&#xff08;比如年龄15&#xff09; 3.具有方向的线段叫做有向线段&#xff0c;假设A为起点&#xff0c;B为终点&#xff0c;我们就说线段AB具有方向。向量可以用有向线段 A B → \overrightarr…

哈工大发布大模型思维链推理综述:200+文献全面解析大语言模型思维链推理最新进展...

©PaperWeekly 原创 作者 | 初征&#xff0c;陈靖昌&#xff0c;刘铭&#xff0c;秦兵&#xff0c;刘挺 单位 | 哈尔滨工业大学 研究方向 | 自然语言处理 论文标题&#xff1a; A Survey of Chain of Thought Reasoning: Advances, Frontiers and Future 论文链接&#xff…

【PC】2023年10月商店更新-闲游盒

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 欢迎大家来到2023年第十次商店更新&#xff01; 万圣节即将到来&#xff0c;为了让大家可以在万圣节盛装出席&#xff0c;我们在10月商店更新中准备了邪恶诅咒&#xff0c;PGC 2023的专属宝物&#xff0c;以及RASH悲喜强势回归…

CentOS7安装配置MobaXterm使用换源处理虚拟机拍照备份与还原Linux常用命令

目录 一、centos7安装与配置 1.1 参考安装步骤 1.2 安装配置CentOS 7实操 1.2.1 配置虚拟机 1.2.2 登录CenOS 1.2.3 检测是否可联网 1.2.4 查看、设置IP地址 1.2.5 使用vi编辑ifcfg-ens33 1.2.6 重启网络服务 1.3 MobaXterm使用 1.3.1 官方下载地址 1.3.2 MobaXte…

数据结构——双向链表的实现

一、双向链表的结构 注意&#xff1a;双向链表又称带头双向循环链表 这⾥的“带头”跟前⾯我们说的“头节点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严 谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点&#xff0c;实际…

计算机毕业设计选题推荐-美术馆微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

260亿!每部手机赚数千元,手机行业太赚钱了,难怪都想做手机

日前H公司公布了前三季度的业绩&#xff0c;净利润大幅增长两倍多&#xff0c;而营收仅增长2.4%&#xff0c;这显示出三季度仅是多卖了数百万部高端手机&#xff0c;利润就飙升了数百亿元&#xff0c;平均每部手机赚数千元。 该公司公布的业绩显示&#xff0c;前三季度营收增长…

【波形图】将波形图或波形图表的数据导出至文件

LabVIEW 提供了几种方法使用户能够轻松地以不同格式类型保存波形图、波形图形或二维图片。 在本文中&#xff0c;您将了解如何将波形图、波形图表或二维图片另存为图像的三种不同方法。 您可以使用以下三种方法将波形图、波形图表或二维图片保存为图像文件&#xff1a;​​​​…

1.3 安全攻击

思维导图&#xff1a; 1.3 安全攻击 定义&#xff1a; 安全攻击可以分为被动攻击和主动攻击。被动攻击&#xff1a;尝试获取或利用系统信息但不影响系统资源。主动攻击&#xff1a;尝试修改系统资源或影响系统的正常运行。 1.3.1 被动攻击 特点&#xff1a; 主要对传输数据…

【软件安装环境配置】VsCode安装和配置各种环境(保姆级)

一、VsCode 下载 1.官网下载 网站&#xff1a;Visual Studio Code - Code Editing. Redefined 打开网站 点击Download 根据操作系统&#xff08;macOS、Windows、Linux&#xff09;和版本下载 下载到本地 注意&#xff1a; 若下载很慢&#xff0c;或者下着下着就暂停了 可…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程桌面屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现7.1 屏幕抓图显示7.7 完善主控端 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1…

2023/10/29总结

总结 踩坑记录 写代码的时候遇到了一个错误大概是这样的 io.jsonwebtoken.security.WeakKeyException: The signing keys size is 48 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used…

【设计模式】第14节:结构型模式之“代理模式”

一、简介 代理模式&#xff08;Proxy Design Pattern&#xff09;在不改变原始类&#xff08;或叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。 二、优点 关注点分离访问控制延迟实例化远程访问缓存增加附加功能 三、应用场景 访问控…

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包&#xff0c;用于构建跨平台应用程序&#xff0c;支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo&#xff0c;支持linux/windows/mac/android/ios操作系统&#xff0c;此demo在ubuntu桌面环境下测试成功。…