一、产品规划与设计

二、传输子系统

   基本框架:(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. Scala 面向对象(十二):嵌套类

    在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构.如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样. 嵌套类类似于Java中的内部类. Scala嵌套类的使用1 请编写程序, ...

  2. scrapy 基础组件专题(八):scrapy-redis 框架分析

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  3. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

  4. 空间金字塔池化 ssp-net

    <Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...

  5. 在运行vue项目时,执行npm install报错小记

    在运行vue项目时,执行npm install 报错,导致后续的执行报各种错误,根据报错,尝试了网上的各种办法,最后发现时网络问题下载失败导致,解决办法: 安装cnpm==>npm instal ...

  6. 软件测试工程师入门——Linux【使用说明书】

    先来说一下linux是什么? linux 是一个开源.免费的操作系统,其稳定性.安全性.处理多并发已经得到业界的认可,目前很多中性,大型甚至是巨型项目都在使用linux. linux 内核:redha ...

  7. Oracle RACDB 增加、删除 在线重做日志组

    Oracle RACDB 增加.删除 在线重做日志组 select * from v$log;select * from v$logfile ; ----删除日志组:alter database dr ...

  8. Ubuntu18.04安装GitLab搭建私有仓库服务器过程笔记

      百度了很多资料结果折腾很久还没安装成功,索性就直接上官网找文档参考顺利搭建完成 因为有2台服务器做练习,总结了2种安装方式提供参考:第一种官网安装方式,第二种国内镜像安装方式(建议采用第二种) 第 ...

  9. 少儿编程:python趣味编程第一课

    本文仅针对8-16岁的青少年,所以流程是按如何去教好中小学生走的,并不适合成人找工作学习,因为进度也是按照青少年走的 大家好,我是C大叔,从事少儿编程行业三年有余(2016年从事少儿编程行业,少儿编程 ...

  10. PJzhang:python基础入门的7个疗程-seven

    猫宁!!! 参考链接:易灵微课-21天轻松掌握零基础python入门必修课 https://www.liaoxuefeng.com/wiki/1016959663602400 第19天:开源模块 数据 ...