一、产品规划与设计
二、传输子系统
基本框架:(1)不带安全功能的传输系统
(2)安全加密功能
part1:基本传输子程序设计(不带安全加密功能)
客户端 | 服务器 |
int main(int argc,char*args[]) { if (argc != 2)//判断传入是否为两个参数 { printf("usage:./client 192.168.1.113(serverip)\n"); exit(0); } strcpy(ipaddr, args[1]);//将服务器地址放入字符串中 //1、建立连接 clink(); //2、实现上传和下载,实现菜单 menu(); //3、关闭连接 close(sockfd); return 0; } int clink() { //1、创建socket sockfd=socket(AF_INET,SOCK_STREAM, 0); //2.1、初始化地址 memset(&sockaddr1,0, 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,
|
void main() { //1、建立与客户端连接 //1.1、创建socket、 sockfd = socket(AF_INET, SOCK_STREAM, 0); //1.2、绑定地址 /*初始化地址,清零*/ bzero(&server_addr,sizeof(structsockaddr_in)); server_addr.sin_family = AF_INET;//协议族 //跟随网络字节序,与所有地址绑定 server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
|
客户端操作菜单 | 服务器命令响应 |
//客户端操作菜单 void menu() { while (1) { 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 '1': //上传文件 printf("Upload File:"); while((c=getchar()) != '\n' && c != EOF); fgets(file_u, 30, stdin);//stdin标准输入 file_u[strlen(file_u) - 1] = '\0'; upload_file(file_u); break; case '2': //下载文件 printf("Download File:"); while((c=getchar()) != '\n' && c != EOF); fgets(file_d,sizeof(file_d),stdin);//stdin标准输入 file_d[strlen(file_d) - 1] = '\0'; download_file(file_d); break; case '3': //退出程序 quit(); break; default: printf("Please input right command\n"); break; } } }
|
void handle(char cmd) { switch (cmd) { case 'U': { //接收文件名 read(new_fd, &namesize, 4); read(new_fd,(void*)&filename, namesize); filename[namesize] = '\0'; //创建文件 fd=open(filename,O_RDWR|O_CREAT, 0777); //接收文件长度 read(new_fd, &filesize, 4); //接收文件内容 while((count=read(new_fd,(void*)buf, 1024))>0) { write(fd, &buf, count); tmpsize += count; if (tmpsize == filesize) break; } close(fd); }break; case 'D': { //接收文件名 read(new_fd, &namesize, 4); read(new_fd, filename, namesize); filename[namesize] = '\0'; //找到并打开文件 fd = open(filename, O_RDONLY); //发送文件长度给客户端 stat(filename, &fstat); write(new_fd,(void*)&(fstat.st_size), 4); //发送文件内容 while((count=read(fd,(void*)buf, 1024)) > 0) 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, 1); //3、发送要上传的文件名 write(sockfd, (void*)&size, 4); write(sockfd, filename, size); //4、发送文件长度 stat(filename, &fstat);//获取文件属性 write(sockfd, (void*)&(fstat.st_size), 4); //5、发送文件 while ((count = read(fd, (void*)buf, 1024)) > 0) //读取来的数据存到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, 1); //2、发送要下载的文件名 write(sockfd, &size, 4); write(sockfd, filename, size); //3、创建接收文件 fd = open(filename, O_RDONLY | O_CREAT, 0777);
|
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(分别指明对应头文件位置、库文件位置)