个人项目—-基于TCP的文件传输系统

目录

主体功能

程序使用方法

1、运行客户端​编辑

2、运行服务器

3、登录

4、注册

5、程序命令解析

6、传输文件(上传–cp、下载–lcp)

具体代码

服务器

services.c(main 函数)

sqlite.c(数据库相关模块)

demo.c(服务器与客户端交互相关模块)

demo.h

sqlite.h

makefile

客户端

client.c(main函数)

demo.c(与服务器交互相关模块)

pathread.c(线程模块,实现恢复暂停下载)

sqlite.c(登录与注册–客户端)

demo.h

pthread.h

sqlite.h

makefile

主体功能

程序总体分两部分,客户端与服务器。
1、支持上传(cp)、下载(lcp)除根目录文件任意大小的文件
2、支持多客户端连接服务器下载、上传文件
3、支持文件下载、上传的暂停与恢复
4、自动检测输入的格式,超过次数程序自动退出。
5、支持切换远程服务器(lcd)、本地客户端(cd)工作目录,以及查看目录文件(lls、ls)和当前工作目录(lpwd,pwd)。

程序使用方法

1、客户端与服务器都可以直接使用make命令编译后运行
2、客户端运行时需要输入,服务器的ip地址与端口号

1、运行服务器

个人项目----基于TCP的文件传输系统

服务器运行后,属于待机状态,等待服务器连接后交互信息。

2、运行客户端

个人项目----基于TCP的文件传输系统
运行客户端需要输入,客户端的ip地址与端口号。(程序仅支持同一网段下的客户端与服务器交互)。

3、登录

个人项目----基于TCP的文件传输系统

客户端运行后,可以选择登录与注册。服务器在运行之初会自动创建4个VIP用户。可以使用VIP用户直接登录。
2345678 66666666
7654321 8888888
654321 888888
54321 88888

4、注册

个人项目----基于TCP的文件传输系统

个人项目----基于TCP的文件传输系统

登录注册时,输入需要按照格式输入,否则到达次数。程序自动退出。

5、程序命令解析

客户端命令:
ls:查看当期客户端,当期目录文件
cd:切换当前客户端目录
pwd:查看当前绝对路径
cp :上传文件,格式: cp 【当前文件路径】【待上传文件名】 【目的文件路径】【目的文件名】
cp ./file1 ./file1

lcp:下载文件,格式: lcp 【远程文件路径】【远程文件名】 【目的文件路径】【目的文件名】
lcp ./file1 ./file1
除开目的文件名不能与所传路径下的文件重名外,所有的路径(除根目录)与文件名都可以根据自己意愿确定。
程序会检测文件是否存在,是否重名,是否为空文件,并反馈信息。
lls:查看服务器当前目录文件
lpwd:产看服务器当前工作路径
lcd:切换服务器工作目录
quit:客户端退出
lcp:

服务器命令:
CTRL+c:退出服务器,并自动删除数据库。所有账户信息清零。

6、传输文件(上传–cp、下载–lcp)

个人项目----基于TCP的文件传输系统

程序具备恢复与暂停功能,在上传或下载过程中。输入’1’表示暂停下载、上传。输入’2’表示恢复下载、上传。

具体代码

服务器

services.c(main 函数)

int fid = 0;

#include"sqlite.h"
int main(int argc, char* argv[])
{
    int type = 0;
    int fd1,pid,ret;
    int fid = init_socket();
    if(fid < 0)
    {
        printf("init_socket failed.\n");
        return -1;
    }

    signal(SIGCHLD,handler);//&#x6355;&#x6349;&#x81EA;&#x8FDB;&#x7A0B;&#x4FE1;&#x53F7;&#xFF0C;&#x8FDB;&#x884C;&#x5904;&#x7406;
    signal(SIGINT,handler);//&#x6355;&#x6349;&#x81EA;&#x8FDB;&#x7A0B;&#x4FE1;&#x53F7;&#xFF0C;&#x8FDB;&#x884C;&#x5904;&#x7406;

    sqlite3 *db;
    if(init_vip(&db) == -1)//&#x5148;&#x521B;&#x5EFA;&#x4E24;&#x4E2A;&#x7528;&#x6237;
    {
        printf("failed\n");
        close(fd1);
        system("rm ./jkl.db");
        exit(-1);
    }

    while(1)
    {
        fd1 = accept_client(fid);//&#x7B49;&#x5F85;&#x5BA2;&#x6237;&#x7AEF;&#x63A5;&#x5165;
        if(fd1 == -1)
        {
            close(fid);
            return -1;
        }

        pid = fork();
        if(pid  == -1)
        {
            perror("fork:");
        }else if(pid == 0 )//&#x5B50;&#x8FDB;&#x7A0B;&#x548C;&#x63A5;&#x5165;&#x5BA2;&#x6237;&#x7AEF;&#x4EA4;&#x4E92;
        {

            ret = usr_into_system(fd1,&db);//&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;&#x3001;&#x6CE8;&#x518C;
            if(-1 == ret )

            {
                close(fd1);
                exit(-1);

            }else if(ret == 13 )
            {
                printf("&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;&#x6210;&#x529F; \n");
            }

            information_from_client(&type,fd1);//&#x5FAA;&#x73AF;&#x68C0;&#x6D4B;&#x5BA2;&#x6237;&#x7AEF;&#x8F93;&#x5165;
            exit(0);
        }

    }
    close(fid);
    exit(0);
    return 0;
}

sqlite.c(数据库相关模块)

#include"sqlite.h"

extern int vip;
int init_vip(sqlite3 **db1)//&#x521D;&#x59CB;&#x5316;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x5F20;&#x8868;&#xFF0C;&#x8868;&#x4E2D;&#x4E24;&#x4E2A;vip
{
    char sql[100] = {0};

    if(init_seqlite("./jkl.db",db1) == -1)
        return -1;
    strcpy(sql,"create table student(vip integer, log text, password text);");
    if(init_usr(*db1,sql) == -1)
        return -1;
    strcpy(sql,"insert into student values(1 , '2345678', '66666666');");
    if(init_usr(*db1,sql) == -1)
        return -1;
    strcpy(sql,"insert into student values(1 , '7654321', '8888888');");
    if(init_usr(*db1,sql) == -1)
        return -1;
    strcpy(sql,"insert into student values(1 , '654321', '888888');");
    if(init_usr(*db1,sql) == -1)
        return -1;
    strcpy(sql,"insert into student values(1 , '54321', '88888');");
    if(init_usr(*db1,sql) == -1)
        return -1;
    return 0;
}

int init_seqlite(char*r,sqlite3 ** db)//&#x521B;&#x5EFA;&#x4E00;&#x5F20;&#x8868;
{
    if(0 != sqlite3_open(r,db) )
    {
        perror("open");
        return -1;
    }
    return 0;
}

int init_usr(sqlite3* db,char* sql)//&#x521B;&#x5EFA;&#x7528;&#x6237;
{
    if(0 != sqlite3_exec( db,sql,NULL,NULL,NULL))
    {
        perror("exec");
        return -1;
    }
    return 0;
}

