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

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

  系统程序构架:

客户端 服务器

TCP建立连接

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

close(socket)

TCP建立连接

handle()-> 根据命令响应

close(socket);

主函数框架:

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

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

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

客户端操作菜单 服务器端命令响应
  1. void menu()
  2. {
  3. while()
  4. {
  5. printf("\n-------- 1. Upload Files -----------\n");
  6. printf("-------- 2. Download Files ----------\n");
  7. printf("--------------- 3. Exit ------------\n");
  8. printf("Please input the Client command:");
  9. command = getchar(); //等待用户输入字符
  10. switch(command)
  11. {
  12. case '1':
  13. { //上传文件
  14. while ((c=getchar()) != '\n' && c != EOF);//获键盘输入文件名
  15. fgets(file_u,,stdin); //stdin 标准输入
  16. upload_file(file_u); //上传
  17. }
  18. case '2':
  19. { //下载文件
  20. while ((c=getchar()) != '\n' && c != EOF);
  21. fgets(file_d,,stdin); //stdin 标准输入
  22. download_file(file_d); //下载
  23. }
    }

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

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

二. 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. 学会了使用qmake -query

    D:\Qt\Qt5.6.2_static_kk\bin>qmake -queryQT_SYSROOT:QT_INSTALL_PREFIX:C:/Qt/Qt5.6.2_static_kkQT_IN ...

  2. Qt 5.6.0 动态编译(VS2013 x86 target xp openssl icu webkit)

    经历了多次延期后,在3月16号,Qt发布了5.6.0版本(全面支持高DPI无疑是一个亮点),从5.6.0版本开始,Qt直接移除了webkit模块,让webengine作为其替代选择,不过webengi ...

  3. QT运行cmd指令(两种办法:QProcess.start然后waitForFinished,运行cmd /c命令)

    QProcess p(); p.start("route");//写入要运行的指令即可 p.waitForStarted(); p.waitForFinished(); qDebu ...

  4. oh my god,写20万数据到Excel只需9秒

    还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到 ...

  5. 使用 Python 识别并提取图像中的文字

    1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...

  6. PHP学习(一)

    // php注释: // 单行注释 /*多行注释 多行注释*/ /** *姓名:李华 *时间:2016年 *内容:文档注释 */ #这是脚本注释--以下是注释代码 /*php的数据类型: 标量类型(4 ...

  7. 由django请求生命周期延伸出的知识点大总结

    django项目搭建见: https://www.cnblogs.com/dongxixi/p/10981577.html django请求生命周期图: 由浏览器发起请求开始 知识点1: 浏览器与服务 ...

  8. Shell学习笔记1》转载自runnoob

    无论是shell 还是bat,都是与操作系统结合非常紧密的东西,所以在此占坑,希望有朝一日能够把这些东西融会贯通,于是在此占坑~ 学习地址:http://www.runoob.com/linux/li ...

  9. Java NIO学习系列三:Selector

    前面的两篇文章中总结了Java NIO中的两大基础组件Buffer和Channel的相关知识点,在NIO中都是通过Channel和Buffer的协作来读写数据的,在这个基础上通过selector来协调 ...

  10. 西安7月21日「拥抱开源,又见.NET:壹周年Party」线下交流活动

    本次活动既是.NET西安社区的第四次线下交流活动,也是.NET西安社区成立一周年庆活动..NET西安社区2018年7月20日成立,经过一年时间的发展,社区共举办过3次大型线下交流活动,社区人数由最初的 ...