一、产品规划与设计

二、传输子系统

   基本框架:(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. java 基本语法(十六)Lambda (三)函数式接口

    方法引用1.理解:方法引用可以看做是Lambda表达式深层次的表达.换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法. 2.使用情境:当要传递给Lam ...

  2. java 基础(一) Sublime Text3搭建Java编译环境(Windows系统)

    1. 首先配置好Java环境变量我的jdk版本是1.8.0_191,存放目录是C:\Program Files\Java,因此添加以下环境变量 (1)系统变量→新建 JAVA_HOME 变量,变量值为 ...

  3. 微信小程序接口封装、原生接口封装、request、promise封装

    相信大家在做微信小程序的时候会有很多地方需要调用接口,就和pc以及手机端一样,多个页面多次调用会有很多状态,那为了节省大家的开发时间就会需要给请求的接口做一些简单封装,便于开发,在这里我用了两个js, ...

  4. Python 爬取异步加载的数据

    在我们的工作中,可能会遇到这样的情况:我们需要爬取的数据是通过ajax异步加载的,这样的话通过requests得到的只是一个静态页面,而我们需要的是ajax动态加载的数据! 那我们应该怎么办呢??? ...

  5. C/C++中的 if(指针变量) 和 if(!指针变量)

    目录 if(指针变量) 代码演示 if(指针变量) 解读代码 if(!指针变量) 解读代码 总结 替代方案.推荐写法!!!!! if(指针变量) 当把一个指针作为条件表达式时,所要判断的条件实际上就是 ...

  6. OSCP Learning Notes - Exploit(9)

    Tool: Metasploit 1. Start the msfconsole tool. msfconsole 2.Search ssh related modules. 3.Use the &q ...

  7. 项目管理:如何显性管理并提升Story分解能力

    引言: 在“DevOps能力之屋(CapabilitiesHouse of DevOps)”中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力.华为云DevClou ...

  8. 【NET开发】图片处理类-仿照七牛云图片处理功能

    介绍 Sop.Common.Img **请看 七牛云的图片处理功能介绍文档了解本项目功能 ** 此项目是有https://github.com/Sopcce/.Net-Common-Utility中的 ...

  9. Linux cut 命令详解

    cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中.我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来. 在本 ...

  10. [jvm] -- 监控和调优常用命令工具篇

    jps:java版本的ps,查看进程的信息 jps -l 输出jar包路径,类全名 jps -m 输出main参数 jps -v 输出JVM参数 jinfo:是用来查看JVM参数和动态修改部分JVM参 ...