int usr_into_system(int fd, sqlite3 **db)//&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;&#x6CE8;&#x518C;
{
    sqlite3 *db1 = *db;
    int a = 0;
    int ret1,ret2;
    struct msgdata msg;
    bzero(&msg,sizeof(msg));
    strcpy(msg.data,"&#x8F93;&#x5165; 1(&#x767B;&#x9646;) or 2(&#x6CE8;&#x518C;).");
    send(fd,&msg,sizeof(msg),0);//&#x63D0;&#x9192;&#x5BA2;&#x6237;&#x7AEF;&#x8F93;&#x5165;
                    //  printf("services put success: %s\n",msg.data);
    while(1)
    {
        bzero(msg.data,sizeof(msg.data));
        if( 0 == recv(fd,&msg,sizeof(msg),0))//&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8F93;&#x5165;
            break;
        //  printf("msg.type  =%d\n",msg.type);
        //vip = msg.j;

        int n =0 ;
        char buf1[50] ={0};
        char buf2[50] ={0};
        strcpy(buf1,msg.data);
        strcpy(buf2,strtok_str(buf1,0));
        strcpy(buf1,strtok_str(msg.data,1));

    //  printf("buf1:%s\n",buf1);//&#x5BC6;&#x7801;
    //  printf("buf2:%s\n",buf2);//&#x5E10;&#x53F7;
        if(msg.type == 1)
        {
            msg.type = 0;

            int x=0,y=0;
            ret1 =select_data(db1,1,buf2,&x);
            ret2 =select_data(db1,2,buf1,&y);
            if( (ret1 == 1) && (ret2 == 1))
            {
                if(  ((x != 0) &&(y != 0) )  && (x == (y) - 1)  )
                {
                //  printf("x= %d  y =%d\n",x ,y);
                    msg.type = 1;
                    send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;&#x6210;&#x529F;
                    return 13;

                }else{
                msg.type = -1;
                                send(fd,&msg,sizeof(msg),0);
                                continue;

                }
            }else{
                msg.type = -1;
                send(fd,&msg,sizeof(msg),0);
                continue;
            }

            /*

               if( (select_data(db1,1,buf2) == 1) && (select_data(db1,2,buf1) == 1) )
               {
               msg.type = 1;
               send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;&#x6210;&#x529F;
               return 13;

               }else{
               msg.type = -1;
               send(fd,&msg,sizeof(msg),0);
               continue;
               }
               */
        }else if(msg.type == 2)
        {
    //      printf("j = %d\n",msg.j);
            if(msg.j == 1)
            {
                vip = 1;
            }else if(msg.j == -1)
            {
                vip = 0;
            }

            if(add_usr_to_system(db1,buf2,buf1,&msg) == -1)
            {
                msg.type = -1;
                send(fd,&msg,sizeof(msg),0);
                continue;
            }else{
                msg.type = 1;
                send(fd,&msg,sizeof(msg),0);
                continue;
            }
        }else if(msg.type  ==-1)
        {
            printf("client quit.\n");
            return -1;
        }
    }
    return 0;
}

int  select_data(sqlite3* db, int m,char* buf,int* x)
{
    int ret =0 ;
    char sql[50] = {0};
    char **result;
    int R, C;

    if(0 != sqlite3_get_table(db, "select *from student;", &result, &R, &C, NULL))
    {
        printf("select is default\n");
        return -1;
    }
    int i, j;

     m = C +m;
    for(i = 0; i <r;i++ 1 ) { printf("%s \n",result[m]); printf("%d buf="%d\n",strlen(result[m]),strlen(buf));" ret="strcmp(result[m],buf)" ; printf("%d\n",ret); if((ret="=" 0) && (strlen(buf)="=" strlen(result[m]))) 找到相同 数据 printf("this m result %s %d\n",result[m],strlen(result[m])); %d\n",buf,strlen(buf)); *x="m;" return 1; } +="3;" 0; 没有找到相同数据 int add_usr_to_system(sqlite3*db,char *buf2,char *buf1,struct msgdata* msg) 注册 x; char sql[100]="{0};" printf("buf2="%s\n",buf2);" if(ret="=" strcpy(msg->data,"&#x7528;&#x6237;&#x6216;&#x5DF2;&#x5B58;&#x5728;.");
        return -1;
    }else if(ret == -1)
    {
        return -1;
    }

    sprintf(sql,"insert into student values(%d , '%s', '%s');",msg->j,buf2,buf1);
    if(init_usr(db,sql) == -1)
        return -1;
    return 0;
}

</r;i++>

demo.c(服务器与客户端交互相关模块)

#include"demo.h"
#include<pthread.h>
//extern int type;
int vip  =1;
int pthread_type = 2;
int type_pth = 2;

void * input(void*);
extern int fid;
int init_socket()//&#x521D;&#x59CB;&#x5316;&#x5957;&#x63A5;&#x5B57;
{
    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == fd)
    {
        perror("socket:");
        return -1;
    }else{
        printf("socket success.\n");
    }
    int on =1;
    if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))< 0)//&#x8BBE;&#x7F6E;&#x7AEF;&#x53E3;&#x53EF;&#x4EE5;&#x590D;&#x7528;
    {
        perror("setsockopt:");
        return -1;
    }

    struct sockaddr_in addr;
    addr.sin_family     = AF_INET;
    addr.sin_port       = htons(6150);
    addr.sin_addr.s_addr    = inet_addr("0.0.0.0");

    if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)) < 0 )
    {
        perror("bind:");
        return -1;
    }else{
        printf("bind success.\n");
    }

    if(listen(fd,13) < 0)
    {
        perror("listen:");
        return -1;
    }else{
        printf("listen........\n");
    }
    return fd;
}

