一、产品规划与设计

二、传输子系统

   基本框架:(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. MySQL和PHP中以整型存储IP地址

    正文:将IP地址以整型存储 一般我们在数据库中会用到ip地址用来查记录的等等,而ip地址是分为四段的,一般是用varchar或char类型存储.但是其实有更好的存储方法就是以整型存储IP地址. 因为c ...

  2. VMWare WorkStation中MacOS虛擬機無法啓動的問題

    關於MacOS虛擬機,在有VMWare重裝,升級以及MacOS更新時,都可能會造成破解補丁失效,因此儅Mac虛擬機無法啓動時,可以嘗試以下操作: 重新運行unlocker208中的win-instal ...

  3. C++中类继承public,protected和private关键字作用详解及派生类的访问权限

    注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/ ...

  4. 重装win7时遇到点小问题

         最近装系统的时候有个头疼的事,事情的起因是这样的,我在工作的时候用的win7,破解的时候各种工具都破解不了,说是有未分配的盘符.并且,当时装的是没更新的win7,工作上要用到ie11只能在w ...

  5. Spring Boot 2.x基础教程:EhCache缓存的使用

    上一篇我们学会了如何使用Spring Boot使用进程内缓存在加速数据访问.可能大家会问,那我们在Spring Boot中到底使用了什么缓存呢? 在Spring Boot中通过@EnableCachi ...

  6. OSCP Learning Notes - Buffer Overflows(2)

    Finding the Offset 1. Use the Metasploite pattern_create.rb tool to create 5900 characters. /usr/sha ...

  7. SpringBoot 接收前端参数的几种方式

    昨天和前端小伙伴在联调是碰到了参数接收不到的错误,我在postman上测试接口是正常的,但是与前端对接时就接受不到参数,请求方式都是get,但是问题就在于json  和 form-data 的区别!这 ...

  8. abp vnext 开发快速入门 1 认识框架

    最近在做一个项目,用的框架是Abp vnext ,不是Abp, 我自己也是刚开始用这个框架来做项目,难免要查资料,这个框架官方有中文文档,可以到官网www.abp.io 去查看,国内也有一些写了相关的 ...

  9. 放弃dagger?Anrdoi依赖注入框架koin

    Koin 是什么 Koin 是为 Kotlin 开发者提供的一个实用型轻量级依赖注入框架,采用纯 Kotlin 语言编写而成,仅使用功能解析,无代理.无代码生成.无反射. 官网地址 优势 依赖注入好处 ...

  10. Python 3爬虫、数据清洗与可视化实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python 3爬虫.数据清洗与可视化实战PDF高清完整版免费下载 提取码: 内容简介 <Python 3爬虫.数据清洗与可视化实战>是一本通过实战教初学者学习采集数据.清洗和组 ...