From 97cf4db04d0020cbbe4edcfc0c05b1f7b6b3697f Mon Sep 17 00:00:00 2001 From: fumiama Date: Wed, 17 Feb 2021 14:32:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E3=80=81cat=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + CMakeLists.txt | 13 +++++ client | Bin 16800 -> 0 bytes client.c | 37 ++++++++---- server | Bin 25904 -> 0 bytes server.c | 154 +++++++++++++++++++++++++++++++++++-------------- 6 files changed, 153 insertions(+), 53 deletions(-) create mode 100644 .gitignore create mode 100644 CMakeLists.txt delete mode 100644 client delete mode 100644 server diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1899660 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +.vscode \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b726dd1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +project(simple-dict-server) +add_executable(simple-dict-server server.c) # 生成可执行文件 +add_executable(simple-dict-client client.c) # 生成可执行文件 +target_link_libraries( # 目标库 + simple-dict-server + + # 目标库需要链接的库 + pthread) +target_link_libraries( # 目标库 + simple-dict-client + + # 目标库需要链接的库 + pthread) diff --git a/client b/client deleted file mode 100644 index 57b37f9592904dd5eec176c5e9ad27cb3db69713..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16800 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 diff --git a/client.c b/client.c index 9e30e95..40e638b 100644 --- a/client.c +++ b/client.c @@ -7,11 +7,25 @@ #include #include #include +#include + +int sockfd; +char buf[BUFSIZ]; +char bufr[BUFSIZ]; +struct sockaddr_in their_addr; +pthread_t thread; + +void getMessage(void *p) { + int c = 0; + while((c = recv(sockfd, bufr, BUFSIZ, 0)) > 0) { + printf("Recv %d bytes: ", c); + for(int i = 0; i < c; i++) putchar(bufr[i]); + putchar('\n'); + } +} int main(int argc,char *argv[]) { //usage: ./client host port - int sockfd, numbytes; - char buf[BUFSIZ]; - struct sockaddr_in their_addr; + ssize_t numbytes; puts("break!"); while((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1); puts("Get sockfd"); @@ -25,14 +39,15 @@ int main(int argc,char *argv[]) { //usage: ./client host port numbytes = recv(sockfd, buf, BUFSIZ,0); buf[numbytes]='\0'; puts(buf); - while(1) { - printf("Enter command:"); - scanf("%s",buf); - numbytes = send(sockfd, buf, strlen(buf), 0); - numbytes = recv(sockfd,buf,BUFSIZ,0); - buf[numbytes]='\0'; - puts(buf); - } + if(!pthread_create(&thread, NULL, (void*)&getMessage, NULL)) { + puts("Thread create succeeded"); + while(1) { + printf("Enter command:"); + scanf("%s",buf); + numbytes = send(sockfd, buf, strlen(buf), 0); + sleep(1); + } + } else perror("Create msg thread failed"); close(sockfd); return 0; } diff --git a/server b/server deleted file mode 100644 index cc23361b6293ff5e193496a37086e3d0a82cf7b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25904 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 #include #include +#include #include #include #include @@ -9,16 +10,26 @@ #include #include #include +#include +#include -int fd, accept_fd; +int fd; ssize_t numbytes; socklen_t struct_len = sizeof(struct sockaddr_in); struct sockaddr_in server_addr; struct sockaddr_in client_addr; char buff[BUFSIZ]; -char buff2[BUFSIZ]; FILE *fp = NULL; char *file_path; +pthread_t accept_threads[8]; + +#define MAXWAITSEC 10 +struct THREADTIMER { + pthread_t *thread; + time_t touch; + int accept_fd; +}; +typedef struct THREADTIMER THREADTIMER; #define DATASIZE 64 struct DICTBLK{ @@ -34,17 +45,21 @@ DICTBLK dict; #define showUsage(program) printf("Usage: %s [-d] listen_port try_times dict_file\n\t-d: As daemon\n", program) void acceptClient(); +void acceptTimer(void *p); int bindServer(uint16_t port, u_int try_times); -int checkBuffer(); +int checkBuffer(int accept_fd); off_t fileSize(const char* fname); +void handleAccept(void *accept_fd_p); +void handle_quit(int signo); int listenSocket(u_int try_times); -int sendData(char *data, size_t length); -int s0_init(int *s); -int s1_get(int *s); -int s2_set(int *s); -int s3_setData(int *s); -int s4_del(int *s); -int s5_list(int *s); +int sendAll(int accept_fd); +int sendData(int accept_fd, char *data, size_t length); +int s0_init(int *s, int accept_fd); +int s1_get(int *s, int accept_fd); +int s2_set(int *s, int accept_fd); +int s3_setData(int *s, int accept_fd); +int s4_del(int *s, int accept_fd); +int s5_list(int *s, int accept_fd); int bindServer(uint16_t port, u_int try_times) { int fail_count = 0; @@ -78,7 +93,7 @@ int listenSocket(u_int try_times) { } } -int sendData(char *data, size_t length) { +int sendData(int accept_fd, char *data, size_t length) { if(send(accept_fd, data, length, 0) < 0) { perror("Send data error"); return 0; @@ -90,16 +105,28 @@ int sendData(char *data, size_t length) { } } -int s0_init(int *s) { +int sendAll(int accept_fd) { + int re = 1; + rewind(fp); + sprintf(buff, "%zd", fileSize(file_path)); + re = sendData(accept_fd, buff, strlen(buff)); + while((numbytes = fread(buff, 1, BUFSIZ, fp)) > 0) { + re = sendData(accept_fd, buff, numbytes); + } + return re; +} + +int s0_init(int *s, int accept_fd) { if(!strcmp("get", buff)) *s = 1; else if(!strcmp("set", buff)) *s = 2; else if(!strcmp("del", buff)) *s = 4; else if(!strcmp("lst", buff)) *s = 5; + else if(!strcmp("cat", buff)) return sendAll(accept_fd); else if(!strcmp("quit", buff)) return 0; - return sendData(buff, numbytes); + return sendData(accept_fd, buff, numbytes); } -int s1_get(int *s) { +int s1_get(int *s, int accept_fd) { rewind(fp); while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { u_char ks = dict.keysize; @@ -107,11 +134,11 @@ int s1_get(int *s) { printf("[%s] Look key: (%d)%s\n", buff, ks, dict.key); if(!strcmp(buff, dict.key)) { *s = 0; - return sendData(dict.data, dict.datasize); + return sendData(accept_fd, dict.data, dict.datasize); } } *s = 0; - return sendData("null", 4); + return sendData(accept_fd, "null", 4); } #define copyKey() {\ @@ -119,7 +146,7 @@ int s1_get(int *s) { strncpy(dict.key, buff, (DATASIZE-1));\ } -int s2_set(int *s) { +int s2_set(int *s, int accept_fd) { rewind(fp); *s = 3; while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { @@ -129,29 +156,29 @@ int s2_set(int *s) { if(!dict.keysize || !strcmp(buff, dict.key)) { copyKey(); fseek(fp, -DICTBLKSZ, SEEK_CUR); - return sendData("data", 4); + return sendData(accept_fd, "data", 4); } } copyKey(); fseek(fp, 0, SEEK_END); - return sendData("data", 4); + return sendData(accept_fd, "data", 4); } -int s3_setData(int *s) { +int s3_setData(int *s, int accept_fd) { dict.datasize = (numbytes >= (DATASIZE-1))?(DATASIZE-1):numbytes; memcpy(dict.data, buff, dict.datasize); *s = 0; if(fwrite(&dict, DICTBLKSZ, 1, fp) != 1) { fprintf(stderr, "Error set data: dict[%s]=%s\n", dict.key, buff); - return sendData("erro", 4); + return sendData(accept_fd, "erro", 4); } else { printf("Set data: dict[%s]=%s\n", dict.key, buff); fflush(fp); - return sendData("succ", 4); + return sendData(accept_fd, "succ", 4); } } -int s4_del(int *s) { +int s4_del(int *s, int accept_fd) { rewind(fp); *s = 0; while(fread(&dict, DICTBLKSZ, 1, fp) > 0) { @@ -159,10 +186,10 @@ int s4_del(int *s) { if(!strcmp(buff, dict.key)) { fseek(fp, -DICTBLKSZ+(DATASIZE-1), SEEK_CUR); fputc(0, fp); - return sendData("succ", 4); + return sendData(accept_fd, "succ", 4); } } - return sendData("null", 4); + return sendData(accept_fd, "null", 4); } off_t fileSize(const char* fname) { @@ -171,7 +198,7 @@ off_t fileSize(const char* fname) { else return -1; } -int s5_list(int *s) { +int s5_list(int *s, int accept_fd) { *s = 0; off_t size = fileSize(file_path) / DICTBLKSZ; char *keys = calloc(size, DATASIZE); @@ -188,42 +215,85 @@ int s5_list(int *s) { } } int len = strlen(keys); - if(len > 0) return sendData(keys, len); - else return sendData("null", 4); - } else return sendData("erro", 4); + if(len > 0) return sendData(accept_fd, keys, len); + else return sendData(accept_fd, "null", 4); + } else return sendData(accept_fd, "erro", 4); } -int checkBuffer() { +int checkBuffer(int accept_fd) { static int s = 0; printf("Status: %d\n", s); switch(s) { - case 0: return s0_init(&s); break; - case 1: return s1_get(&s); break; - case 2: return s2_set(&s); break; - case 3: return s3_setData(&s); break; - case 4: return s4_del(&s); break; - case 5: return s5_list(&s); break; + case 0: return s0_init(&s, accept_fd); break; + case 1: return s1_get(&s, accept_fd); break; + case 2: return s2_set(&s, accept_fd); break; + case 3: return s3_setData(&s, accept_fd); break; + case 4: return s4_del(&s, accept_fd); break; + case 5: return s5_list(&s, accept_fd); break; default: return -1; break; } } -void acceptClient() { - puts("Ready for accept, waitting..."); - accept_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len); +void handle_quit(int signo) { + printf("Handle sig %d\n", signo); + pthread_exit(NULL); +} + +void acceptTimer(void *p) { + THREADTIMER *timer = (THREADTIMER*)p; + while(!pthread_kill(*(timer->thread), 0)) { + sleep(MAXWAITSEC); + puts("Check accept status"); + if(time(NULL) - timer->touch > MAXWAITSEC) { + pthread_kill(*(timer->thread), SIGQUIT); + close(timer->accept_fd); + } + } + free(p); +} + +#define touchTimer(x) ((THREADTIMER*)(x))->touch = time(NULL) + +void handleAccept(void *p) { + int accept_fd = ((THREADTIMER*)p)->accept_fd; if(accept_fd > 0) { puts("Connected to the client."); - sendData("Welcome to simple dict server.", 31); + signal(SIGQUIT, handle_quit); + pthread_t thread; + if (pthread_create(&thread, NULL, (void *)&acceptTimer, p)) perror("Error creating timer thread"); + else puts("Creating timer thread succeeded"); + sendData(accept_fd, "Welcome to simple dict server.", 31); while((numbytes = recv(accept_fd, buff, BUFSIZ, 0)) > 0) { + touchTimer(p); buff[numbytes] = 0; printf("Get %zd bytes: %s\n", numbytes, buff); puts("Check buffer"); - if(!checkBuffer()) break; + if(!checkBuffer(accept_fd)) break; } fprintf(stderr, "Recv %zd bytes\n", numbytes); close(accept_fd); } else perror("Error accepting client"); } +void acceptClient() { + while(1) { + puts("Ready for accept, waitting..."); + int p = 0; + while(p < 8 && accept_threads[p] && !pthread_kill(accept_threads[p], 0)) p++; + if(p < 8) { + THREADTIMER *timer = malloc(sizeof(THREADTIMER)); + timer->accept_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len); + timer->thread = &accept_threads[p]; + timer->touch = time(NULL); + if (pthread_create(timer->thread, NULL, (void *)&handleAccept, timer)) perror("Error creating thread"); + else puts("Creating thread succeeded"); + } else { + puts("Max thread cnt exceeded"); + sleep(1); + } + } +} + int main(int argc, char *argv[]) { if(argc != 4 && argc != 5) showUsage(argv[0]); else { @@ -240,7 +310,7 @@ int main(int argc, char *argv[]) { if(!fp) fp = fopen(argv[as_daemon?4:3], "wb+"); if(fp) { file_path = argv[as_daemon?4:3]; - if(bindServer(port, times)) if(listenSocket(times)) while(1) acceptClient(); + if(bindServer(port, times)) if(listenSocket(times)) acceptClient(); } else fprintf(stderr, "Error opening dict file: %s\n", argv[as_daemon?4:3]); } else perror("Start daemon error"); } else fprintf(stderr, "Error times: %d\n", times);