linux c 网盘、文件服务器

目录

 一、全部文件

 二、部分功能效果

 三、客户端

四、服务器 

五、参考文件

 一、全部文件


./..:
client  server

./../client:
client  client.c  client.h  downfile  getfilename.c  libclient.so  main.c  Makefile  README.txt

./../client/downfile:
1.jpg  2.jpg  3.jpg  4.jpg  5.jpg  6.jpg  a.txt  fight-loss.mp4

./../server:
1  error.txt  getfilename.c  libserver.so  main.c  Makefile  README.txt  server  server.c  server.h  usr  usr.db

./../server/1:
1.jpg  2.jpg  3.jpg  4.jpg  5.jpg  6.jpg  a.txt  downfile  fight-loss.mp4  新建文本文档.txt

./../server/1/downfile:
1.jpg


 二、部分功能效果


注册与登录 

 浏览云盘与上传

下载文件到本地 

注销用户 

 


 三、客户端

 client/


 main.c

#include"client.h"

int main(int argc, char **argv){
    d data;
    sockfd_init(&data, argc, argv);
    m msg;
    msg.connfd = data.sockfd;
    char buf[__usrlen];
    while(1){
        printf("##########\n1.regis\n2.login\n3.quit\n4.select\n5.upfile\n6.downfd\n7.The cancellation of the user\n8.select local files\n#########\n");
        fgets(buf, __usrlen, stdin);
        switch(buf[0]){
            case '1':
                regis(&msg);
                break;
            case '2':
                login(&msg);
                break;
            case '3':
                quit(&msg);
                break;
            case '4':
                sltall(&msg);
                break;
            case '5':
                upfile(&msg);
                break;
            case '6':
                downfd(&msg);
                break;
            case '7':
                cancel(&msg);
            case '8':
                localfile(&msg);
        }
    }
}

client.h

#ifndef _CLIENT_H_
#define _CLIENT_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>

#define CORVAL 1
#define NORVAL 0
#define ERRVAL -1
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define handle_error(LOG) do { perror(LOG); exit(EXIT_FAILURE); } while(0)
#define qDbug() do { puts(_STR(__LINE__)); } while(0)
#define __port 50000
#define __ip "192.168.223.132"
#define __usrlen 64
#define __textlen 1024
#define R 'R'
#define L 'L'
#define Q 'Q'
#define S 'S'
#define U 'U'
#define D 'D'
#define C 'C'
#define __mode 0777
#define __buflen 128

typedef struct data{
    int sockfd;
    struct sockaddr_in saddr;
    socklen_t addrlen;
}d, *dp;

typedef struct msg{
    int ret;
    char type;
    char usrname[__usrlen];
    char usrpass[__usrlen];
    char filename[__buflen];
    char text[__textlen];
    int connfd;
    int flag;
}m, *mp;

void sockfd_init(dp, int, char **);
void regis(mp);
void login(mp);
void quit(mp);
void sltall(mp);
void upfile(mp);
void downfd(mp);
void cancel(mp);
void localfile(mp);
int readFileList(char *, char *);
int lookFileList(char *);

#endif

 client.c

#include"client.h"

void sockfd_init(dp data, int argc, char **argv){
    if(1 == argc){
        printf("whether to manually enter IP and PORT(y/n)\n");
        int answer;
        while(1){
            if(89 == (answer = fgetc(stdin)) || 121 == answer){
                printf("please use '%s < IP > < PORT >'\n", argv[0]);
                getchar();
                exit(EXIT_SUCCESS);
            }
            else if(78 == answer || 110 == answer){
                printf("the default settings will be used\n");
                getchar();
                break;
            }
            else{
                printf("please use y or n (case sensitive)\n");
                getchar();
            }
        }
    }
    else if(3 == argc){
        printf("using manual setting\n");
    }
    data->sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    data->saddr.sin_family = AF_INET;
    if(1 == argc){
        data->saddr.sin_port = htons(__port);
        data->saddr.sin_addr.s_addr = inet_addr(__ip);
        printf("ip:%s port:%d\n", __ip, __port);
    }
    else if(3 == argc){
        data->saddr.sin_port = htons(atoi(argv[2]));
        data->saddr.sin_addr.s_addr = inet_addr(argv[1]);
        printf("ip:%s port:%s\n", argv[1], argv[2]);
    }
    else{
        printf("too few arguments to server\n");
        exit(EXIT_FAILURE);
    }
    data->addrlen = sizeof(data->saddr);
    int nSendBuf = 512*1024*1024;
    int nRecvBuf = 512*1024*1024;
    setsockopt(data->sockfd, SOL_SOCKET, SO_SNDBUF, (const char *)&nSendBuf, sizeof(int));
    setsockopt(data->sockfd, SOL_SOCKET, SO_RCVBUF, (const char *)&nRecvBuf, sizeof(int));
    connect(data->sockfd, (const struct sockaddr *)&data->saddr, data->addrlen);
}

