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

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

  系统程序构架:

客户端 服务器

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. 开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石

    微信于2013年开源的ibco库,是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上.libco在2013年的时候作为腾讯六大开源项目首次开源,ibco支持后台敏捷 ...

  2. const char*和const char[]怎么识别?

    #include <iostream> using namespace std; template<typename T> class _ischararray_; templ ...

  3. 插件化二(Android)

    插件化二(Android) 上一篇文章<插件化一(android)>里大概构思了下插件加载与校验的流程和一些大体设计,这次就具体展开,在<动态加载与插件化>里提到以apk形式开 ...

  4. 【Linux】Linux下设备网卡以及硬件管理等

    这是Linux下网络硬件管理的基础知识,虽然平时用到的可能比软件的少一点,但是作为基础命令,还是需要记住,以免用时又得查询. 本文参考官方文档:https://wiki.ubuntu.com.cn/% ...

  5. Codility---FrogRiverOne

    Task description A small frog wants to get to the other side of a river. The frog is initially locat ...

  6. java代码块牛刀小试

    牛刀小试1. 试一把静态代码块.实例化代码块和构造函数的执行顺序 public class People { public static int num = 0;//静态变量初始化 String na ...

  7. Mui a 链接失效的解决办法

    方法一: mui('body').on('tap', 'a', function() { if(this.href){   //判断链接是否存在 location.href = this.href; ...

  8. auth-booster配置和使用(yii1.5)

    auth-booster这个是一个yii框架扩展中的一个模块.是非常好用的(但是里面的说明都是英文的,所以国人用还需要改一点里面的汉化) 1.下载auth-booster这个:http://www.y ...

  9. 如何成长为一名合格的web架构师?

    写代码要经历下面几个阶段.  一 .你必须学习面向对象的基础知识,如果连这个都忘了,那你的编程之路注定是在做原始初级的重复! 很多程序员都知道类.方法.抽象类.接口等概念,但是为什么要面向对象,好处在 ...

  10. GBDT--原来是这么回事(附代码)

    1. 解释一下GBDT算法的过程 GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,使用的是Boosting的思想. 1.1 Boosting思想 Bo ...