int accept_client(int fd)//&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;
{
    struct sockaddr_in addr;
    socklen_t len;
    int acce_fd = accept(fd,(struct sockaddr*)&addr,&len);
    if(acce_fd == -1)
    {
        perror("accept:");
        return -1;
    }else{
        printf("accept success.\n");
        printf("\033[1;31mip:%s,port:%d\033[0m\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
    }
    return acce_fd;
}
void handler(int no)//&#x4FE1;&#x53F7;&#x5904;&#x7406;&#x51FD;&#x6570;
{

    int pid;
    if(no == SIGCHLD)
    {
        pid = waitpid(-1,NULL,WNOHANG);//&#x975E;&#x963B;&#x585E;&#x7B49;&#x5F85;&#x5B50;&#x8FDB;&#x7A0B;&#x63A8;&#x51FA;
        if(-1 == pid)
        {
            perror("waitpid :");
        }else{
            //printf("\033[1;34msignal: child quit,pid:%d\033[0m\n",pid);
        }
    }else if(no == SIGINT)
    {
        system("rm ./jkl.db");
        close(fid);
        printf("services quit\n");
        exit(0);
    }
}

int information_from_client(int* type,int fd1)//&#x5FAA;&#x73AF;&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x4FE1;&#x606F;
{
    int ret,open_fd;
    struct msgdata *msg = (struct msgdata*)malloc(sizeof(struct msgdata));
    while(1)
    {
        bzero(msg,sizeof(struct msgdata));
        ret = recv(fd1,msg,sizeof(struct msgdata),0);
        if(ret == -1)
        {
            perror("recvmsg:");
            break;
        }else if (ret == 0)
        {
            break;
        }else{
            printf("               \033[1;34m information  from clent:%s\033[0m\n",msg->filename);
            if(get_command(type,msg,fd1) == 13 )
                break;
        }

    }
    free(msg);
    msg =   NULL;
    close(fd1);
    return 0;
}

int get_command(int* type,struct msgdata* msg,int fd)//&#x5206;&#x6790;&#x547D;&#x4EE4;
{   char buf[50] = {0};
    strcpy(buf,msg->filename);
//  printf("get buf =%s\n",buf);

    if(strncmp(buf,"lcd",3) == 0)        *type = 1;
    else if(strncmp(buf,"lls",3) == 0)   *type = 2;
    else if(strncmp(buf,"lpwd",4) == 0)  *type = 3;
    else if(strncmp(buf,"lcp",3) == 0)   *type = 4;
    else if(strncmp(buf,"cp",2) == 0)    *type = 5;
    else if(strncmp(buf,"quit",4) == 0)  *type = 6;
    else{
        printf("input error|n");
        return -1;
    }
//  printf("type =%d\n",*type);
    if(deal_command(type,msg,fd) == 13)
        return 13;
    return 0;
}

int deal_command(int *type,struct msgdata* msg,int fd)//&#x5904;&#x7406;&#x547D;&#x4EE4;
{
    char *p =NULL;
    char *p1 = NULL;
    switch(*type)
    {
        case 1:
            p1 = msg->filename;
            p1 = p1+3;
            if(*p1 == '\0')
            {
                if( chdir("/")== -1)
                {
                    msg->type == -1;
                    strcpy(msg->data,strerror(errno));
                }else{
                    strcpy(msg->data,"\033[0;34m lcd:success\033[0m");
                }
                send(fd,msg,sizeof(struct msgdata),0);//&#x53CD;&#x9988;&#x9519;&#x8BEF;&#x4FE1;&#x606F;

            }else{
                p = strtok_str(msg->filename,1);
                if(chdir(p) == -1)
                {
                    msg->type == -1;
                    strcpy(msg->data,strerror(errno));
                }else{
                    strcpy(msg->data,"\033[0;34m lcd:success\033[0m");
                    //strcpy(msg->data,"success\n");
                }
                send(fd,msg,sizeof(struct msgdata),0);//&#x53CD;&#x9988;&#x9519;&#x8BEF;&#x4FE1;&#x606F;
            }
            break;
        case 2:
            char buf[123] = {0};
            p1 = msg->filename +3;
            if(*p1 == ' ') //&#x5224;&#x65AD;&#x547D;&#x4EE4;lls &#x540E;&#x8DDF;&#x4E86;&#x9009;&#x9879;
            {
                p = strtok_str(msg->filename,1);
                sprintf(buf,"ls %s",p); //&#x62FC;&#x51D1;ls &#x52A0;&#x9009;&#x9879;
                msg->type =3;
        //      printf("this is lls -xxxx \n");
                send(fd,msg,sizeof(struct msgdata),0);// &#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x9700;&#x8981;&#x6253;&#x5370;

                send_to_client(buf,fd);//&#x8BFB;&#x53D6;&#x5E76;&#x53D1;&#x9001;ls &#x7ED3;&#x679C;
            }else if (*p1 == '\0')
            {
                //iprintf("this is 2\n");
                msg->type =3;
                //printf("this  is lls \n");
                send(fd,msg,sizeof(struct msgdata),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x53EF;&#x4EE5;&#x540E;&#x9762;&#x7684;&#x6253;&#x5370;
                send_to_client("ls",fd);
            }else{
                //printf("this is 3\n");
                msg->type = -1;
                strcpy(msg->data,"lls: input error");
                send(fd,msg,sizeof(struct msgdata),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x547D;&#x4EE4;&#x683C;&#x5F0F;&#x9519;&#x8BEF;
            }
            break;
        case 3:
            char *p = msg->filename;
            p = p+4;
            if(*p == '\0')
            {

                send_to_client("pwd",fd);

            }else{
                msg->type = -1;
                strcpy(msg->data,"lpwd:input error");
                send(fd,msg,sizeof(struct msgdata),0);
            }

            break;
        case 4:
            p = strtok_str(msg->filename,1);
            send_file_to_client(p,fd);//&#x53D1;&#x9001;&#x6587;&#x4EF6;
            break;
        case 5://&#x5B9E;&#x73B0;cp&#x529F;&#x80FD;&#xFF0C;&#x63A5;&#x6536;&#x6587;&#x4EF6;
            accept_file(msg,fd);//&#x63A5;&#x6536;&#x6587;&#x4EF6;
            break;
        case 6:
            printf("clenit quit\n");
            return 13;
            break;
    }
    //  printf("this is end end\n");
    return 0;
}

char *strtok_str(char* str,int i)//&#x5206;&#x5272;&#x5B57;&#x7B26;&#x4E32;
{
    char *p = strtok(str," ");
    while(i--)
    {
        p = strtok(NULL," ");

    }
    //  printf("%s\n",p);
    return p;
}

int send_to_client(char* str,int fd)//&#x53D1;&#x9001;&#x547D;&#x4EE4;&#x540E;&#x7684;&#x5185;&#x5BB9;&#x5230;&#x5BA2;&#x6237;&#x7AEF;,lpwd lls
{
    int ret ,ret1;
    //  printf("str=%s\n",str);
    struct msgdata msg;
    bzero(&msg,sizeof(msg));
    FILE* fd1 = popen(str,"r");
    if(fd1 == NULL)
    {
        perror("popen");
    }
    while(1)
    {
        ret = fread(msg.data,sizeof(msg.data),1,fd1);
        if(ret == -1)
        {
            perror("fread");
            pclose (fd1);
            return -1;
        }else if(ret == 0)//&#x8BFB;&#x53D6;&#x5230;&#x672B;&#x5C3E;&#x4E86;
        {
        //  printf("str=         %s\n",str);
            if(NULL != strstr(str,"pwd") )
            {
                msg.type = 2;   // &#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x662F;pwd&#xFF0C;&#x5E76;&#x4E14;&#x8BFB;&#x5230;&#x672B;&#x5C3E;&#x4E86;
            }else{
                msg.type = 13;  //lls&#xFF0C;&#x5E76;&#x4E14;&#x8BFB;&#x5230;&#x672B;&#x5C3E;&#x4E86;
            }
            ret = send(fd,&msg,sizeof(msg),0);
            if(ret == -1)
            {
                perror("send");
            }
    //      printf("msg type      %d\n",msg.type);
            bzero(msg.data,sizeof(msg.data));
            break;
        }else{

            ret = send(fd,&msg,sizeof(msg),0);
            if(ret == -1)
            {
                perror("send");
            }
            bzero(msg.data,sizeof(msg.data));
        }
    }
    pclose(fd1);
    return 0;
}

int accept_file(struct msgdata* Msg,int fd)//&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x590D;&#x5236;&#x5230;&#x7684;&#x6587;&#x4EF6;,cp

{

    char *str = strtok_str(Msg->filename,2);//&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x540D;
    int ret,i=0,j,op_fd;
    int tail;
    char buf[130] = {0};
    memset(buf,'-',100);
    int k = 0;

    struct msgdata msg;
    int size = sizeof(msg.data);
    bzero(&msg,sizeof(msg));

    recv(fd,&msg,sizeof(msg),0);//&#x786E;&#x8BA4;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x6253;&#x5F00;&#x6210;&#x529F;
    if(msg.type  == -1)//&#x6253;&#x5F00;&#x5931;&#x8D25;&#xFF0C;&#x7EC8;&#x6B62;&#x672C;&#x6B21;&#x4F20;&#x8F93;
    {
        printf("\033[&#x4F20;&#x8F93;&#x5931;&#x8D25;\033[0m\n\n");
        return -1;
    }else{//&#x6253;&#x5F00;&#x6210;&#x529F;&#xFF0C;&#x63A5;&#x6536;&#x672C;&#x6B21;&#x4F20;&#x8F93;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6B21;&#x6570;
        j = msg.j;
        tail =  msg.file_len - (j-1)*(size);//&#x6700;&#x540E;&#x4E00;&#x6B21;&#x7684;&#x957F;&#x5EA6;
                            // printf("%s\n",msg.data);
    }

    struct msgdata msg2;
    op_fd = open(str,O_CREAT|O_EXCL|O_RDWR,0666);//&#x521B;&#x5EFA;&#x6587;&#x4EF6;
    if(op_fd == -1)
    {
        perror("open");
        printf("\033[0;31m&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;\033[0m\n");
        msg2.type =-1;
        send(fd,&msg2,sizeof(msg2),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x8FD9;&#x8FB9;&#x521B;&#x5EFA;&#x5931;&#x8D25;&#x3002;&#x4E0D;&#x8981;&#x53D1;&#x9001;&#x3002;&#x7EC8;&#x6B62;&#x4F20;&#x8F93;
        return -1;
    }
    msg2.type =1;
    send(fd,&msg2,sizeof(msg2),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x8FD9;&#x8FB9;&#x521B;&#x5EFA;&#x6210;&#x529F;&#x3002;&#x53EF;&#x4EE5;&#x53D1;&#x9001;&#xFF0C;&#x5F00;&#x59CB;&#x63A5;&#x6536;&#x6570;&#x636E;

    int s = 0;
    if(vip == 1)
    {
        s =1;
    }else{
        s =6;
    }
//  printf("vip =%d , s =%d \n",vip,s);
    while(1)
    {
        i++;
        //      bzero(msg.data,sizeof(msg.data));
        memset(msg.data,0,sizeof(msg.data));
        ret = recv(fd,&msg,sizeof(msg),0);
        if(ret == -1)
        {
            perror("read");
            break;
        }
        int ret = write(op_fd,msg.data, ((i<j)?size:tail) ); if(ret="=" -1) { perror("write:"); } float g="(((float)i/j)*100" while(k < (int)g) buf[k++]="*" ; printf("\033[0;32m<%s>\033[0;31m[%4.2f%%]\033[0m\033[0m \r",buf,g);
            fflush(stdout);
            usleep(70000*s);
        }

        if( j == i)
        {
            break;
        }
    }
    printf("\n&#x4F20;&#x8F93;&#x5B8C;&#x6BD5;.\n");
    return 0;
}

int send_file_to_client(char *p ,int fd)//lcp,&#x7531;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x9001;&#x6587;&#x4EF6;
{
    int ret ,i = 0,j,s=0;
    struct msgdata msg,msg1;
    float g;
    int size  = sizeof(msg.data);
    char buf1[50] = {0};
    char buf[130] = {0};//&#x7CBE;&#x5EA6;&#x6761;
    memset(buf,'-',100);
    int k =0 ;

    int op_fd = open(p,O_RDONLY);// &#x6253;&#x5F00;&#x672C;&#x5730;&#x6587;&#x4EF6;
    if(op_fd == -1)//&#x6253;&#x5F00;&#x5931;&#x8D25;
    {
        msg.type = -1;//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;,&#x65E0;&#x6CD5;&#x4F20;&#x8F93;&#x6587;&#x4EF6;
        perror("open");
        strcpy(msg.data,"\033[0;31m&#x8FDC;&#x7A0B;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;,&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x4F20;&#x8F93;\033[0m\n");

        send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#x6587;&#x4EF6;&#x6253;&#x5F00;&#x5931;&#x8D25;
        return -1;
    }else{//&#x6253;&#x5F00;&#x6210;&#x529F;
        msg.file_len = lseek(op_fd,0,SEEK_END);//&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x5927;&#x5C0F;
        lseek(op_fd,0,SEEK_SET);
        if(msg.file_len == 0)
        {
            msg.type =  -1;
            strcpy(msg.data,"\033[0;31m&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#x4E3A;&#x7A7A;&#xFF0C;&#x4E0D;&#x652F;&#x6301;&#x4F20;&#x8F93;\033[0m\n");
            send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x4F20;&#x8F93;&#x7EC8;&#x6B62;
            return -1;
        }
        msg.type =1;
        msg.j = msg.file_len/size +  (((msg.file_len%size) > 0)?1:0);//&#x83B7;&#x53D6;&#x672C;&#x6B21;&#x4F20;&#x8F93;&#x6B21;&#x6570;
        strcpy(msg.data,"\033[0;34m service: &#x8FDC;&#x7A0B;&#x6587;&#x4EF6;&#x5B58;&#x5728;&#xFF0C;&#x53EF;&#x4EE5;&#x4F20;&#x8F93;\033[0m\n");
        send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x53D1;&#x9001;&#x7684;&#x6B21;&#x6570;\&#x6587;&#x4EF6;&#x5927;&#x5C0F;
        j = msg.j;
    }

    //send(fd,&msg,sizeof(msg),0);
    //&#x7B49;&#x5F85;&#x5BA2;&#x6237;&#x7AEF;&#x521B;&#x5EFA;&#x65B0;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x6210;&#x529F;
    struct msgdata msg2;
    recv(fd,&msg2,sizeof(msg2),0);
    if(msg2.type == -1)//&#x5BA2;&#x6237;&#x7AEF;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;&#xFF0C;&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x4F20;&#x8F93;
    {
        printf("\033[0;31m&#x5BA2;&#x6237;&#x7AEF;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;&#xFF0C;&#x6216;&#x6587;&#x4EF6;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#xFF0C;&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x672C;&#x6B21;&#x4F20;&#x8F93;.\033[0m\n");
        close(op_fd);
        return -1;
    }else{
        if(vip == 1)
        {
            s =1;
        }else{
            s =6;
        }

        pthread_t tid;
        while(1){
            if(i == 0)
            {
                pthread_create(&tid,NULL,input,(void *)&fd);
            }
            if(type_pth == 2)
            {

                i++;
                bzero(msg.data,sizeof(msg.data));
                ret = read(op_fd,msg.data,sizeof(msg.data));//&#x8BFB;&#x53D6;&#x6587;&#x4EF6;
                if(ret == -1)
                {
                    perror("read");
                    close(op_fd);
                    return -1;
                }
                send(fd,&msg,sizeof(msg),0);//&#x6587;&#x4EF6;&#x6570;&#x636E;&#x53D1;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;
                g = (((float)i/j)*100 );
                while(k < (int)g)
                {
                    buf[k++] ='*';
                    printf("\033[0;32m<%s>\033[0;31m[%4.2f%%]\033[0m\033[0m \r",buf,g);//&#x6253;&#x5370;&#x8FDB;&#x5EA6;&#x6761;

                    fflush(stdout);
                    usleep(70000*s);
                }
                if(j == i)
                {
                    pthread_cancel(tid);
                    pthread_join(tid,NULL);
                    break;
                }
            }
        }
        printf("\n&#x6587;&#x4EF6;&#x4F20;&#x8F93;&#x5B8C;&#x6BD5;.\n");
    }
}

void * input(void* fd)
{
//  printf("fd === %d\n",*((int*)fd));
    struct msgdata msg;
    while(1)
    {
        if(recv(*((int*)fd),&msg,sizeof(struct msgdata),0) == -1)
            perror("recv");
        if(msg.type_pth == 1)
        {
            type_pth = 1;
        }else if(msg.type_pth == 2 )
        {
            type_pth = 2;
        }
//      printf("type =%d   ms =%d\n",type_pth,msg.type_pth);
    }
}
</%s></j)?size:tail)></pthread.h>

demo.h

#include<sys types.h>
#include<arpa inet.h>
#include<sys socket.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys wait.h>
#include <sys stat.h>
#include <fcntl.h>
#include<errno.h>

#define lcd     1
#define lls     2
#define lpwd    3
#define lcp 4
#define cp  5
#define quit    6
#define my_exit 7

struct msgdata{
    char filename[50];
    char data[300];
    int type;
    int file_len;
    int j;
    int type_pth;

};
int accept_client(int fd);//&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;
int init_socket();//&#x521D;&#x59CB;&#x5316;&#x5957;&#x63A5;&#x5B57;
void handler(int no);//&#x4FE1;&#x53F7;&#x5904;&#x7406;&#x51FD;&#x6570;
int information_from_client(int* type,int fd1);//&#x63A5;&#x6536;&#x5BA2;&#x6237;&#x7AEF;&#x9996;&#x6B21;&#x53D1;&#x51FA;&#x7684;&#x4FE1;&#x606F;

int get_command(int* tyep ,struct msgdata*, int fd);//&#x5206;&#x6790;&#x547D;&#x4EE4;
int deal_command(int* type,struct msgdata*,int fd );//&#x5904;&#x7406;&#x547D;&#x4EE4;

char *strtok_str(char *,int);//&#x5206;&#x5272;&#x5B57;&#x7B26;&#x4E32;
int accept_file(struct msgdata *,int fd);//&#x63A5;&#x6536;&#x6587;&#x4EF6;,cp&#x65F6;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x63A5;&#x6536;&#x6587;&#x4EF6;

int send_to_client(char* str,int fd);//lls lpwd&#x540E;&#x7684;&#x4FE1;&#x606F;  &#x53D1;&#x9001;&#x5230;&#x5BA2;&#x6237;&#x7AEF;

int send_file_to_client(char *p ,int fd);//&#x53D1;&#x9001;&#x6587;&#x4EF6;&#x5230;&#x5BA2;&#x6237;&#x7AEF;

</errno.h></fcntl.h></sys></sys></stdlib.h></unistd.h></string.h></stdio.h></sys></arpa></sys>

sqlite.h

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include"demo.h"
int init_seqlite(char*,sqlite3 ** db);//&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6570;&#x636E;
int init_usr( sqlite3* db,char *);//&#x521B;&#x5EFA;&#x7528;&#x6237;
int init_vip(sqlite3 **);//&#x521B;&#x5EFA;&#x4E24;&#x4E2A;vip

int usr_into_system();//&#x5BA2;&#x6237;&#x7AEF;&#x767B;&#x9646;

int  select_data(sqlite3*,int,char*,int*);//&#x67E5;&#x627E;&#x6570;&#x636E;&#xFF0C;&#x5728;&#x6570;&#x636E;&#x5E93;&#x4E2D;

int add_usr_to_system(sqlite3*,char* ,char*,struct msgdata*);//&#x6CE8;&#x518C;&#x5E10;&#x53F7;
</string.h></sqlite3.h></stdio.h>

makefile

test:services.o demo.o sqlite.o

    gcc  -Wall services.o demo.o sqlite.o  -o test -lsqlite3 -L/usr/local/lib -I/usr/local/include  -lpthread
services.o:services.c
    gcc -c services.c  -o services.o
demo.o:demo.c
    gcc -c demo.c -o demo.o
sqlite.o:sqlite.c
    gcc -c sqlite.c -o sqlite.o -lsqlite3

.PHONY:clean
clean:
    rm -r ./*.o  test

-lsqlite3 -L/usr/local/lib -I/usr/local/include -static -lpthread

客户端

client.c(main函数)

#include"sqlite.h"

int fd;
int main(int argc, char *argv[])
{
    int ret;
    char buf[50] = {0};
    int type = 0;
    fd = connect_services(argc,argv[1],argv[2]);
    if(fd == -1)
    {
        printf("connect_services failed\n");
        return -1;
    }

    ret = login_reges_to_servises(fd);
    if(ret == -1)
    {
        close(fd);
        return -1;
    }else if(ret == 13)
    {

        printf("&#x672C;&#x7A0B;&#x5E8F;&#x652F;&#x6301;&#x529F;&#x80FD;&#xFF1A;\n1&#x3001;&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;&#xFF1A;cp [&#x8DEF;&#x5F84;][&#x6587;&#x4EF6;&#x540D;] [&#x76EE;&#x6807;&#x8DEF;&#x5F84;][&#x76EE;&#x6807;&#x6587;&#x4EF6;&#x540D;]\n2&#x3001;&#x4E0A;&#x4F20;&#x6587;&#x4EF6;:lcp [&#x8DEF;&#x5F84;][&#x6587;&#x4EF6;&#x540D;] [&#x76EE;&#x6807;&#x8DEF;&#x5F84;][&#x76EE;&#x6807;&#x6587;&#x4EF6;&#x540D;]\n3&#x3001;&#x67E5;&#x770B;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x3001;&#x5207;&#x6362;&#x672C;&#x5730;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;&#x3001;&#x67E5;&#x770B;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;&#x8DEF;&#x5F84;(ls ,cd,pwd&#x53CA;&#x76F8;&#x5173;&#x9009;&#x9879;)\n4&#x3001;&#x67E5;&#x770B;&#x8FDC;&#x7A0B;&#x6587;&#x4EF6;&#x3001;&#x5207;&#x6362;&#x76EE;&#x5F55;&#x3001;&#x8DEF;&#x5F84;(lls&#x3001;lcd&#x3001;lpwd)&#x53CA;&#x76F8;&#x5173;&#x9009;&#x9879;\n");

    }

    get_command(buf,sizeof(buf),&type);//&#x5BF9;&#x547D;&#x4EE4;&#x8FDB;&#x884C;&#x89E3;&#x6790;
    close(fd);
    return 0;
}

demo.c(与服务器交互相关模块)

#include"demo.h"
#include"pthread.h"
int vip = 1;
int pthread_type = 2;
int pthread_interrupt( pthread_t*);//&#x5EFA;&#x7ACB;&#x7EBF;&#x7A0B; cp&#xFF08;&#x4E0A;&#x4F20;&#x6587;&#x4EF6;&#xFF09;
int pthread_interrupt2( pthread_t*);//&#x5EFA;&#x7ACB;&#x7EBF;&#x7A0B; ,lcp(&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;)

extern int fd;
int connect_services(int argc,char* ip, char * port)//&#x8FDE;&#x63A5;
{
    if(argc < 3){
        printf("too few arguements: ./test [ip] [port]\n" );
        return -1;
    }
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        perror("socket");
        return -1;
    }
    printf("sockfd: %d\n", sockfd);

    struct sockaddr_in addr = {
        .sin_family         = AF_INET,
        .sin_port           = htons( atoi(port) ),
        .sin_addr.s_addr        = inet_addr( ip )
    };
    if( connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        close(sockfd);
        return -1;
    }
    return sockfd;

}

int get_command(char *str,int size,int* type )//&#x5206;&#x6790;&#x547D;&#x4EE4;
{
    char *p = NULL;
    while(1)
    {   memset(str,0,50);
        fgets(str,size,stdin);
        p = str+ strlen(str)-1;
        *p = '\0';
        //  printf("str strlen= %d\n",strlen(str));
        if(strncmp(str,"cd",2) == 0)        *type  =1;
        else if(strncmp(str,"lcd",3) == 0)  *type  =2;
        else if(strncmp(str,"ls",2) == 0)   *type  =3;
        else if(strncmp(str,"lls",3) == 0)  *type  =4;
        else if(strncmp(str,"pwd",3) == 0)  *type  =5;
        else if(strncmp(str,"lpwd",4) == 0) *type  =6;
        else if(strncmp(str,"cp",2) == 0)   *type  =7;
        else if(strncmp(str,"lcp",3) == 0)  *type  =8;
        else if(strncmp(str,"quit",4) == 0) *type  =9;
        else {
            printf("input error:\n");
            continue;
        }
        //  printf("type %d\n",*type);
        if( 13 == deal_comman(*type,str))
            return -1;
    }
    return 0;

}

char * strtok_str(char* str,int i)//&#x5206;&#x5272;&#x5B57;&#x7B26;&#x4E32;
{
    char *p = strtok(str," ");
    while(i--)
    {
        p = strtok(NULL," ");
    }
    return p;
}

int deal_comman(int type,char *str)//&#x5904;&#x7406;&#x547D;&#x4EE4;
{
    struct msgdata msg;
    bzero(&msg,sizeof(msg));
    int ret;
    char *p =NULL;
    char buf[30] ={0};
    switch(type)
    {
        case 3:
        case 5:
            system(str);
            printf("\033[0;34m===========================================================\033[0m\n\n");
            break;

        case 1:
            p = strtok_str(str,1);
            chdir(p);
            printf("\033[0;34m===========================================================\033[0m\n\n");
            break;
        case 2:
            strncpy(msg.filename,str,strlen(str));
            ret = send_command_to_service(msg);
            recv(fd,&msg,sizeof(msg),0);
            if(msg.type == -1)
            {
                printf("\033[0;31m%s\033[0m\n",msg.data);
                printf("type =%d\n",msg.type);
            }
            printf("%s\n",msg.data);
            printf("\033[0;34m===========================================================\033[0m\n\n");
            break;
        case 4:
        case 6:

            strncpy(msg.filename,str,strlen(str));
            send_command_to_service(msg);//&#x53D1;&#x9001;lpwd lls&#x547D;&#x4EE4;
            if(ret == -1)
            {
                printf("error:send_to_services.\n");
            }
            recv(fd,&msg,sizeof(struct msgdata),0);//&#x63A5;&#x6536;&#x53CD;&#x9988;&#x4FE1;&#x606F;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x6253;&#x5370;
                                   //   printf("msg type = %d\n",msg.type);
            if(msg.type == 2)//&#x53CD;&#x9988;&#x4E3A;lpwd
            {
                printf("%s",msg.data);
                //          break;
            }
            else if(msg.type == -1)//&#x53CD;&#x9988;&#x4E3A;&#x547D;&#x4EE4;&#x683C;&#x5F0F;&#x9519;&#x8BEF;
            {
                printf("\033[0;31m%s\033[0m\n",msg.data);
                printf("\033[0;34m===========================================================\033[0m\n\n");
                break;
            }else{

                while(1)
                {

                    if(msg.type == 13)
                    {
                        break;
                    }
                    ret = recv(fd,&msg,sizeof(msg),0);
                    if(ret == -1)
                    {
                        perror("recv");
                        break;
                    }else if(ret == 0)
                    {
                        printf("services quit:\n");
                        break;
                    }else{
                        printf("%s",msg.data);
                    }
                    bzero(msg.data,sizeof(msg.data));

                }

            }
            printf("\033[0;34m===========================================================\033[0m\n\n");

            break;
        case 7://&#x5B9E;&#x73B0;cp&#x529F;&#x80FD;&#xFF0C;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x6587;&#x4EF6;
            bzero(&msg,sizeof(msg));
            strncpy(msg.filename,str,strlen(str));
            send_command_to_service(msg);//&#x6587;&#x4EF6;&#x540D;&#x53CA;&#x8DEF;&#x5F84;&#x4F20;&#x7ED9;&#x670D;&#x52A1;&#x5668;

            p = strtok_str(str,1);//&#x83B7;&#x53D6;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x540D;&#x53CA;&#x8DEF;&#x5F84;
            send_file_to_services(p);//&#x6253;&#x5F00;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x5E76;&#x4F20;&#x8F93;&#x6587;&#x4EF6;
            break;
        case 8:
            strncpy(msg.filename,str,strlen(str));
            send_command_to_service(msg);//&#x547D;&#x4EE4;&#x53D1;&#x9001;&#x5230;&#xFF0C;&#x670D;&#x52A1;&#x5668;

            p = strtok_str(str,2);
            recv_file_from_services(p);

            break;

        case 9:
            printf("client quit\n");
            strncpy(msg.filename,str,strlen(str));
            send_command_to_service(msg);//&#x547D;&#x4EE4;&#x53D1;&#x9001;&#x5230;&#xFF0C;&#x670D;&#x52A1;&#x5668;
            return 13;
            break;
        default:
            printf("\033[1;31miuput error:\033[0m\n");

    }
    return 0;
}

int send_command_to_service(struct msgdata msg)//&#x90E8;&#x5206;&#x89E3;&#x6790;&#x540E;&#x7684;&#x547D;&#x4EE4;&#x53D1;&#x9001;&#x5230;&#x670D;&#x52A1;&#x5668;:lls lpwd lcd quit

{
    int ret = send(fd,&msg,sizeof(msg),0);
    if(-1 == ret)
    {
        perror("send");
        exit(-1);
    }
    return 0;
}

int send_file_to_services(char *filename)//&#x53D1;&#x9001;&#x6587;&#x4EF6;&#x5230;&#x670D;&#x52A1;&#x5668;,cp
{

    int ret ,i = 0,j,s=0;
    struct msgdata msg;
    float g;
    int size  = sizeof(msg.data);
    char buf[130] = {0};//&#x7CBE;&#x5EA6;&#x6761;
    memset(buf,'-',100);
    int k =0 ;
    char buf1[50] = {0};
    int op_fd = open(filename,O_RDONLY);// &#x6253;&#x5F00;&#x672C;&#x5730;&#x6587;&#x4EF6;
    if(op_fd == -1)//&#x6253;&#x5F00;&#x5931;&#x8D25;
    {
        msg.type = -1;//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#x672C;&#x5730;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;,&#x65E0;&#x6CD5;&#x4F20;&#x8F93;&#x6587;&#x4EF6;
                  //perror("open");
        printf("\033[1;31m&#x672C;&#x5730;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x4F20;&#x8F93;\033[0m\n");
        send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#x6587;&#x4EF6;&#x6253;&#x5F00;&#x5931;&#x8D25;
        return -1;
    }else{//&#x6253;&#x5F00;&#x6210;&#x529F;

        msg.file_len = lseek(op_fd,0,SEEK_END);//&#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x5927;&#x5C0F;
        lseek(op_fd,0,SEEK_SET);
        if(msg.file_len == 0)
        {
            msg.type =  -1;
            printf("\033[1;31m&#x4E0A;&#x4F20;&#x6587;&#x4EF6;&#x4E3A;&#x7A7A;&#xFF0C;&#x4E0D;&#x652F;&#x6301;&#x4F20;&#x8F93;\033[0m\n");
            send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x4F20;&#x8F93;&#x7EC8;&#x6B62;
            return -1;
        }
        msg.type =1;
        msg.j = msg.file_len/size +  (((msg.file_len%size) > 0)?1:0);//&#x83B7;&#x53D6;&#x672C;&#x6B21;&#x4F20;&#x8F93;&#x6B21;&#x6570;
        send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x53D1;&#x9001;&#x7684;&#x6B21;&#x6570;\&#x6587;&#x4EF6;&#x5927;&#x5C0F;
        j = msg.j;
    }

    //&#x7B49;&#x5F85;&#x670D;&#x52A1;&#x5668;&#x521B;&#x5EFA;&#x65B0;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x6210;&#x529F;
    struct msgdata msg2;
    recv(fd,&msg2,sizeof(msg2),0);
    if(msg2.type == -1)//&#x670D;&#x52A1;&#x5668;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;&#xFF0C;&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x4F20;&#x8F93;
    {
        printf("\033[1;31m&#x670D;&#x52A1;&#x5668;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;&#xFF0C;&#x6216;&#x6587;&#x4EF6;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#xFF0C;&#x65E0;&#x6CD5;&#x5B8C;&#x6210;&#x672C;&#x6B21;&#x4F20;&#x8F93;.\033[0m\n");
        close(op_fd);
        return -1;
    }

    if(vip == 1)//&#x5224;&#x65AD;&#x662F;&#x5426;&#x4E3A;vip,&#x8FDB;&#x800C;&#x51B3;&#x5B9A;&#x4F20;&#x8F93;&#x901F;&#x7387;
    {
        s =1;
          printf("\033[1;32m&#x4EB2;&#x7231;&#x6EF4;VIP&#x7528;&#x6237;&#xFF0C;&#x6B63;&#x5728;&#x4E3A;&#x4F60;&#x52A0;&#x901F;\033[0m\n");
    }else{
        s =6;
    }
//  printf("vip =%d , s =%d \n",vip,s);
    while(1)
    {
        i++;
        memset(msg.data,0,sizeof(msg.data));

        ret = read(op_fd,msg.data,sizeof(msg.data));
        if(ret == -1)
        {
            perror("read");
            close(op_fd);
            return -1;
        }

        send(fd,&msg,sizeof(msg),0);
         g = (((float)i/j)*100 );
        while(k < (int)g)
        {
            buf[k++] ='*';
            printf("\033[0;32m [&#x8F93;&#x5165;1&#xFF08;&#x6682;&#x505C;&#xFF09;&#x6216;2(&#x6062;&#x590D;)]: <<%s>>\033[0;31m[%4.2f%%]\033[0m\033[0m \r",buf,g);
            fflush(stdout);
            usleep(70000*s);
        }

        pthread_t tid;

        if((i == 1) && (j >1))//&#x5F53;&#x4F20;&#x8F93;&#x6B21;&#x6570;&#x5927;&#x4E8E;1&#x65F6;&#xFF0C;&#x7B2C;&#x4E00;&#x6B21;&#x4F20;&#x8F93;&#x7ED3;&#x675F;&#x5C31;&#x5F00;&#x7EBF;&#x7A0B;
        {
            pthread_interrupt(&tid);
        }
        if(pthread_type == 1)
        {

            while(1)
            {
                bzero(buf1,sizeof(buf1));
                if(pthread_type == 1)
                {
                    //  fflush(stdin);
                    fgets(buf1,sizeof(buf1),stdin);
                    if((strlen(buf1) != 2 ) || ( buf1[0] != '2')  )
                    {
                        printf("\033[1;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF; \033[0m\n");
                    }else{
                        pthread_type =2;
                        break;
                    }
                }
            }
        }
        if(j == i)
        {
            pthread_type = -1;//&#x4F20;&#x8F93;&#x7ED3;&#x675F;&#xFF0C;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#x8D4B;&#x503C;&#x4E3A;-1,&#x7EBF;&#x7A0B;&#x9000;&#x51FA;
            pthread_cancel(tid);
            pthread_join(tid,NULL);
            break;
        }
    }
    printf("\n\033[1;36m&#x6587;&#x4EF6;&#x4F20;&#x8F93;&#x5B8C;&#x6BD5;.\033[0m\n");
            printf("\033[0;34m===========================================================\033[0m\n\n");
}

int recv_file_from_services(char* str)//&#x63A5;&#x6536;&#x6587;&#x4EF6;&#xFF0C;lcp
{

    int ret,i=0,j,op_fd,s=0;
    int tail;
    char buf[130] = {0};
    memset(buf,'-',100);
    int k = 0;

    struct msgdata msg;
    int size = sizeof(msg.data);
    bzero(&msg,sizeof(msg));

    recv(fd,&msg,sizeof(msg),0);//&#x786E;&#x8BA4;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x6253;&#x5F00;&#x6210;&#x529F;
    if(msg.type  == -1)//&#x6253;&#x5F00;&#x5931;&#x8D25;&#xFF0C;&#x7EC8;&#x6B62;&#x672C;&#x6B21;&#x4F20;&#x8F93;
    {
        printf("\033[%s\033[0m\n\n",msg.data);
        return -1;
    }else{//&#x6253;&#x5F00;&#x6210;&#x529F;&#xFF0C;&#x63A5;&#x6536;&#x672C;&#x6B21;&#x4F20;&#x8F93;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6B21;&#x6570;
        j = msg.j;
        tail =  msg.file_len - (j-1)*(size);//&#x6700;&#x540E;&#x4E00;&#x6B21;&#x7684;&#x957F;&#x5EA6;
        printf("%s\n",msg.data);
    }

    struct msgdata msg2;
    op_fd = open(str,O_CREAT|O_EXCL|O_RDWR,0666);//&#x521B;&#x5EFA;&#x6587;&#x4EF6;
    if(op_fd == -1)
    {
        perror("open");
        printf("\033[0;31m&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5931;&#x8D25;,&#x672C;&#x5730;&#x6587;&#x4EF6;&#x6216;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;\033[0m\n");
        msg2.type =-1;
        send(fd,&msg2,sizeof(msg2),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x8FD9;&#x8FB9;&#x521B;&#x5EFA;&#x5931;&#x8D25;&#x3002;&#x4E0D;&#x8981;&#x53D1;&#x9001;&#x3002;&#x7EC8;&#x6B62;&#x4F20;&#x8F93;
        return -1;
    }else{
        msg2.type =1;
        send(fd,&msg2,sizeof(msg2),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x8FD9;&#x8FB9;&#x521B;&#x5EFA;&#x6210;&#x529F;&#x3002;&#x53EF;&#x4EE5;&#x53D1;&#x9001;&#xFF0C;&#x5F00;&#x59CB;&#x63A5;&#x6536;&#x6570;&#x636E;
    }

    if(vip == 1)
    {
        s =1;
          printf("\033[1;32m&#x4EB2;&#x7231;&#x6EF4;VIP&#x7528;&#x6237;&#xFF0C;&#x6B63;&#x5728;&#x4E3A;&#x4F60;&#x52A0;&#x901F;\033[0m\n");
    }else{
        s =6;
    }

        pthread_t tid2;
    while(1)
    {
        if(i == 0)
        {
            pthread_interrupt2( &tid2 );//&#x5EFA;&#x7ACB;&#x7EBF;&#x7A0B; ,lcp(&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;)
        }
        i++;
        bzero(msg.data,sizeof(msg.data));
        ret = recv(fd,&msg,sizeof(msg),0);//&#x63A5;&#x6536;&#x670D;&#x52A1;&#x5668;&#x6587;&#x4EF6;&#x6570;&#x636E;
        if(ret == -1)
        {
            perror("read");
            break;
        }
        int ret = write(op_fd,msg.data, ((i<j)?size:tail) ); 写入本地文件 if(ret="=" -1) { perror("write:"); } float g="(((float)i/j)*100" while(k < (int)g) buf[k++]="*" ; printf("\033[0;32m[输入1(暂停)或2(恢复)]: <<%s>>\033[0;31m[%4.2f%%]\033[0m\033[0m \r",buf,g);//&#x6253;&#x5370;&#x8FDB;&#x5EA6;&#x6761;

            fflush(stdout);
            usleep(70000*s);
        }

        if(i == j)
        {
            pthread_cancel(tid2);//&#x6570;&#x636E;&#x4F20;&#x8F93;&#x5B8C;&#x6210;&#xFF0C;&#x7ED3;&#x675F;&#x53D1;&#x9001;&#x7EBF;&#x7A0B;
            pthread_join(tid2,NULL);
            break;
        }
    }
    printf("\n\033[1;36m&#x6587;&#x4EF6;&#x4F20;&#x8F93;&#x5B8C;&#x6BD5;.\033[0m\n");
            printf("\033[0;34m===========================================================\033[0m\n\n");
    return 0;
}

</j)?size:tail)></%s>

pathread.c(线程模块,实现恢复暂停下载)

#include"pthrea.h"
#include"demo.h"
extern int pthread_type ;
extern int fd;
int pthread_interrupt(pthread_t * tid)

{
    if(pthread_create(tid,NULL,input,NULL) != 0)
        perror("pthread_create");
    return 0;
}

void * input()
{
    while(1)
    {
        if( pthread_type == -1 )
        {
            pthread_exit(NULL);
            break;
        }else
        {
            if( pthread_type  == 2 )
            {

                char buf[50] = {0};
                fgets(buf,sizeof(buf),stdin);
            //  printf("%s\n",buf);
                if((strlen(buf) != 2)  || (buf[0] != '1')  )
                {
            printf("\033[1;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;\033[0m\n");
                }else{
                    if(buf[0] == '1')
                    {
                        pthread_type = 1;
                    }
                }
            }
        }
    }
}

int pthread_interrupt2(pthread_t * tid)

{
    if(pthread_create(tid,NULL,input2,NULL) != 0)
        printf("pthread_create error\n");
    return 0;
}

void * input2( )
{
    char buf[50] = {0};
    struct msgdata msg;
    while(1)
    {
        fgets(buf,sizeof(buf),stdin);
        if((strlen(buf) != 2) || ((buf[0] != '1') && (buf[0] != '2') ))
        {
            printf("\033[1;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;\033[0m\n");
        }else{

            if(buf[0] == '1')
            {
                msg.type_pth = 1;
            }else if(buf[0] == '2')
            {

                msg.type_pth = 2;
            }
            int ret =send(fd,&msg,sizeof(msg),0);//&#x544A;&#x8BC9;&#x670D;&#x52A1;&#x5668;&#x6682;&#x505C;\&#x6062;&#x590D;&#x53D1;&#x9001;&#x6570;&#x636E;
            if(ret == -1)
            perror("send");
        //  printf("msgtype  =%d ret = %d  fd = %d\n",msg.type_pth,ret,fd);
        }
    }
}

sqlite.c(登录与注册–客户端)

#include"sqlite.h"
extern int vip;

int login_reges_to_servises(int fd)
{
    char a =0;
    int m = 9;
    struct msgdata msg,msg1;
    bzero(&msg1,sizeof(msg1));
    //  bzero(&msg,sizeof(msg));
    recv(fd,&msg1,sizeof(msg1),0);
    while(1)
    {
        if(m == 0)
            return -1;
        char str[20] ={0};
        printf("\033[1;34mservices:%s\033[0m\n",msg1.data);
        fgets(str,sizeof(str),stdin);
        //  printf("%s\n",str);
        if(strlen(str) != 2  || (str[0] != '1' && str[0] != '2'))
        {
            printf("\033[0;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;&#xFF0C;&#x8BF7;&#x8F93;&#x5165;&#x6574;&#x6570;&#x2018;1&#x2019;&#xFF08;&#x767B;&#x9646;&#xFF09;&#x6216;&#x2018;2&#x2019;&#xFF08;&#x6CE8;&#x518C;).&#x4F60;&#x8FD8;&#x6709;%d&#x6B21;&#x673A;&#x4F1A;. \033[0m\n",--m);
        printf("\033[0;34m===========================================================\033[0m\n\n");
            continue;
        }else{
            a = str[0];
        }
        if(a == '1')
        {
            bzero(&msg,sizeof(msg));
            if(get_log(&msg,&m) == -1)
            {
                msg.type  = -1;
                send(fd,&msg,sizeof(msg),0);
                return -1;
            }else{
                msg.type =1;
            //  printf("msg:%s\n",msg.data);
                send(fd,&msg,sizeof(msg),0);//&#x53D1;&#x9001;&#x4FE1;&#x606F;
                                //      bzero(&msg,sizeof(msg));
                recv(fd,&msg,sizeof(msg),0);
            //  printf("msg.type = %d\n",msg.type);
                if(msg.type == -1)
                {
                    printf("\033[0;31m&#x5BC6;&#x7801;&#x6216;&#x5E10;&#x53F7;&#x9519;&#x8BEF;,&#x4F60;&#x8FD8;&#x6709;%d&#x6B21;&#x673A;&#x4F1A;\033[0m\n",--m);
        printf("\033[0;34m===========================================================\033[0m\n\n");

                    if(m == 0)
                        return -1;
                    continue;
                }else{
                    if(vip == 1 )
                    {

                    printf("\033[1;34m&#x767B;&#x9646;&#x6210;&#x529F;,&#x4EB2;&#x7231;&#x7684;VIP&#x3002;\033[0m\n");
        printf("\033[0;34m===========================================================\033[0m\n\n");
                    }else{

                    printf("\033[1;34m&#x767B;&#x9646;&#x6210;&#x529F;&#xFF0C;&#x4F60;&#x662F;&#x666E;&#x901A;&#x7528;&#x6237;&#xFF0C;&#x4E0B;&#x8F7D;&#x3001;&#x4E0A;&#x4F20;&#x901F;&#x5EA6;&#x4E0D;&#x662F;&#x5F88;&#x5999;.\033[0m\n");
        printf("\033[0;34m===========================================================\033[0m\n\n");
                    }
                    return 13;
                }

            }

        }else if(a == '2')
        {
            bzero(&msg,sizeof(msg));
            /*
                if(get_log(&msg,&m) == -1)
                {   msg.type = -1;
                send(fd,&msg,sizeof(msg),0);
                return -1;
                }*/

            puts("\033[1;34m&#x662F;&#x5426;&#x9700;&#x8981;&#x4F1A;&#x5458;&#xFF0C;y/n\033[0m");
            memset(str,0,sizeof(str));
            fgets(str,sizeof(str),stdin);
            if((strlen(str)) != 2  || (str[0] != 'y' && str[0] != 'n'))
            {
                printf("\033[0;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;&#xFF0C;&#x8BF7;&#x8F93;&#x5165;&#x6574;&#x6570;&#x2018;y'&#x6216;&#x2018;n&#x2019;,&#x4F60;&#x8FD8;&#x6709;%d&#x6B21;&#x673A;&#x4F1A;.\033[0m\n",--m);
        printf("\033[0;34m===========================================================\033[0m\n\n");
                continue;
            }

            if(str[0] == 'y')
            {
                vip = 1;
                msg.j =1;
            }else{
                vip = 0;
                msg.j = -1;
            }

            if(get_log(&msg,&m) == -1)
            {   msg.type = -1;
                send(fd,&msg,sizeof(msg),0);
                return -1;
            }else{

                msg.type =2;
            }

            send(fd,&msg,sizeof(msg),0);//&#x53D1;&#x9001;&#x4FE1;&#x606F;

            recv(fd,&msg,sizeof(msg),0);
            if(msg.type == 1)
            {
                vip *= 1;
                printf("\033[1;34m&#x6CE8;&#x518C;&#x6210;&#x529F;\033[0m\n");
        printf("\033[0;34m===========================================================\033[0m\n\n");
            //  printf("%d\n",vip);
                continue;
            }else{
                vip *= 0;

                printf("\033[1;31m%s\033[0m\n",msg.data);
                printf("\033[1;31m&#x6CE8;&#x518C;&#x5931;&#x8D25;,&#x8FD8;&#x6709;%d&#x6B21;&#x673A;&#x4F1A;\033[0m\n",--m);
        printf("\033[0;34m===========================================================\033[0m\n\n");
            //  printf("%d\n",vip);
                continue;
            }

        }else{
        printf("\033[0;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;\033[0m\n");
        printf("\033[0;34m===========================================================\033[0m\n\n");
        continue;
    }
}
return 0;
}

