网络安全传输系统(2)-框架搭建

2024-08-31 06:58

本文主要是介绍网络安全传输系统(2)-框架搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

框架搭建需要实现文件上传和下载等的基本功能

网络协议采用TCP协议,通过TCP协议传输文件打算采取如下的顺序(针对客户机而言):

1、先发送命令,1代表上传,2代表下载,3代表退出

2、发送文件名

3、发送文件长度

4、发送文件数据

 

因此对于上传文件客户机和服务器分别遵循如下顺序

客户机:

1、获取需要上传的文件名

2、打开文件

3、发送命令1

4、发送文件名

5、发送文件长度

6、发送文件数据

7、关闭文件

服务器:

1、接收命令,根据命令做相应的处理

2、接收文件名

3、创建/打开文件

4、接收文件长度

5、接收文件数据

6、关闭文件

 

对应下载文件和这个过程类似。同时对于客户机而言还有打印菜单等需求。在退出时客户机和服务器都需要做出相应的操作。

源代码如下:

客户机:

 

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include <sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>#define port 3333char ipaddr[15];
int sockfd;
struct sockaddr_in sockaddr;
void linkS()
{//创建socketif((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket");_exit(0);}//连接memset(&sockaddr,0, sizeof(sockaddr));sockaddr.sin_family = AF_INET;sockaddr.sin_port = htons(port);sockaddr.sin_addr.s_addr = inet_addr(ipaddr);if(connect(sockfd,(struct sockaddr *)&sockaddr,sizeof(sockaddr)) == -1){perror("connect");_exit(0);}
}void upload_file(char *filename)
{int fd;char cmd = 'U';int FileNameSize = strlen(filename);char buf[1024];int count=0;struct stat fstat;//打开文件fd = open(filename,O_RDONLY);//发送命令write(sockfd,&cmd,1);//发送文件名write(sockfd,(void *)&FileNameSize,4);write(sockfd,filename, FileNameSize);//发送文件长度if((stat(filename,&fstat)) == -1)return;write(sockfd,(void *)&fstat.st_size,4);//发送文件数据while((count = read(fd,(void *)buf,1024)) > 0){write(sockfd,buf,count);	}//关闭文件close(fd);
}void download_file(char *filename)
{int fd;char cmd = 'D';char buf[1024];int FileNameSize = strlen(filename);int filesize=0,count=0,totalrecv=0;//发送命令write(sockfd,&cmd,1);//发送文件名write(sockfd,(void *)&FileNameSize,4);write(sockfd,filename,FileNameSize);//打开并创建文件if((fd = open(filename,O_RDWR|O_CREAT)) == -1){perror("open:");_exit(0);	}//接收数据read(sockfd,&filesize,4);while((count = read(sockfd,(void *)buf,1024)) > 0){write(fd,buf,count);totalrecv += count;if(totalrecv == filesize)break;	}//关闭文件close(fd);
}void quit()
{char cmd = 'Q';//发送命令write(sockfd,(void *)&cmd,1);//清屏system("clear");//退出_exit(0);
}
void menu()
{char cmd;char c;char file_u[30];char file_d[30];while(1){printf("\n------------------------------  1.Upload Files  ------------------------------\n");printf("------------------------------  2.Download Files  ------------------------------\n");printf("------------------------------      3.Exit   ------------------------------------\n");printf("Please input the Client command:");cmd = getchar();	switch(cmd){case '1':{printf("Upload Files:");//输入文件名while((c = getchar()) != '\n' && c != EOF);fgets(file_u, 30, stdin);file_u[strlen(file_u)-1] = '\0';//上传文件upload_file(file_u);}break;	case '2':{printf("Download Files:");//输入文件名while((c = getchar()) != '\n' && c != EOF);fgets(file_d, 30, stdin);file_d[strlen(file_d)-1] = '\0';//下载文件download_file(file_d);}break;	case '3':{//退出quit();break;}break;	default:{printf("Please input right command!");	}break;	}}	
}
int main(int argc, char *args[])
{if(argc != 2){printf("format error: you mast enter ipaddr like this : client 192.168.0.6\n");_exit(0);	}strcpy(ipaddr,args[1]);//建立连接linkS();//打印菜单menu();//结尾操作close(sockfd);return 0;	
}

 

 

服务器:

 

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>#define port 3333int sockfd,newfd;
struct sockaddr_in sockaddr;
struct sockaddr_in client_addr;
int sin_size;void handle(char cmd)
{char filename[30]={0};int FileNameSize=0;int fd;int filesize=0;int count=0,totalrecv=0;char buf[1024];struct stat fstat;switch(cmd){case 'U':{//接收文件名read(newfd, &FileNameSize, 4);read(newfd, (void *)filename, FileNameSize);filename[FileNameSize]='\0';//创建文件if((fd = open(filename,O_RDWR|O_CREAT)) == -1){perror("creat:");_exit(0);	}//接收文件长度read(newfd, &filesize, 4);//接收文件while((count = read(newfd,(void *)buf,1024)) > 0){write(fd,&buf,count);totalrecv += count;if(totalrecv == filesize)break;	}			//关闭文件close(fd);}break;case 'D':{//接收文件名read(newfd, &FileNameSize, 4);read(newfd, filename, FileNameSize);filename[FileNameSize]='\0';//打开文件if((fd = open(filename,O_RDONLY)) == -1){perror("creat:");_exit(0);	}//发送文件包括文件长度if((stat(filename,&fstat)) == -1)return;write(newfd,&fstat.st_size,4);while((count = read(fd,(void *)buf,1024)) > 0){write(newfd,&buf,count);	}close(fd);}break;	}
}
int main()
{char cmd;//建立连接//参加socketif((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket:");_exit(0);	}memset(&sockaddr,0, sizeof(sockaddr));sockaddr.sin_family = AF_INET;sockaddr.sin_port = htons(port);sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定地址if(bind(sockfd,(struct sockaddr *)&sockaddr,sizeof(sockaddr)) == -1){perror("bind:");_exit(0);	}//监听if(listen(sockfd,10) == -1){perror("listen");	}while(1){//连接if((newfd = accept(sockfd, (struct sockaddr *)(&client_addr),&sin_size)) == -1){perror("accept:");	_exit(0);}//处理事件while(1){read(newfd,&cmd,1);if(cmd == 'Q'){break;	}else{handle(cmd);	}}close(newfd);}	close(sockfd);return 0;
}

 

更多Linux资料及视频教程点击这里

 

 

 

 

 

这篇关于网络安全传输系统(2)-框架搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是