网络安全传输系统(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快速搭建Markdown笔记发布系统

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

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

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

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置