int get_log(struct msgdata *msg,int *n)
{
    char buf1[50] = {0};
    char buf2[50] = {0};
    char *p =NULL;

    while(1)
    {
        if(*n == 0)
            return -1;

        fflush(stdin);
        puts("\033[1;34m&#x8F93;&#x5165;&#x5E10;&#x53F7;(&#x4E0D;&#x8D85;&#x8FC7;8&#x4F4D;&#x7684;&#x5B57;&#x7B26;,&#x4E0D;&#x80FD;&#x5305;&#x542B;&#x7A7A;&#x683C;)\033[0m");
        fgets(buf1,sizeof(buf1),stdin);
        p = buf1 + strlen(buf1);
        *(--p) = '\0';

        puts("\033[1;34m&#x8F93;&#x5165;&#x5BC6;&#x7801;(&#x4E0D;&#x8D85;&#x8FC7;8&#x4F4D;&#x7684;&#x5B57;&#x7B26;&#xFF0C;&#x4E0D;&#x80FD;&#x5305;&#x542B;&#x7A7A;&#x683C;)\033[0m");
        fgets(buf2,sizeof(buf2),stdin);
        p = buf2 + strlen(buf2);
        *(--p) = '\0';

        if(strlen(buf1) >8 || strstr(buf1," ") != NULL  || strlen(buf2) >8 || strstr(buf2," ") != NULL )
        {
            *n -=1;
            printf("\033[0;31m&#x683C;&#x5F0F;&#x9519;&#x8BEF;&#xFF0C;&#x91CD;&#x65B0;&#x8F93;&#x5165;,&#x4F60;&#x8FD8;&#x6709;%d&#x6B21;&#x673A;&#x4F1A;\033[0m\n",*n);
        printf("\033[0;34m===========================================================\033[0m\n\n");
                continue;
        }else{

            printf("\033[1;34m&#x683C;&#x5F0F;&#x6B63;&#x786E;\033[0m\n");

            sprintf(msg->data,"%s %s",buf1,buf2);
        //  printf("%s\n",msg->data);
            return 0;
        }

    //  printf("n =%d\n",n);
    }
    return 0;
}

