一. 基本传输子系统程序设计

  客户端可上传文件至服务器,或下载服务器上的文件

  系统程序构架:

客户端 服务器

TCP建立连接

menu()-> 上传命令、下载命令

close(socket)

TCP建立连接

handle()-> 根据命令响应

close(socket);

主函数框架:

客户端 服务器
int main(int argc, char *args[])
{
if (argc != )
{
printf("usage:./client 192.168.10.18(serverip)");
exit(); //退出
}
strcpy(ipaddr,args[1]); //将服务器地址放入字符串中
//1.建立连接
clink();
//2.输入命令, 实现上传和下载,实现菜单
menu();
//3.关闭连接
close(sockfd);
return ;
}
int clink()
{
//1.创建socket
sockfd = socket(AF_INET, SOCK_STREAM, );//IPv4 /*2.1 初始化地址*/
memset(&sockaddr1,,sizeof(sockaddr1));//清零
sockaddr1.sin_family = AF_INET;//协议族
sockaddr1.sin_addr.s_addr = inet_addr(ipaddr);//
sockaddr1.sin_port = htons(port);//端口,跟随网络传输,
//2.连接服务器
connect(sockfd
,(struct sockaddr *)&sockaddr1,
sizeof(sockaddr1));
return ;
}
int main()
{
//1.1创建socket
sockfd = socket(AF_INET, SOCK_STREAM, ); //IPv4,用于TCP通信
//1.2绑定地址
/*初始化地址*/
bzero(&server_addr,sizeof(struct sockaddr_in));//清零
server_addr.sin_family = AF_INET;//协议族
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//跟随网络传输
server_addr.sin_port = htons(port);//端口,跟随网络传输
/*绑定地址*/
   //1.3监听端口
bind(sockfd,(struct sockaddr *)(&server_addr),
                sizeof(struct sockaddr));
listen(sockfd,); //客户机数目
//1.4等待连接
while()
{ //client_addr保存客户机地址 &sin_size长度的地址
new_fd
= accept(sockfd,(struct sockaddr *)
                    (&client_addr),&sin_size);
//2.响应客户端请求
while()
{
read(new_fd,&cmd,1); //读取操作类型码
if(cmd == 'Q')
{
close(new_fd); break;
}
else
{
handle(cmd);
}
}
close(sockfd);
}
return ;
}

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

  客户端操作菜单及服务器端命令响应:

