当前位置: 首页 > news >正文

网络编程——基于TCP的自动同步云服务器

目录

一、前言

二、看看效果

三、程序


---------------------------------------------------------------------------------------------------------------------------------

工作之后真是太忙了,这次把周末某清的兼职辞了,这个周末摆烂了,虽然不干了但是大家想报培训班的还是可以找我可以给大家点优惠,我顺便加个餐哈哈。言归正传,清理库存的时候发现有个网络编程的小项目分享给大家,后面争取每个周末都更新,并且在B站开始录点系列课程从c开始零基础学习,不收大家学费,如果发现我有讲的和你理解的不一致可以一起讨论下。为啥要零基础呢,因为我分享一些稍微进阶的技术在C站看的人太少了,这样没有意义,我从基础的重新开始做就可以有更多的朋友加入进来。做这些东西一是为了提高知名度,二是为了赚钱,但是基础知识我不会赚大家的钱,只赚官方的。毕竟学基础知识的同学门应该大多都是学生,我也是刚毕业没多久比较理解大家。

---------------------------------------------------------------------------------------------------------------------------------

一、前言

        网络编程是一个很重要的知识。只是在日常生活中大家见到的和网络相关的其实是java写的,因为java开发同样的项目比c要快的多,也比c更容易学。但是最底层的东西还是c做的。今天我们就一起在linux环境下做一个网络编程的小项目吧。

不了解网络编程的可以参考我以前发的文章,点击上面的专栏即可快速访问。

二、看看效果

        首先拿到源码我们看到都是用tab做缩进的,这样不美观,换个编译器长度可能不一样,我们统一用四个空格。据说用空格的工程师比tab的薪资高10%。

        如果用vscode做编辑器远程ubuntu工作的话可以点击.*然后输入\t即可选中所有的tab,一键替换即可。

我这个有中文插件没有的话输入Indentation查找。

编译一下创建两个目录分别存放服务器和客户端程序。

修改mc_cs命令的目标位置

运行发现会报错,因为他要读取.config文件

添加后运行

又报错了,因为没改.config

获取一下ip

bind: Cannot assign requested address
还是有这个错误我重构下代码

这里改成0可以选择所有本地ip

需要注意刚刚改tab时别改makefile因为他是按tab来的

右面是客户端我们可以把这些指令作为参数给程序传入

这个配置文件服务器和客户端都要接受

 运行时没法替换哦

更多功能大家自行尝试吧。

三、程序

服务器程序

#include "file_transfer.h"

void Usage(int argc, char *argv[]);

int main(int argc, char *argv[])
{
	char buf[BUFSIZ] = {};
	struct config conf;
	struct file_transfer *ft = (struct file_transfer *)buf;

	/*参数检查*/
	Usage(argc, argv);

	/*根据config初始化环境*/
	FT_InitConfig(&conf);

	/*准备套接字*/
	int fd = SocketInit(conf.ip, conf.port, false);

	/*执行相应功能*/
	switch(argv[1][1]) {
	case 'g': //获取文件
		FT_GetFile(fd, argv[2], ft);
		break;
	case 'p': //上传文件
		FT_PutFile(fd, argv[2], ft);
		break;
	case 'l'://获取文件列表
		FT_FileList(fd, ft);
		break;
	case 's'://同步文件信息
		FT_Sync(fd, ft);
		break;
	default:
		fprintf(stderr, "Invalid option!\n");
	}
	/*关闭文件描述符*/
	close(fd);

	return 0;
}

void Usage(int argc, char *argv[]){
	if(argc < 2){
		fprintf(stderr, "%s[type]<argment>\n", argv[0]);
		fprintf(stderr, "\t[type]<filename> -g: get file.\n");
		fprintf(stderr, "\t[type]<filename> -p: put file.\n");
		fprintf(stderr, "\t[type] -l: upload file list\n");
		fprintf(stderr, "\t[type] -s: File synchronization.\n");
		exit(EXIT_FAILURE);
	}
	if((argv[1][1] == TYPE_GET || argv[1][1] == TYPE_PUT) && argc < 3){
		fprintf(stderr, "\t[type]<filename> -g: get file.\n");
		fprintf(stderr, "\t[type]<filename> -p: put file.\n");
		exit(EXIT_FAILURE);
	}
}

客户端程序

#include "file_transfer.h"

void Client_Handle(int newfd, struct file_transfer *ft);

int main(int argc, char *argv[])
{
	char buf[BUFSIZ] = {};
	int fd, newfd;
	struct config conf;
	struct file_transfer *ft = (struct file_transfer *)buf;

	/*根据config初始化环境*/
	FT_InitConfig(&conf);

	/*准备套接字*/
	fd = SocketInit(conf.ip, conf.port, true);

	/*循环处理客户端请求*/
	while(1){
		/*接收来自客户端的连接*/
		newfd = accept(fd, NULL, NULL);
		Client_Handle(newfd, ft);
		close(newfd);
	}

	close(fd);

	return 0;
}

void Client_Handle(int newfd, struct file_transfer *ft){
	char *err_str = "Invalid option!";
	/*接收客户端数据*/
	while(Read(newfd, ft, SIZE_FT_TYPE) > 0){
		switch(ft->type){
		case TYPE_GET://处理获取文件的请求
			FT_GetFileHandler(newfd, ft);
			break;
		case TYPE_PUT://处理上传文件的请求
			FT_PutFileHandler(newfd, ft);
			break;
		case TYPE_LIST://处理获取文件列表的请求
			FT_FileListHandler(newfd, ft);
			break;
		case TYPE_SYNC://同步文件信息
			FT_SyncHandler(newfd, ft);
			break;
		default:
			Write(newfd, err_str, strlen(err_str));
		}
	}
}

all:client server

CFLAGS=-g -Wall

client:client.c net.c file_transfer.c

server:server.c net.c file_transfer.c

install:
	cp client ../client/
	cp server ../server/
	cp .config ../server/
	cp .config ../client/

clean:
	-rm client server

相关文章:

  • LVS配置
  • 数据捕手:Python 爬虫在社交媒体的深度探索
  • Eureka高可用性配置:如何实现Eureka集群与故障转移
  • 构建Docker镜像时,遇到从`deb.debian.org`下载软件包速度很慢
  • 【Qt】常用控件QPushButton
  • 1.Linux_常识
  • LLMs之Llama Coder:llama-coder的简介、安装和使用方法、案例应用之详细攻略
  • B站搜索建库架构优化实践
  • 数据分析面试常见50个问题及解答要点
  • Spring Cloud全解析:配置中心之springCloudConfig使用消息总线进行动态刷新
  • 【数据结构-1】二叉树
  • 怎么在网络攻击中屹立不倒
  • Docker详解
  • 贪心算法之重叠区间问题
  • BCLinux8.*构建部署nmap 7.95
  • 网络协议九 应用层 HTTPS
  • Spring Boot常用注解
  • MKS产品PECVD设备中应用PPT课件
  • 「Java 项目详解」API 文档搜索引擎(万字长文)
  • mapstruct学习笔记
  • 竞彩湃|巴萨客场淘汰国际米兰,巴黎双杀阿森纳
  • 被炒热的“高潮针”:超适应症使用,安全性和有效性存疑
  • 山东如意集团及实控人等被出具警示函,此前实控人已被罚十年禁止入市
  • 两个灵魂,一支画笔,意大利艺术伴侣的上海灵感之旅
  • 香港金紫荆广场举行五四升旗礼
  • 国内多景区实行一票游多日:从门票经济向多元化“链式经济”转型