多线程版文件加密系统

客户端发送文件到服务器 ,服务器接收后加密文件并备份源文件,发送加密后文件至客户端

//客户端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>


#define MAXLINE 50
/*
void sendstring(int sockfd)
{
    int n, sum = 0;
    char sendline[MAXLINE] = {'\0'};
    while (1) {
        printf("input data:\n");
        fgets(sendline, MAXLINE, stdin);
        sendline[strlen(sendline)-1]='\0';
        if ( send(sockfd, sendline, strlen(sendline), 0) < 0)
        {
            printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
            exit(0);
        }
        printf("%d\n",strlen(sendline));
        memset(sendline, 0, MAXLINE);
    }
}
*/
void sendfile(int sockfd)
{
    int n = 0, sum = 0, len, t;
    char sendline[MAXLINE] = {0};
    char filename[50] = {0};
    printf("input filename:");
    scanf("%s", filename);
    int srcfd = open(filename, O_RDONLY);
    printf("filename=%s,size=%d\n", filename, strlen(filename) );
    //发送要加密的文件名
    //filename[strlen(filename)]='\n';
    if ( send(sockfd, filename, strlen(filename), 0) < 0)
    {
        printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }


    memset(filename, 0, 50);
    len = recv(sockfd, sendline, MAXLINE, 0);
    sprintf(filename, "%s_%s", sendline, "srv_enc");
    printf("jiamihou filename:%s\n", filename );
    //发送要加密的文件
    len = 0;
    int clientfd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);
    
    while ((n = read(srcfd, sendline, MAXLINE)) > 0)
    {
        if ( send(sockfd, sendline, n , 0) < 0)
        {
            printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
            exit(0);
        } 
        sum += n;
        printf("send==%s\n", sendline);
        memset(sendline, 0, MAXLINE);




        n = recv(sockfd, sendline, MAXLINE, 0); //向客户端发送回应数据
        write(clientfd, sendline, n );


        printf("client==%s\n", sendline);
        memset(sendline, 0, MAXLINE);
        len += n;
    }
     if(len>50)   
   {
    n = recv(sockfd, sendline, MAXLINE, 0); //向客户端发送回应数据
    write(clientfd, sendline, n );
    close(clientfd);
    len += n;
   }
    printf("send  ok!==sum=%d \n", sum);
    send(sockfd, "ok", 2, 0);




    //创建加密后的文件




    printf("receive ok,lrn=%d\n", len);
    close(clientfd);
    close(srcfd);
}


int main(int argc, char** argv)
{
    int    sockfd, n, rec_len;
    char    recvline[MAXLINE], sendline[MAXLINE];
    char    buf[MAXLINE];
    struct sockaddr_in    servaddr;




    if ( argc != 2) {
        printf("usage: ./client <ipaddress>\n");
        exit(0);
    }




    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }




    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8000);
    if ( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
        printf("inet_pton error for %s\n", argv[1]);
        exit(0);
    }




    if ( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
        printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }




    printf("send msg to server: \n");




    sendfile(sockfd);
    //sendstring(sockfd);


    /* fgets(sendline, 4096, stdin);
     if ( send(sockfd, sendline, strlen(sendline), 0) < 0)
     {
         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
         exit(0);
     }
     int len = strlen(sendline);
     sendline[len - 1] = '\0';
     printf("%s\n", sendline );
     if (strcmp(sendline, "exit") == 0) exit(0);
     if ((rec_len = recv(sockfd, buf, MAXLINE, 0)) == -1) {
         perror("recv error");
         exit(1);
     }
     buf[rec_len]  = '\0';
     printf("Received : %s ", buf);  */




    close(sockfd);
    exit(0);
}


