一、产品规划与设计

二、传输子系统

   基本框架:(1)不带安全功能的传输系统

        (2)安全加密功能

part1:基本传输子程序设计(不带安全加密功能)

客户端 服务器
int main(int argc,char*args[])
{
if (argc != )//判断传入是否为两个参数
{
printf("usage:./client 192.168.1.113(serverip)\n");
exit();
}
strcpy(ipaddr, args[]);//将服务器地址放入字符串中
//1、建立连接
clink();
//2、实现上传和下载,实现菜单
menu();
//3、关闭连接
close(sockfd);
return ;
} int clink()
{
//1、创建socket
sockfd=socket(AF_INET,SOCK_STREAM, ); //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 ;
void main()
{
//1、建立与客户端连接
//1.1、创建socket、
sockfd = socket(AF_INET, SOCK_STREAM, );
//1.2、绑定地址
/*初始化地址,清零*/
bzero(&server_addr,sizeof(structsockaddr_in));
server_addr.sin_family = AF_INET;//协议族
//跟随网络字节序,与所有地址绑定
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
//端口,跟随网上传输
/*绑定地址*/
bind(sockfd, (struct sockaddr*)(&server_addr),
sizeof(struct sockaddr));
//1.3、监听
listen(sockfd, );
//1.4、等待连接
while ()
{ new_fd = accept(sockfd, (struct sockaddr*)
(&client_addr), &sin_size);
//2、响应客户端请求
while ()
{
read(new_fd, &cmd, );
if (cmd == 'Q')
{
close(new_fd);
break;
}
else
handle(cmd);
}
close(new_fd);
}
close(sockfd);
}
客户端操作菜单  服务器命令响应
//客户端操作菜单
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 '':
//上传文件
printf("Upload File:");
while((c=getchar()) != '\n' && c != EOF);
fgets(file_u, , stdin);//stdin标准输入
file_u[strlen(file_u) - ] = '\0';
upload_file(file_u);
break;
case '':
//下载文件
printf("Download File:");
while((c=getchar()) != '\n' && c != EOF);
fgets(file_d,sizeof(file_d),stdin);//stdin标准输入
file_d[strlen(file_d) - ] = '\0';
download_file(file_d);
break;
case '':
//退出程序
quit();
break;
default:
printf("Please input right command\n");
break;
}
}
}
void handle(char cmd)
{
switch (cmd)
{
case 'U': {
//接收文件名
read(new_fd, &namesize, );
read(new_fd,(void*)&filename, namesize);
filename[namesize] = '\0';
//创建文件
fd=open(filename,O_RDWR|O_CREAT, );
//接收文件长度
read(new_fd, &filesize, );
//接收文件内容
while((count=read(new_fd,(void*)buf, ))>)
{
write(fd, &buf, count);
tmpsize += count;
if (tmpsize == filesize)
break;
}
close(fd);
}break;
case 'D': {
//接收文件名
read(new_fd, &namesize, );
read(new_fd, filename, namesize);
filename[namesize] = '\0';
//找到并打开文件
fd = open(filename, O_RDONLY);
//发送文件长度给客户端
stat(filename, &fstat);
write(new_fd,(void*)&(fstat.st_size), );
//发送文件内容
while((count=read(fd,(void*)buf, )) > )
write(new_fd, &buf, count);
close(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, (void*)&size, );
write(sockfd, filename, size);
//4、发送文件长度
stat(filename, &fstat);//获取文件属性
write(sockfd, (void*)&(fstat.st_size), );
//5、发送文件
while ((count = read(fd, (void*)buf, )) > )
//读取来的数据存到buf空间,只有当count>0才将buf数据发送给服务器
write(sockfd, &buf, count);
close(fd);
}
//case'2'下载文件(5步曲)
void download_file(char* filename)
{
//1、发送操作符 cmd="D"
write(sockfd, (void*)&cmd, );
//2、发送要下载的文件名
write(sockfd, &size, );
write(sockfd, filename, size);
//3、创建接收文件
fd = open(filename, O_RDONLY | O_CREAT, );
//以只读方式打开文件
//4、接收文件长度
read(sockfd, &filesize, );
//5、接收文件
while ((count = read(sockfd, (void*)&buf, )) > )
{
write(fd, &buf, count);
tmpsize += count;
if (tmpsize == filesize)
break;
}
close(fd);
}

part2:OpenSSL加密功能

     移植OpenSSL库

  step1:解压安装文件

  step2:配置./config,新建_install用于存放库文件

      ../config  no-asm shared –prefix=/home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install

  step3:修改Makefile交叉工具链       

       cc=arm-linux-gcc

          AR=arm-linux-ar $(ARFLAGS) r

       RANLIB=arm-linux-ranlib

  step4:编译make、 make install

  step5:将_install/lib/目录中.a、.so库文件复制到/rootfs/lib/,安装openssl库完成

part3:加密传输优化

   1、Openssl编程模型

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

初始化SSL(初始化、载入算法、

错误信息、产生ssl环境) ->

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

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

初始化SSL ->

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

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

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

   

  2、客户端下的ssl模型

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

  编译 gcc client.c -o client -lssl (增加ssl库)

  3、服务器端的SSL模型

  编译gcc server.c -o server -lssl

  4、产生对应的公钥、私钥(全置于服务器/server/目录下)

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

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

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

    [notes]:下载到开发板上的程序需要编译产生能在开发板上运行的client

        arm-linux-gcc -I /home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install/include/ -L

          /home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install/lib/ client.o -o client -lssl -lcrypto(分别指明对应头文件位置、库文件位置)

网络安全传输系统-sprint1传输子系统的更多相关文章

  1. 阶段3-团队合作\项目-网络安全传输系统\sprint1-传输子系统设计\第3课-加密传输优化

    对之前的传输系统进行加密,使之成为加密的网络传输系统 客户端编程模型 通过以上模型对传统的TCP传输模型进行优化 首先完成初始化工作,它是要在创建socket之前完成 主要是以上四个函数的实现,那么这 ...

  2. 2-1. 基于OpenSSL的传输子系统实现

    一. 基本传输子系统程序设计 客户端可上传文件至服务器,或下载服务器上的文件 系统程序构架: 客户端 服务器 TCP建立连接 menu()-> 上传命令.下载命令 close(socket) T ...

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

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

  4. 网络安全传输系统-sprint3账号管理子系统设计

    part1:sqlite嵌入式数据库移植 1.数据库系统构成:访问数据库应用-->管理数据库系统-->数据库存储(自上而下) 2.数据库中数据以表的形式而存在.表与表之间可能存在关联关系( ...

  5. 阶段3-团队合作\项目-网络安全传输系统\sprint3-账号管理子系统设计\第2课-账号管理子系统设计

    账号管理子系统的设计 客户端需要登录到服务器,在服务器去查询数据库,进行验证该用户. 打开client.c文件 编译之 把它复制到开发板里面去 这个程序是在本地数据库测试的!!!!!!!!!!!!!! ...

  6. 阶段3-团队合作\项目-网络安全传输系统\sprint2-线程池技术优化

    之前问题的存在,之前只是用一个客户端在与服务器进行连接,当多个客户端进行连接的时候会连接不上处于等待状态,说明以前我们的服务器只能同时处理一个请求,故需要修改 服务器: 单发:初始化--等待客户端连接 ...

  7. 阶段3-团队合作\项目-网络安全传输系统\sprint0-产品规划与设计\第2课-产品功能模型设计

  8. 网络安全传输系统-sprint2线程池技术优化

    part1:线程池工作原理 为满足多客户端可同时登陆的要求,服务器端必须实现并发工作方式.当服务器主进程持续等待客户端连接时,每连接上一个客户端都需一个单独的进程或线程处理客户端的任务.但考虑到多进程 ...

  9. SAP传输系统TMS、开发类、传输请求

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. day23 常用模块(中)

    目录 一.json&pickle模块 1 什么是序列化 2 为什么要序列化 2.1 持久保存状态 2.2 跨平台数据交互 3 如何序列化 二.shelve模块 三.configparser模块 ...

  2. leetcode_1-两数之和_javascript

    题目 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  3. Java Properties集合基础解析

    Java Properties集合基础解析 本期学习的properties集合是项目中经常用到的操作 什么是Properties集合? java.util.Properties集合继承于Hashtab ...

  4. vue : 对 vue-class-component 的个人理解

    vue-class-component 是 vue 的官方库,作用是用类的方式编写组件. 这种编写方式可以让.vue文件的js域结构更扁平,并使vue组件可以使用继承.混入等高级特性. 简单的示例: ...

  5. 【JVM之内存与垃圾回收篇】堆

    堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的 ...

  6. 04 CMD规范基础使用详解

    CMD模块规范 1.1 CMD规范说明 专门用于浏览器端,并且模块的加载是异步的,而且只有模块使用时才会加载执行: CMD规范的语法类似于Commonjs + AMD --定义模块使用AMD语法,暴露 ...

  7. C#串模板

    c# 6.0 的语言特性,功能类似string.formate,更方便的地方在于不要像format一样使用索引,可以直接使用变量. 使用方法如下: string name = "zhangs ...

  8. Lua中 pairs和ipairs的区别

    Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...

  9. AttributeError: module 'time' has no attribute 'clock'

    在python3.8中flask项目运行报错: AttributeError: module 'time' has no attribute 'clock'解决方案 主要原因是因为python3.8中 ...

  10. python学习笔记1 -- 函数式编程之高阶函数 filter

    filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...