void regis(mp msg){
    msg->type = R;
    memset(msg->usrname, '\0', __usrlen);
    printf("please input your usrname\n");
    fgets(msg->usrname, __usrlen, stdin);
    msg->usrname[strlen(msg->usrname) - 1] = '\0';
    //printf("%s\n", msg->usrname);

    memset(msg->usrpass, '\0', __usrlen);
    printf("please input your usrpass\n");
    fgets(msg->usrpass, __usrlen, stdin);
    msg->usrpass[strlen(msg->usrpass) - 1] = '\0';
    //printf("%s\n", msg->usrname);

    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
}

void login(mp msg){
    msg->type = L;
    printf("please input your usrname\n");
    memset(msg->usrname, '\0', __usrlen);
    fgets(msg->usrname, __usrlen, stdin);
    msg->usrname[strlen(msg->usrname) - 1] = '\0';
    //printf("%s\n", msg->usrname);

    printf("please input your usrpass\n");
    memset(msg->usrpass, '\0', __usrlen);
    fgets(msg->usrpass, __usrlen, stdin);
    msg->usrpass[strlen(msg->usrpass) - 1] = '\0';
    //printf("%s\n", msg->usrname);

    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
}

void quit(mp msg){
    msg->type = Q;
    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
    close(msg->connfd);
    exit(0);
}

void sltall(mp msg){
    msg->type = S;
    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
}

void upfile(mp msg){
    msg->type = U;
    memset(msg->filename, '\0', __buflen);
    printf("witch file do you want to up\n");
    fgets(msg->filename, __buflen, stdin);
    msg->filename[strlen(msg->filename) - 1] = '\0';
    int fd = open(msg->filename, O_RDONLY);
    struct stat buf;
    fstat(fd, &buf);
    msg->ret = buf.st_size;
    send(msg->connfd, msg, sizeof(*msg), 0);
    msg->type = 'u';
    while(0 < (msg->ret = read(fd, msg->text, __textlen))){
        send(msg->connfd, msg->text, msg->ret, 0);
        memset(msg->text, '\0', __textlen);
    }
    memset(msg->text, '\0', __textlen);
#if 1
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
#endif
}

void downfd(mp msg){
    int st_size, now_size = 0;
    msg->type = D;
    char buf[__usrlen];
    struct stat buf_stat;
    memset(buf, '\0', __buflen);
    memset(msg->filename, '\0', __buflen);
    printf("witch file do you want to down\n");
    fgets(msg->filename, __buflen, stdin);
    msg->filename[strlen(msg->filename) - 1] = '\0';
    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    if(0 != strcmp(msg->text, "downfd failed")){
        int i = 0, j = 0;
        for(i = 0; i < strlen(msg->filename); i++){
            if('/' == msg->filename[i]){
                j = ++i;
            }
        }
        i = 0;
        while(j < strlen(msg->filename)) buf[i++] = msg->filename[j++];
        mkdir("downfile", __mode);
        char temp[__usrlen];
        memset(temp, '\0', __usrlen);
        strcpy(temp, "downfile/");
        strcat(temp, buf);
        strcpy(buf, temp);
        if(1 == readFileList("downfile/", buf)){
            memset(temp, '\0', __usrlen);
            strcpy(temp, "rm ");
            strcat(temp, buf);
            FILE *stream;
            stream = popen(temp, "r");
            memset(temp, '\0', __usrlen);
            pclose(stream);
        }
        int fd, num, oldnum;
        sleep(1);
        recv(msg->connfd, &msg->ret, sizeof(msg->ret), 0);
        st_size = msg->ret;
        memset(msg->text, '\0', __textlen);
        sleep(1);
        while(0 < (msg->ret = recv(msg->connfd, msg->text, __textlen, 0))){
            if(0 == strncmp(msg->text, "not found this file", strlen("not found this file"))){
                puts(msg->text);
                goto _loop;
            }
            fd = open(buf, O_CREAT | O_APPEND | O_WRONLY, __mode);
            write(fd, msg->text, msg->ret);
            now_size += msg->ret;
            num = 100*now_size/st_size;
            if(oldnum != num)
                printf("%d%%-------------------------------%d/%d\n", num, now_size, st_size);
            memset(msg->text, '\0', __textlen);
            close(fd);
            if(st_size == now_size) break;
            oldnum = num;
        }
        puts("downfd success");
        memset(buf, '\0', __buflen);
        memset(msg->text, '\0', __textlen);
    }
_loop:
    ;
}