客户端操作菜单 服务器端命令响应
 void menu()
{
while()
{
printf("\n-------- 1. Upload Files -----------\n");
printf("-------- 2. Download Files ----------\n");
printf("--------------- 3. Exit ------------\n");
printf("Please input the Client command:");
command = getchar(); //等待用户输入字符
switch(command)
{
case '1':
{ //上传文件
while ((c=getchar()) != '\n' && c != EOF);//获键盘输入文件名
fgets(file_u,,stdin); //stdin 标准输入
upload_file(file_u); //上传
}
case '2':
{ //下载文件
while ((c=getchar()) != '\n' && c != EOF);
fgets(file_d,,stdin); //stdin 标准输入
download_file(file_d); //下载
}
}

按照客户端的合适进行设定
//1.接收操作符--->>>第一部曲 --->>>1步
read(new_fd,&cmd,); //读取操作类型码
//2.按照操作符进行命令函数
if(cmd == 'Q')
{ close(new_fd); break;}
else
handle(cmd);
//3.进行正式文件处理--->>>剩下4部曲 void handle(char cmd)
{
switch(cmd)
{
case 'U'://服务器接收
{
read(new_fd~ //接收文件名 --->>>2步
read(new_fd~ //接收文件长度 --->>>3步
fd = open(filename~//创建文件准备接受--->>>4步
write(fd,&buf~ //接收文件内容 --->>>5步
}
case 'D'://服务器传出
{
read(new_fd~ //接收文件名 --->>>2步
fd = open(filename~//打开当前目录文件--->>>3步
write(new_fd~ //发送文件长度 --->>>4步
write(new_fd //发送文件内容 --->>>5步
}
case 'Q'://退出
{
close(new_fd);
break;
}
}
//case "1"  上传文件   5部曲
void upload_file(char *
filename)
{
//1.打开要上传的文件
fd = open(filename,O_RDONLY); //以只读方式打开文件
//2.发送操作符 cmd="U"
write(sockfd,&cmd,);
//3.发送要上传的文件名
write(sockfd,filename,size);
//4.发送文件长度
stat(filename,&fstat); //获取文件属性
write(sockfd,(void *)&(fstat.st_size),);
//5.发送文件
while((count=read(fd,(void *)buf,))>)//读取来的数据存到buf的空间
write(sockfd,&buf,count);
} //case "2" 下载文件 5部曲相同
void download_file(char *filename)
{
//1.发送操作符 cmd="D"
write(sockfd,&cmd,);
//2.发送要下载的文件名
write(sockfd,filename,size);
//3.创建接收文件
fd = open(filename,O_RDONLY|O_CREAT,); //以只读方式打开文件
//4.接收文件长度
read(sockfd,&filesize,);
//5.接收文件
while((count=read(fd,(void *)buf,))>)//读取来的数据存到buf的空间
write(fd,&buf,count);
}

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

二. OpenSSL加密系统

  由于网络传输数据中,易被抓包软件截获。因此运用非对称加密方法(公钥、私钥、数字证书),文件内容+公钥 ->加密系统 ->私钥,方可解密文件。

a)公钥与私钥是配对时候用的;

b)私钥加密的文件同样用对应的公钥解密,而为了区分公钥(防止公钥被偷换,导致私密文件泄露),引入数字证书再加密。

c)数字证书有权威机构发放,包含公钥及持有人信息,无法丢失假冒;

  SSL协议处于应用层协议(HTTP/SMTP)与TCP/IP协议之间,可实现文件加密传输。开源套接字层密码库OpenSSL,包含SSL、密码算法、秘钥证书管理功能等。 

  

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

  移植OpenSSL库:

解压安装文件 -> 配置.config文件,修改交叉工具链arm-linux- -> 编译make,make install,即生成OpenSSL的库函数文件 .a、.so -> 置于/rootfs/lib/目录下,OK!

  OpenSSL通讯模型:基于下列通讯模型优化原始传输子系统程序设计

客户端SSL模型 服务器端SSL模型

初始化SSL ->

(创建套接字、连接服务器) ->

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

初始化SSL ->

公钥私钥数字证书设置 ->

(创建套接字、绑定、等待连接) ->

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

基于SSL收发数据:将write (sockfd,~) ->SSL_write (ssl,~)、read (sockfd,~) ->SSL_read (ssl,~)即可!

再对应产生公钥、私钥:(全部置于服务器目录下)

  # openssl genrsa -out privkey.pem 2048  ->私钥

  # openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095 ->对应产生的公钥

  OpenSSL加密传输子系统程序设计完成,对应产生服务器加密所需的公钥与私钥,分别进行编译即可实现:对上传、下载服务器文件的加密传输。

2-1. 基于OpenSSL的传输子系统实现的更多相关文章

  1. 基于视频压缩的实时监控系统-sprint3采集端传输子系统设计

    由于jpg本来就是编码压缩后的格式,所有无需重复编码 传输子系统步骤:(1)初始化:a.socket(初始化tcp连接):b.将事件添加到epoll中 (2)事件处理:接收到网络包.发送完网络包 st ...

  2. 网络安全传输系统-sprint1传输子系统

    一.产品规划与设计 二.传输子系统 基本框架:(1)不带安全功能的传输系统 (2)安全加密功能 part1:基本传输子程序设计(不带安全加密功能) 客户端 服务器 int main(int argc, ...

  3. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...

  4. 基于OpenSSL的PKI的PKI数字证书系统实现

    本篇主要介绍了基于OpenSSL的PKI的PKI数字证书系统实现,利用OpenSSL建立一个CA中心的详细解决方案和建立的具体步骤. 1.PKI数字证书系统设计 PKI数字证书系统主要包括证书颁发机构 ...

  5. 基于RMI服务传输大文件的完整解决方案

    基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...

  6. Linux下c基于openssl生成MD5的函数

    Linux下openssl提供了一系列哈希及加密的函数,如果调用openssl提供的MD5函数生成任意字符串的MD5呢?下面提供了一段代码实现Linux下c字符串生成md5的函数. 具体代码: 1 2 ...

  7. 基于OpenSSL的HTTPS通信C++实现

      HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...

  8. 基于OpenSSL的RSA加密应用(非算法)

    基于OpenSSL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  9. Dealing with a Stream-based Transport 处理一个基于流的传输 粘包 即使关闭nagle算法,也不能解决粘包问题

    即使关闭nagle算法,也不能解决粘包问题 https://waylau.com/netty-4-user-guide/Getting%20Started/Dealing%20with%20a%20S ...

随机推荐

  1. 为新项目添彩的 10+ 超有用 JavaScript 库

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  2. Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面

    一.应用程序中文化 1).Qt安装目录下有一个目录translations/,在此目录下有qt_zh_CN.ts和 qt_zh_CN.qm把它们拷贝到你的工程目录下. 2).在main函数加入下列代码 ...

  3. android核心系列--2,关于任务栈(task)

    一,任务 任务是由界面组件组成的一个栈,这些界面组件可以来自多个进程,多个应用,为共同完成一项任务而存在,比如写邮件时会用到邮件应用和联系人应用中的界面组件,这些界面组件在同一个任务中运行. 二,界面 ...

  4. Google C++测试框架系列入门篇:第二章 开始一个新项目

    上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...

  5. Laravel:php artisan key:generate三种报错解决方案,修改默认PHP版本(宝塔面板)

    为了兼容N多个网站,服务器上有3个PHP版本5.3/5.6/7.2.宝塔默认为5.3,但是laravel5.7并不支持,所以在创建线上 .env 环境配置文件,初始化应用配置时候报错了. cp .en ...

  6. 宜信开源|数据库审核软件Themis的规则解析与部署攻略

    一.介绍 Themis是宜信公司DBA团队开发的一款数据库审核产品,可帮助DBA.开发人员快速发现数据库质量问题,提升工作效率.其名称源自希腊神话中的正义与法律女神.项目取此名称,寓意此平台对数据库质 ...

  7. Zookeeper详解-伪分布式和集群搭建(八)

    说到分布式开发Zookeeper是必须了解和掌握的,分布式消息服务kafka .hbase 到hadoop等分布式大数据处理都会用到Zookeeper,所以在此将Zookeeper作为基础来讲解. Z ...

  8. React躬行记(2)——JSX

    JSX既不是字符串,也不是HTML,而是一种类似XML,用于描述用户界面的JavaScript扩展语法,如下代码所示.在使用JSX时,为了避免自动插入分号时出现问题,推荐在其最外层用圆括号包裹,并且必 ...

  9. Python自学day-6

    一.编程范式       编程:程序员用特定的语法.数据结构和算法告诉计算机如何执行任务的过程.实现任务有很多不同的方式,根据编程方式的特点进行归纳总结出来的编程方式类别,就叫编程范式.大多数语言只支 ...

  10. .NET开发框架(三)-高可用服务器端设计

    我们对框架功能作了简述,演示视频请点击 这里查看 ,若需要查看更多此框架的技术文章,请关注.NET框架学苑公众号! 本章节,我们专门讲解一下,如何在Window服务器下,设计高可用的框架. 我们的框架 ...