一、产品规划与设计

二、传输子系统

   基本框架:(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. 用Helm部署Kubernetes应用,支持多环境部署与版本回滚

    1 前言 Helm是优秀的基于Kubernetes的包管理器.利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离.现在 ...

  2. 你应该知道的ip地址相关知识

    IP地址是一个网卡在网络世界里的通讯地址,相当于我们家里的门牌号码.这样类比的话,很显然ip地址是唯一的.在windows系统中,我们可以使用 ipconfig 命令查看本机的ip地址相关信息: 图中 ...

  3. Cordova总是弹出Connection to server was Unsuccessful

    开发环境:Cordova版本:6.x 安卓版本:6.0 解决方案一: 在config.xml中添加以下内容: <preference name="LoadUrlTimeoutValue ...

  4. 三个Python自动化测试高效工具的使用总结

    ##Python语言的特点 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号 ...

  5. 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...

  6. P1290 欧几里德的游戏(洛谷)

    欧几里德的两个后代 Stan 和 Ollie 正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数 M 和 N,从 Stan 开始,从其中较大的一个数,减去较小的数的正整数倍,当然, ...

  7. 学会DevOps 能拿多少工资?DevOps 怎么自学?

    落地高薪!DevOps为何受宠? DevOps在近几年的发展势头可谓是迅猛无比,已经有越来越多的企业机构开始尝试落地,从国外的微软谷歌到国内的阿里腾讯,DevOps已经从时髦概念落地最佳实践,进而改变 ...

  8. Ordinary - 官方原版软件下载站

    官网:http://a-1.vip/exe/

  9. 【JVM之内存与垃圾回收篇】程序计数器

    程序计数器 介绍 JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息.CPU 只有把数据装载 ...

  10. es6 Proxy简单使用

    es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...