1
0
mirror of https://github.com/fumiama/simple-kanban.git synced 2026-06-09 02:30:25 +08:00

尝试解决半开问题

This commit is contained in:
fumiama
2021-05-03 20:30:06 +08:00
parent 37428e60d1
commit 41de538f29

View File

@@ -50,17 +50,18 @@ void acceptClient();
void acceptTimer(void *p);
int bindServer(uint16_t port, u_int try_times);
int checkBuffer(THREADTIMER *timer);
int freeAfterSend(int accept_fd, char *data, size_t length);
void closeFile(FILE *fp);
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes);
off_t fileSize(const char* fname);
void handleAccept(void *accept_fd_p);
int freeAfterSend(int accept_fd, char *data, size_t length);
void handle_accept(void *accept_fd_p);
void handle_pipe(int signo);
void handle_quit(int signo);
void kill_thread(THREADTIMER* timer);
int listenSocket(u_int try_times);
FILE *openFile(char* file_path, int lock_type, char* mode);
int sendAll(char* file_path, THREADTIMER *timer);
int sendData(int accept_fd, char *data, size_t length);
int send_all(char* file_path, THREADTIMER *timer);
int send_data(int accept_fd, char *data, size_t length);
int sm1_pwd(THREADTIMER *timer);
int s0_init(THREADTIMER *timer);
int s1_get(THREADTIMER *timer);
@@ -100,12 +101,12 @@ int listenSocket(u_int try_times) {
}
int freeAfterSend(int accept_fd, char *data, size_t length) {
int re = sendData(accept_fd, data, length);
int re = send_data(accept_fd, data, length);
free(data);\
return re;
}
int sendData(int accept_fd, char *data, size_t length) {
int send_data(int accept_fd, char *data, size_t length) {
if(!~send(accept_fd, data, length, 0)) {
puts("Send data error");
return 0;
@@ -116,7 +117,7 @@ int sendData(int accept_fd, char *data, size_t length) {
}
}
int sendAll(char* file_path, THREADTIMER *timer) {
int send_all(char* file_path, THREADTIMER *timer) {
int re = 1;
FILE *fp = openFile(file_path, LOCK_SH, "rb");
size_t numbytes;
@@ -153,9 +154,9 @@ int sm1_pwd(THREADTIMER *timer) {
int s0_init(THREADTIMER *timer) {
if(!strcmp("get", timer->data)) timer->status = 1;
else if(!strcmp("set" SETPASS, timer->data)) timer->status = 2;
else if(!strcmp("cat", timer->data)) return sendAll(data_path, timer);
else if(!strcmp("cat", timer->data)) return send_all(data_path, timer);
else if(!strcmp("quit", timer->data)) return 0;
return sendData(timer->accept_fd, timer->data, timer->numbytes);
return send_data(timer->accept_fd, timer->data, timer->numbytes);
}
int s1_get(THREADTIMER *timer) { //get kanban
@@ -170,7 +171,7 @@ int s1_get(THREADTIMER *timer) { //get kanban
if(cli_ver < ver) { //need to send a new kanban
closeFile(fp);
timer->is_open = 0;
return sendAll(kanban_path, timer);
return send_all(kanban_path, timer);
}
}
}
@@ -189,10 +190,10 @@ int s2_set(THREADTIMER *timer) {
timer->status = 3;
timer->fp = fp;
timer->is_open = 1;
return sendData(timer->accept_fd, "data", 4);
return send_data(timer->accept_fd, "data", 4);
} else {
timer->status = 0;
return sendData(timer->accept_fd, "erro", 4);
return send_data(timer->accept_fd, "erro", 4);
}
}
@@ -271,21 +272,25 @@ void acceptTimer(void *p) {
sleep(MAXWAITSEC);
puts("Check accept status");
if(time(NULL) - timer->touch > MAXWAITSEC) {
pthread_kill(*timer->thread, SIGQUIT);
close(timer->accept_fd);
if(timer->data) free(timer->data);
if(timer->is_open) closeFile(timer->fp);
*timer->thread = 0;
kill_thread(timer);
}
}
free(p);
}
void kill_thread(THREADTIMER* timer) {
pthread_kill(*timer->thread, SIGQUIT);
close(timer->accept_fd);
if(timer->data) free(timer->data);
if(timer->is_open) closeFile(timer->fp);
*timer->thread = 0;
}
void handle_pipe(int signo) {
puts("Pipe error");
}
void handleAccept(void *p) {
void handle_accept(void *p) {
int accept_fd = timerPointerOf(p)->accept_fd;
if(accept_fd > 0) {
puts("Connected to the client.");
@@ -294,7 +299,7 @@ void handleAccept(void *p) {
pthread_t thread;
if (pthread_create(&thread, NULL, (void *)&acceptTimer, p)) puts("Error creating timer thread");
else puts("Creating timer thread succeeded");
sendData(accept_fd, "Welcome to simple kanban server.", 33);
send_data(accept_fd, "Welcome to simple kanban server.", 33);
timerPointerOf(p)->status = -1;
char *buff = calloc(BUFSIZ, sizeof(char));
if(buff) {
@@ -306,7 +311,8 @@ void handleAccept(void *p) {
puts("Check buffer");
if(!checkBuffer(timerPointerOf(p))) break;
}
printf("Recv %zd bytes\n", timerPointerOf(p)->numbytes);
printf("Break: recv %zd bytes\n", timerPointerOf(p)->numbytes);
kill_thread(timerPointerOf(p));
} else puts("Error allocating buffer");
close(accept_fd);
} else puts("Error accepting client");
@@ -335,7 +341,7 @@ void acceptClient() {
timer->data = NULL;
timer->is_open = 0;
timer->fp = NULL;
if (pthread_create(timer->thread, NULL, (void *)&handleAccept, timer)) puts("Error creating thread");
if (pthread_create(timer->thread, NULL, (void *)&handle_accept, timer)) puts("Error creating thread");
else puts("Creating thread succeeded");
} else puts("Allocate timer error");
} else {
@@ -361,7 +367,7 @@ FILE *openFile(char* file_path, int lock_type, char* mode) {
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes) {
closeFile(timer->fp);
timer->is_open = 0;
return sendData(timer->accept_fd, data, numbytes);
return send_data(timer->accept_fd, data, numbytes);
}
void closeFile(FILE *fp) {