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

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

  系统程序构架:

客户端 服务器

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. c# Lambda扩展

    扩展类 public static class LinqExtensions { /// <summary> /// 创建lambda表达式:p=>true /// </sum ...

  2. Wiki上的C++哲学

    Philosophy[edit] Throughout C++'s life, its development and evolution has been informally governed b ...

  3. Understand the Qt containers(有对应表)

    Container classes are one of the cornerstones of object-oriented programming, invaluable tools that ...

  4. SQL基础复习1

    一.概述 SQL语言组成:DDL,DCL,DML 二.数据定义 1.模式定义(Schema) Schema这个东西一直感觉不大明白,一直以为就是对表的字段定义则被称为Schema,在复习数据库理论中才 ...

  5. leetcode解答索引一期工程:1 - 40题

    更多内容敬请期待.解法是否最优不能保证,但OJ肯定是能过的. 1: Two Sum 2: Median of Two Sorted Arrays 3: Longest Substring Withou ...

  6. HTML连载12-体验CSS

    一.通过标签来修改标签有哪些缺点: (1)需要记忆那些标签有哪些属性 (2)若该标签没有这个属性,则修改失败 (3)需求变更,需要修改大量的代码 (4)HTML标签及用于添加语义,与我们的定义不相符 ...

  7. spring boot 2.x 系列 —— spring boot 整合 dubbo

    文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(boot-dubbo-common) 四. 服务提供者(boot-dubbo-provider) 4.1 提供方配置 4.2 使用注解@Ser ...

  8. kafka 名词概念

    ProducerConsumerBrokerTopicPartitionConsumer Group分布式 Broker     Kafka集群包含一个或多个服务器,这种服务器被称为brokerTop ...

  9. 计算广告之CTR预测--PNN模型

    论文为:Product-based Neural Networks for User Response Prediction 1.原理 给大家举例一个直观的场景:比如现在有一个凤凰网站,网站上面有一个 ...

  10. ajax入门级

    AJAX AJAX:即异步的JavaScript 和 XML,是一种用于创建快速动态网页的技术: 传统的网页(不使用AJAX)如果需要更新内容,必需重载整个网页面: 使用AJAX则不与要加载更新整个网 ...