void cancel(mp msg){
    msg->type = C;
    send(msg->connfd, msg, sizeof(m), 0);
    memset(msg->text, '\0', __textlen);
    recv(msg->connfd, msg->text, __textlen, 0);
    puts(msg->text);
    memset(msg->text, '\0', __textlen);
}

void localfile(mp msg){
    lookFileList("downfile");
}

getfilename.c

#include"client.h"

int readFileList(char *basePath, char *path)
{
    DIR *dir;
    struct dirent *ptr;
    char base[1000];
    char buf[__usrlen];
    if ((dir=opendir(basePath)) == NULL)
    {
        perror("Open dir error...");
        exit(1);
    }
    while ((ptr=readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
            continue;
        else if(ptr->d_type == 8){ ///file
            strcpy(buf, basePath);
            strcat(buf, ptr->d_name);
            if(0 == strncmp(buf,path,strlen(path))){
                closedir(dir);
                return 1;
            }
            memset(buf, 0, __usrlen);
        }
        else if(ptr->d_type == 4) ///dir
        {
            memset(base,'\0',sizeof(base));
            strcpy(base,basePath);
            strcat(base,"/");
            strcat(base,ptr->d_name);
            readFileList(base, path);
        }
    }
    closedir(dir);
    return 0;
}

int lookFileList(char *basePath)
{
    DIR *dir;
    struct dirent *ptr;
    char base[1000];
    char buf[__usrlen];
    if ((dir=opendir(basePath)) == NULL)
    {
        perror("Open dir error...");
        exit(1);
    }
    while ((ptr=readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
            continue;
        else if(ptr->d_type == 8){ ///file
            puts(ptr->d_name);
        }
        else if(ptr->d_type == 4) ///dir
        {
            memset(base,'\0',sizeof(base));
            strcpy(base,basePath);
            strcat(base,"/");
            strcat(base,ptr->d_name);
            lookFileList(base);
        }
    }
    closedir(dir);
    return 0;
}

makefile

Target = client
CC = gcc
lib = libclient.so
objects = main.o client.o getfilename.o
OBJS = $(wildcard *.o)
hpp = $(wildcard *.h)

$(Target): $(lib) $(objects)
	$(CC) main.o -lclient -L. -o $(Target) -Wl,-rpath=. -lsqlite3
$(lib): client.o getfilename.o
	$(CC) -shared $^ -o $(lib) -lsqlite3

client.o: client.c $(hpp)
	$(CC) -c -fPIC $< -o $@ -lsqlite3
getfilename.o: getfilename.c $(hpp)
	$(CC) -c -fPIC $< -o $@
main.o: main.c $(hpp)
	$(CC) -c $< -o $@ -lsqlite3

.PHONY : clean cleanexe unistall

clean :
	-rm $(OBJS)

cleanall :
	$(clean) $(Target) $(lib)

#uninstall should be used with caution
uninstall :
	-rm *
	echo Unistall Successfully!
	echo Thanks for Using!

四、服务器 

server/


main.c

#include"server.h"

int main(int argc, char **argv){
    d data;
    signal(SIGCHLD, handler);
    listenfd_init(&data, argc, argv);
    libusrdb_init();
    struct sockaddr_in caddr;
    socklen_t addrlen = sizeof(caddr);
    pid_t pid;
    int ret;
    while(1){
        int connfd = accept(data.sockfd, (struct sockaddr *)&caddr, &addrlen);
        pid = fork();
        if(0 == pid){
            close(data.sockfd);
            m msg;
            while(1){
                memset(&msg, 0, sizeof(m));
                //while(0 < (ret = recv(connfd, &msg, sizeof(m), 0))){
                ret = recv(connfd, &msg, sizeof(m), 0);
                    if(-1 == ret)
                        handle_error("recv");
                    switch(msg.type){
                        case R:
                            regis(connfd, &msg);
                            break;
                        case L:
                            login(connfd, &msg);
                            break;
                        case Q:
                            quit(connfd, &msg);
                            break;
                        case S:
                            sltall(connfd, &msg);
                            break;
                        case U:
                            upfile(connfd, &msg);
                            break;
                        case D:
                            downfd(connfd, &msg);
                            break;
                        case C:
                            cancel(connfd, &msg);
                            break;
                        default :
                            break;
                    }
                msg.type = 'u';
                //}
            }
        }
        else{
            close(connfd);
        }
    }
}

server.h

#ifndef _SERVER_H_
#define _SERVER_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<signal.h>
#include<sys/wait.h>
#include<sqlite3.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<dirent.h>

#define CORVAL 1
#define NORVAL 0
#define ERRVAL -1
#define _STR(x) _VAL(x)
#define _VAL(x) #x
#define handle_error(LOG) do { perror(LOG); exit(EXIT_FAILURE); } while(0)
#define qDbug() do { puts(_STR(__LINE__)); } while(0)
#define __port 50000
#define __backlog 100
#define __usrlen 64
#define __textlen 1024
#define R 'R'
#define L 'L'
#define Q 'Q'
#define S 'S'
#define U 'U'
#define D 'D'
#define C 'C'
#define __mode 0777
#define __buflen 128

typedef struct data{
    int sockfd;
    struct sockaddr_in saddr;
    socklen_t addrlen;
}d, *dp;

typedef struct msg{
    int ret;
    char type;
    char usrname[__usrlen];
    char usrpass[__usrlen];
    char filename[__buflen];
    char text[__textlen];
    int connfd;
    int flag;
}m, *mp;


void handler(int);
void listenfd_init(dp, int, char **);
void libusrdb_init();
void regis(int, mp);
void login(int, mp);
void quit(int, mp);
void sltall(int, mp);
void upfile(int, mp);
void downfd(int, mp);
void cancel(int, mp);
int readFileList(char *, char *);
int findFileList(char *basePath, char *path);

#endif

server.c

#include"server.h"

sqlite3 *usrdb = NULL;
char *errmsg = NULL;

void handler(int signum){
    wait(NULL);
}

void listenfd_init(dp data, int argc, char **argv){
    if(1 == argc){
        printf("whether to manually enter IP and PORT(y/n)\n");
        int answer;
        while(1){
            if(89 == (answer = fgetc(stdin)) || 121 == answer){
                printf("please use '%s < IP > < PORT >'\n", argv[0]);
                getchar();
                exit(EXIT_SUCCESS);
            }
            else if(78 == answer || 110 == answer){
                printf("the default settings will be used\n");
                getchar();
                break;
            }
            else{
                printf("please use y or n (case sensitive)\n");
                getchar();
            }
        }
    }
    else if(3 == argc){
        printf("using manual setting\n");
    }
    data->sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    data->saddr.sin_family = AF_INET;
    if(1 == argc){
        data->saddr.sin_port = htons(__port);
        data->saddr.sin_addr.s_addr = INADDR_ANY;
        printf("ip:0.0.0.0 port:%d\n", __port);
    }
    else if(3 == argc){
        data->saddr.sin_port = htons(atoi(argv[2]));
        data->saddr.sin_addr.s_addr = inet_addr(argv[1]);
        printf("ip:%s port:%s\n", argv[1], argv[2]);
    }
    else{
        printf("too few arguments to server\n");
        exit(EXIT_FAILURE);
    }
    data->addrlen = sizeof(data->saddr);
    bind(data->sockfd, (const struct sockaddr *)&data->saddr, data->addrlen);
    listen(data->sockfd, __backlog);
    int nSendBuf = 512*1024*1024;
    int nRecvBuf = 512*1024*1024;
    setsockopt(data->sockfd, SOL_SOCKET, SO_SNDBUF, (const char *)&nSendBuf, sizeof(int));
    setsockopt(data->sockfd, SOL_SOCKET, SO_RCVBUF, (const char *)&nRecvBuf, sizeof(int));
}

void libusrdb_init(){
    sqlite3_open("usr.db", &usrdb);
    sqlite3_exec(usrdb, "CREATE TABLE if not exists usr(usrname text, usrpass text, usrpath text);", NULL, NULL, &errmsg);
}

int callback_reg(void *para, int f_num, char **f_value, char **f_name){
    send(((mp)para)->connfd, "The usrname has been occupied", strlen("The usrname has been occupied"), 0);
    ((mp)para)->flag = 0;
}

void regis(int connfd, mp msg){
    msg->connfd = connfd;
    msg->flag = 1;
    char buf[__usrlen];
    char path[__usrlen];
    memset(path, '\0', __usrlen);
    sprintf(buf, "SELECT * FROM usr WHERE usrname == '%s';", (*msg).usrname);
    sqlite3_exec(usrdb, buf, callback_reg, msg, &errmsg);
    while(msg->flag--){
        strcpy(path, (*msg).usrname);
        mkdir(path, __mode);
        sprintf(buf, "INSERT INTO usr VALUES('%s', '%s', '%s'); ", (*msg).usrname, (*msg).usrpass, (*msg).usrname);
        if(SQLITE_OK != sqlite3_exec(usrdb, buf, NULL, NULL, &errmsg)) printf("%s\n", errmsg);
        send(connfd, "register success", strlen("register success"), 0);
    }
}

int callback_log(void *para, int f_num, char **f_value, char **f_name){
    if(0 == strcmp(f_value[1], ((mp)para)->usrpass)){
        send(((mp)para)->connfd, "login success", strlen("login success"), 0);
        ((mp)para)->flag = 0;
    }
}

void login(int connfd, mp msg){
    msg->connfd = connfd;
    msg->flag = 1;
    char buf[__usrlen];
    sprintf(buf, "SELECT * FROM usr WHERE usrname == '%s';", (*msg).usrname);
    sqlite3_exec(usrdb, buf, callback_log, msg, &errmsg);
    while(msg->flag--){
        send(connfd, "login failed", strlen("login failed"), 0);
    }
}

void quit(int connfd, mp msg){
    send(connfd, "you have exited", strlen("you have exited"), 0);
    close(connfd);
    exit(0);
}

int callback_st(void *para, int f_num, char **f_value, char **f_name){
    char buf[__usrlen];
    memset(buf, '\0', __usrlen);
    strcpy(buf, "ls -R ");
    strcat(buf, f_value[2]);
    FILE *stream;
    stream = popen(buf, "r");
    memset(buf, '\0', __usrlen);
    memset((*(mp)para).text, '\0', __textlen);
    while(0 != fgets(buf, __usrlen, stream)){
        strcat((*(mp)para).text, buf);
    }
    send((*(mp)para).connfd, (*(mp)para).text, __textlen, 0);
    pclose(stream);
    (*(mp)para).flag = 0;
}

void sltall(int connfd, mp msg){
    msg->connfd = connfd;
    msg->flag = 1;
    char buf[__usrlen];
    sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
    sqlite3_exec(usrdb, buf, callback_st, msg, &errmsg);
    while(msg->flag--){
        send(connfd, "select failed", strlen("select failed"), 0);
    }

}

int callback_up(void *para, int f_num, char **f_value, char **f_name){
    char basepath[__usrlen];
    char path[__usrlen];
    memset(basepath, '\0', __usrlen);
    memset(path, '\0', __usrlen);
    strcpy(path, "./");
    strcat(path, f_value[2]);
    strcat(path, "/");
    strcpy(basepath, path);
    strcat(path, (*(mp)para).filename);
    int len = strlen(path);
    char buf[__usrlen];
    memset(buf, '\0', __usrlen);
    int i = 0, j = -1;
    for(i = 0; i < len; i++){
        if('/' == path[i]){
            if(0 < j++){
                strncpy(buf, path, i);
                mkdir(buf, __mode);
                memset(buf, '\0', __usrlen);
            }
        }
    }
    if((*(mp)para).flag != 0){
        if(1 == readFileList(basepath, path)){
            memset(buf, '\0', __usrlen);
            strcpy(buf, "rm ");
            strcat(buf, path);
            FILE *stream;
            stream = popen(buf, "r");
            memset(buf, '\0', __usrlen);
            pclose(stream);
        }
    }
    int fd = open(path, O_WRONLY | O_CREAT | O_APPEND, __mode);
    write(fd, (*(mp)para).text, (*(mp)para).ret);
    close(fd);
    (*(mp)para).flag = 0;
}
void upfile(int connfd, mp msg){
    msg->connfd = connfd;
    msg->flag = 1;
    int st_size = msg->ret;
    int now_size = 0;
    char buf[__usrlen];
    sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
    while(0 < (msg->ret = recv(connfd, msg->text, __textlen, 0))){
        sqlite3_exec(usrdb, buf, callback_up, msg, &errmsg);
        now_size += msg->ret;
        if(st_size == now_size) break;
    }
    if(0 == msg->flag){
        send(connfd, "upfile success", strlen("upfile success"), 0);
    }
    while(msg->flag--){
        send(connfd, "upfile failed", strlen("upfile failed"), 0);
    }
}

int callback_df(void *para, int f_num, char **f_value, char **f_name){
    send((*(mp)para).connfd, "please wait", sizeof("please wait"), 0);
    int fd;
    struct stat buf;
    char path[__usrlen];
    int flag = 0;
    memset(path, '\0', __usrlen);
    for(int i = 0; i < strlen((*(mp)para).filename); i++){
        if('/' == (*(mp)para).filename[i] && 0 == strncmp((*(mp)para).usrname, (*(mp)para).filename, i - 1)){
            strcpy(path, (*(mp)para).filename);
            flag = 1;
            break;
        }
    }
    if(1 != flag){
        strcat(path, "./");
        strcat(path, (*(mp)para).usrname);
        strcat(path, "/");
        if(1 == findFileList(path, (*(mp)para).filename)){
            //strcpy(path, (*(mp)para).filename);
        }
        else{
            memset(path, 0, __usrlen);
            strcpy(path, "error.txt");
            fd = open(path, O_RDWR | O_CREAT, __mode);
            write(fd, "not found this file", sizeof("not found this file"));
            close(fd);
            fd = open(path, O_RDONLY);
            fstat(fd, &buf);
            (*(mp)para).ret = buf.st_size;
            sleep(1);
            send((*(mp)para).connfd, &((*(mp)para).ret), sizeof((*(mp)para).ret), 0);
            sleep(1);
            while(0 < ((*(mp)para).ret = read(fd, (*(mp)para).text, __textlen))){
                send((*(mp)para).connfd, (*(mp)para).text, (*(mp)para).ret, 0);
                memset((*(mp)para).text, 0, __textlen);
            }
            close(fd);
            goto _loop;
        }
    }
    fd = open(path, O_RDONLY);
    fstat(fd, &buf);
    (*(mp)para).ret = buf.st_size;
    sleep(1);
    send((*(mp)para).connfd, &((*(mp)para).ret), sizeof((*(mp)para).ret), 0);
    sleep(1);
    while(0 < ((*(mp)para).ret = read(fd, (*(mp)para).text, __textlen))){
        send((*(mp)para).connfd, (*(mp)para).text, (*(mp)para).ret, 0);
        memset((*(mp)para).text, 0, __textlen);
    }
    close(fd);
_loop:
    ;
    (*(mp)para).flag = 0;
}

void downfd(int connfd, mp msg){
    msg->connfd = connfd;
    msg->flag = 1;
    char buf[__usrlen];
    sprintf(buf, "SELECT * FROM usr WHERE usrpath == '%s';", (*msg).usrname);
    sqlite3_exec(usrdb, buf, callback_df, msg, &errmsg);
    while(msg->flag--){
        send(connfd, "downfd failed", strlen("downfd failed"), 0);
    }

}

void cancel(int connfd, mp msg){
    char buf[__usrlen];
    memset(buf, '\0', __usrlen);
    sprintf(buf, "DELETE FROM usr WHERE usrname == '%s';", (*msg).usrname);
    sqlite3_exec(usrdb, buf, NULL, NULL, &errmsg);
    memset(buf, '\0', __usrlen);
    strcpy(buf, "rm -r ");
    strcat(buf, (*msg).usrname);
    FILE *stream;
    stream = popen(buf, "r");
    memset(buf, '\0', __usrlen);
    pclose(stream);
    send(connfd, "cancel success", strlen("cancel success"), 0);
}

getfilename.c

#include"server.h"

int readFileList(char *basePath, char *path)
{
    DIR *dir;
    struct dirent *ptr;
    char base[1000];
    char buf[__usrlen];
    if ((dir=opendir(basePath)) == NULL)
    {
        perror("Open dir error...");
        exit(1);
    }
    while ((ptr=readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
            continue;
        else if(ptr->d_type == 8){ ///file
            strcpy(buf, basePath);
            strcat(buf, ptr->d_name);
            if(0 == strncmp(buf,path,strlen(path))){
                closedir(dir);
                return 1;
            }
            memset(buf, 0, __usrlen);
        }
        else if(ptr->d_type == 4) ///dir
        {
            memset(base,'\0',sizeof(base));
            strcpy(base,basePath);
            strcat(base,"/");
            strcat(base,ptr->d_name);
            readFileList(base, path);
        }
    }
    closedir(dir);
    return 0;
}

int findFileList(char *basePath, char *path)
{
    DIR *dir;
    struct dirent *ptr;
    char base[1000];
    char buf[__usrlen];
    if ((dir=opendir(basePath)) == NULL)
    {
        perror("Open dir error...");
        exit(1);
    }
    while ((ptr=readdir(dir)) != NULL)
    {
        if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
            continue;
        else if(ptr->d_type == 8){ ///file
#if 0
            strcpy(buf, basePath);
            strcat(buf, ptr->d_name);
#endif
            strcpy(buf, ptr->d_name);
            if(0 == strncmp(buf,path,strlen(path))){
                closedir(dir);
                strcpy(buf, basePath);
                strcat(buf, ptr->d_name);
                memset(basePath, 0, strlen(basePath));
                strcpy(*&basePath, buf);
                return 1;
            }
            memset(buf, 0, __usrlen);
        }
        else if(ptr->d_type == 4) ///dir
        {
            memset(base,'\0',sizeof(base));
            strcpy(base,basePath);
            strcat(base,"/");
            strcat(base,ptr->d_name);
            readFileList(base, path);
        }
    }
    closedir(dir);
    return 0;
}

makefile

Target = server
CC = gcc
lib = libserver.so
objects = main.o server.o getfilename.o
OBJS = $(wildcard *.o)
hpp = $(wildcard *.h)

#$(Target): $(objects) server.h
#	$(CC) -o $@ $^

$(Target): $(lib) $(objects)
	$(CC) main.o -lserver -L. -o $(Target) -Wl,-rpath=. -lsqlite3
$(lib): server.o getfilename.o
	$(CC) -shared $^ -o $(lib) -lsqlite3

server.o: server.c $(hpp)
	$(CC) -c -fPIC $< -o $@ -lsqlite3
getfilename.o: getfilename.c $(hpp)
	$(CC) -c -fPIC $< -o $@
main.o: main.c $(hpp)
	$(CC) -c $< -o $@ -lsqlite3

.PHONY : clean cleanexe unistall

clean :
	-rm $(OBJS)

cleanall :
	$(clean) $(Target) $(lib)

#uninstall should be used with caution
uninstall :
	-rm *
	echo Unistall Successfully!
	echo Thanks for Using!

五、参考文件

(1条消息) Linux C 读取文件夹下所有文件(包括子文件夹)的文件名_AI蜗牛之家-CSDN博客

 makefile介绍 — 跟我一起写Makefile 1.0 文档 (seisman.github.io)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值