//服务器

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <pthread.h>
#define DEFAULT_PORT 8000
#define MAXLINE 50
struct sockaddr_in servaddr, cliaddr;
/*
void* receivefile(void *arg)
{
    int connect_fd = *((int *)arg);
    int n;
    char buff[MAXLINE] = {'\0'};
    while (1)
    {
        //接受客户端传过来的数据
        n = recv(connect_fd, buff, MAXLINE, 0);
        //向客户端发送回应数据
        if (send(connect_fd, "Hello,you are connected!\n", 26, 0) == -1)
        perror("send error");
        printf("recv msg from client n=%d :%s\n", n, buff);
        if(strcmp(buff,"exit")==0) exit(0);
        memset(buff, 0, MAXLINE);
    }
    close(connect_fd);
    free(arg);
    return (void *)0;
}
*/
void* receivefile(void *arg)
{
    int connect_fd = *((int *)arg);
    int n = 0, sum = 0, len, i = 0;
    char buff[MAXLINE] = {0};
    char str[30] = {0};
    char enc[30] = {0};
    //接收要加密的文件名
    len = recv(connect_fd, buff, MAXLINE, 0);


    //printf("--%s--%d\n", buff, len);
    printf("filename=%s,size=%d\n", buff, len );
    sprintf(str, "%s_%s", buff, "bck_enc");


    sprintf(enc, "%s_%s", buff, "src");


    int dstfd = open(enc, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);


    int encryptfd = open( str, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0777);


    memset(buff, 0, MAXLINE);


    send(connect_fd, str, len, 0);
    while (1)
    {
        //接受客户端传过来的数据


        n = recv(connect_fd, buff, MAXLINE, 0); //向客户端发送回应数据
        if (strcmp(buff, "ok") == 0)break;
        write(dstfd, buff, n );
        i = 0;
        while (i < n )
        {
            buff[i] ^= 0x88;
            i++;
        }
        write(encryptfd, buff, n );


        send(connect_fd, buff, n, 0);


        memset(buff, 0, MAXLINE);
        sum += n;
    }
    close(dstfd);
    close(encryptfd);
    //encrypt();


    printf("recv msg from client  sum=%d\n", sum);


    //发送加密后的文件名
    //send(connect_fd,str,len,0);
    //发送加密后的文件


//不能发送
    /*  sum=0;
      lseek(encryptfd,0L,SEEK_SET);
      while ((n = read(encryptfd,buff, MAXLINE)) > 0)
      {
          if ( send(connect_fd,buff,n , 0) < 0)
          {
              printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
              exit(0);
          }
          memset(buff, 0, MAXLINE);
          sum+=n;
       }
    */


    printf("send ok sum=%d\n", sum);
    send(connect_fd, "ok", 2, 0);
    close(encryptfd);
    //close(connect_fd);
    getchar();
    free(arg);
    return (void *)0;
}




int main(int argc, char** argv)
{
    
    int    socket_fd, connect_fd;
    struct sockaddr_in     servaddr;
    char    buff[4096];
    //初始化Socket
    int i, n;
    pid_t pid;
    socklen_t cliaddr_len;
    //pthread
    int *lptr;
    pthread_t clid;
    pthread_attr_t attr;
    //初始化
    pthread_attr_init(&attr);
    //设置分离属性
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);




    if ( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
        printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }
    //初始化
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
    servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT


    //将本地地址绑定到所创建的套接字上
    if ( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) {
        printf("bind socket error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }
    //开始监听是否有客户端连接
    if ( listen(socket_fd, 10) == -1) {
        printf("listen socket error: %s(errno: %d)\n", strerror(errno), errno);
        exit(0);
    }
    printf("======waiting for client's request======\n");


    //阻塞直到有客户端连接,不然多浪费CPU资源。
    while (1)
    {
        cliaddr_len = sizeof(cliaddr);
        lptr = (int *)malloc(sizeof(int));
        *lptr = accept(socket_fd, (struct sockaddr *)&cliaddr, &cliaddr_len);
        pthread_create(&clid, &attr, receivefile, (void *)lptr);
    }


    close(socket_fd);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目如下: 编写程序实现文件上传功能。 有能力的同学可以自行设计文件下载功能,但是本次作业不要求。 服务器端: 要求能运行如下程序: java FileServer port foldername 实际的运行命令可能为 java FileServer 1234 d:\\share 解释如下: port为服务器开放的网络连接端口 foldername为服务器上某个文件夹,该文件夹存放客户端上传的文件。 客户端: 要求能运行如下程序: java FileClient server_ip port afile java FileClient server_ip port afolder 实际的运行命令可能为 java FileClient 127.0.0.1 1234 d:\\abc\\a.docx java FileClient 127.0.0.1 1234 d:\\abc 上面的程序运行完毕后,在服务器的文件下将看到客户端上传的文件a.docx 能看到客户端上传的文件夹abc,并且abc文件夹下的所有文件和子文件夹都上传到了服务器。 假设客户端有文件夹d:\\abc,该文件夹有子文件若干,有子文件夹若干。 客户端能够将某个文件上传到服务器,也可以将某个文件夹连同文件夹下的所有子文件和子文件夹 全部上传到服务器,服务器端保存客户端的文件夹结构和文件信息。 文件传输过程要求实现内容加密加密算法任意,可以是DES,AES,RSA之类的算法都可以。 注意:是文件在传输过程中加密,到服务器保存的时候,要求和客户端的文件内容一样, 服务器端的文件并不需要加密。 要求支持多客户端并发上传文件,不考虑文件名冲突,假设多个客户端同时上传的文件没有重名现象。 必须使用多线程编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值