demo.h

#include<stdio.h>
#include <sys types.h>
#include <sys socket.h>
#include <unistd.h>
#include <arpa inet.h>
#include <stdlib.h>
#include <string.h>
#include <sys stat.h>
#include <fcntl.h>

#define cd  1
#define lcd     2
#define ls  3
#define lls     4
#define pwd     5
#define lpwd    6
#define cp  7
#define lcp 8
#define quit    9
struct msgdata{
    char filename[50];
    char data[300];
    int type;
    int file_len;
    int j;
    int type_pth;
};

char * strtok_str(char*,int i);//&#x5206;&#x5272;&#x5B57;&#x7B26;&#x4E32;
int connect_services(int argc,char* ip, char * port);//&#x94FE;&#x63A5;&#x670D;&#x52A1;&#x5668;
int get_command(char *str,int size,int *type);//&#x89E3;&#x6790;&#x547D;&#x4EE4;
int deal_comman(int type,char* str);//&#x5904;&#x7406;&#x547D;&#x4EE4;

int send_command_to_service(struct msgdata msg);//lls lpwd &#x90E8;&#x5206;&#x89E3;&#x6790;&#x540E;&#x547D;&#x4EE4;&#x53D1;&#x9001;&#x670D;&#x52A1;&#x5668;
int send_file_to_services(char *filename);//&#x53D1;&#x9001;&#x6587;&#x4EF6;&#x5230;&#x670D;&#x52A1;&#x5668;

