网络安全传输系统-sprint1传输子系统

一、产品规划与设计

网络安全传输系统-sprint1传输子系统

   二、传输子系统

   基本框架:(1)不带安全功能的传输系统

        (2)安全加密功能

        网络安全传输系统-sprint1传输子系统

part1:基本传输子程序设计(不带安全加密功能)

          网络安全传输系统-sprint1传输子系统

   网络安全传输系统-sprint1传输子系统

   网络安全传输系统-sprint1传输子系统

  

客户端 服务器
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, 

sizeof(sockaddr1)); return 1;

 

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);
server_addr.sin_port = htons(port);
//端口,跟随网上传输 /*绑定地址*/ bind(sockfd, (struct sockaddr*)(&server_addr),
sizeof(struct sockaddr)); //1.3、监听 listen(sockfd, 5); //1.4、等待连接 while (1) { new_fd = accept(sockfd, (struct sockaddr*)
(&client_addr), &sin_size); //2、响应客户端请求 while (1) { read(new_fd, &cmd, 1); if (cmd == 'Q') { close(new_fd); break; } else handle(cmd); } close(new_fd); } close(sockfd); }

 

  

客户端操作菜单  服务器命令响应
//客户端操作菜单
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);
//以只读方式打开文件 //4、接收文件长度 read(sockfd, &filesize, 4); //5、接收文件 while ((count = read(sockfd, (void*)&buf, 1024)) > 0) { 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模型

网络安全传输系统-sprint1传输子系统

    基于ssl收发数据:将write(sockfa,~)-->SSL_write(SSL,~)-->read(sockfd,~)-->SSL_read(SSL,~)

   编译 gcc client.c -o client -lssl (增加ssl库)

  3、服务器端的SSL模型

网络安全传输系统-sprint1传输子系统

    编译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(分别指明对应头文件位置、库文件位置)

 

上一篇:如何用C语言写一个基于服务器和客户端(TCP)


下一篇:写一个简单版本的WebServer-Ver1.0-单进程