int recv_file_from_services(char* str);//&#x63A5;&#x6536;&#x6587;&#x4EF6;

</fcntl.h></sys></string.h></stdlib.h></arpa></unistd.h></sys></sys></stdio.h>

pthread.h

#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include<stdio.h>
int pthread_interrupt( pthread_t*);//&#x5EFA;&#x7ACB;&#x7EBF;&#x7A0B;, cp(&#x4E0A;&#x4F20;&#x6587;&#x4EF6;)
int pthread_interrupt2( pthread_t*);//&#x5EFA;&#x7ACB;&#x7EBF;&#x7A0B; ,lcp(&#x4E0B;&#x8F7D;&#x6587;&#x4EF6;)
void * input();
void * input2();
</stdio.h></string.h></unistd.h></pthread.h>

sqlite.h

#include"demo.h"

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>

sqlite3** init_seqlite(char *r,sqlite3 ** db);//&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6570;&#x636E;
int init_usr(char* r , sqlite3* db);//&#x521B;&#x5EFA;&#x7528;&#x6237;

int login_reges_to_servises(int );// &#x5BA2;&#x6237;&#x7AEF;&#x8FDB;&#x5165;&#x767B;&#x9646;&#x6CE8;&#x518C;

int client_log_to_system(int fd);

int get_log(struct msgdata* ,int*);

</string.h></sqlite3.h></stdio.h>

makefile

test:client.o demo.o pthrea.o sqlite.o

    gcc  -Wall client.o demo.o pthrea.o sqlite.o  -o test -lsqlite3 -L/usr/local/lib -I/usr/local/include  -lpthread
client.o:client.c
    gcc -c client.c  -o client.o
demo.o:demo.c
    gcc -c demo.c -o demo.o
pthread.o:pthread.c
    gcc -c pthread.c -o pthread.o
sqlite.o:sqlite.c
    gcc -c sqlite.c -o sqlite.o

.PHONY:clean
clean:
    rm -r ./*.o test

Original: https://blog.csdn.net/x844049168/article/details/125836205
Author: 霄阳~
Title: 个人项目—-基于TCP的文件传输系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815134/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球