mirror of
https://github.com/fumiama/simple-kanban.git
synced 2026-06-28 15:10:27 +08:00
尝试解决半开问题
This commit is contained in:
50
server.c
50
server.c
@@ -50,17 +50,18 @@ void acceptClient();
|
|||||||
void acceptTimer(void *p);
|
void acceptTimer(void *p);
|
||||||
int bindServer(uint16_t port, u_int try_times);
|
int bindServer(uint16_t port, u_int try_times);
|
||||||
int checkBuffer(THREADTIMER *timer);
|
int checkBuffer(THREADTIMER *timer);
|
||||||
int freeAfterSend(int accept_fd, char *data, size_t length);
|
|
||||||
void closeFile(FILE *fp);
|
void closeFile(FILE *fp);
|
||||||
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes);
|
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes);
|
||||||
off_t fileSize(const char* fname);
|
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_pipe(int signo);
|
||||||
void handle_quit(int signo);
|
void handle_quit(int signo);
|
||||||
|
void kill_thread(THREADTIMER* timer);
|
||||||
int listenSocket(u_int try_times);
|
int listenSocket(u_int try_times);
|
||||||
FILE *openFile(char* file_path, int lock_type, char* mode);
|
FILE *openFile(char* file_path, int lock_type, char* mode);
|
||||||
int sendAll(char* file_path, THREADTIMER *timer);
|
int send_all(char* file_path, THREADTIMER *timer);
|
||||||
int sendData(int accept_fd, char *data, size_t length);
|
int send_data(int accept_fd, char *data, size_t length);
|
||||||
int sm1_pwd(THREADTIMER *timer);
|
int sm1_pwd(THREADTIMER *timer);
|
||||||
int s0_init(THREADTIMER *timer);
|
int s0_init(THREADTIMER *timer);
|
||||||
int s1_get(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 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);\
|
free(data);\
|
||||||
return re;
|
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)) {
|
if(!~send(accept_fd, data, length, 0)) {
|
||||||
puts("Send data error");
|
puts("Send data error");
|
||||||
return 0;
|
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;
|
int re = 1;
|
||||||
FILE *fp = openFile(file_path, LOCK_SH, "rb");
|
FILE *fp = openFile(file_path, LOCK_SH, "rb");
|
||||||
size_t numbytes;
|
size_t numbytes;
|
||||||
@@ -153,9 +154,9 @@ int sm1_pwd(THREADTIMER *timer) {
|
|||||||
int s0_init(THREADTIMER *timer) {
|
int s0_init(THREADTIMER *timer) {
|
||||||
if(!strcmp("get", timer->data)) timer->status = 1;
|
if(!strcmp("get", timer->data)) timer->status = 1;
|
||||||
else if(!strcmp("set" SETPASS, timer->data)) timer->status = 2;
|
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;
|
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
|
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
|
if(cli_ver < ver) { //need to send a new kanban
|
||||||
closeFile(fp);
|
closeFile(fp);
|
||||||
timer->is_open = 0;
|
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->status = 3;
|
||||||
timer->fp = fp;
|
timer->fp = fp;
|
||||||
timer->is_open = 1;
|
timer->is_open = 1;
|
||||||
return sendData(timer->accept_fd, "data", 4);
|
return send_data(timer->accept_fd, "data", 4);
|
||||||
} else {
|
} else {
|
||||||
timer->status = 0;
|
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);
|
sleep(MAXWAITSEC);
|
||||||
puts("Check accept status");
|
puts("Check accept status");
|
||||||
if(time(NULL) - timer->touch > MAXWAITSEC) {
|
if(time(NULL) - timer->touch > MAXWAITSEC) {
|
||||||
pthread_kill(*timer->thread, SIGQUIT);
|
kill_thread(timer);
|
||||||
close(timer->accept_fd);
|
|
||||||
if(timer->data) free(timer->data);
|
|
||||||
if(timer->is_open) closeFile(timer->fp);
|
|
||||||
*timer->thread = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(p);
|
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) {
|
void handle_pipe(int signo) {
|
||||||
puts("Pipe error");
|
puts("Pipe error");
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleAccept(void *p) {
|
void handle_accept(void *p) {
|
||||||
int accept_fd = timerPointerOf(p)->accept_fd;
|
int accept_fd = timerPointerOf(p)->accept_fd;
|
||||||
if(accept_fd > 0) {
|
if(accept_fd > 0) {
|
||||||
puts("Connected to the client.");
|
puts("Connected to the client.");
|
||||||
@@ -294,7 +299,7 @@ void handleAccept(void *p) {
|
|||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
if (pthread_create(&thread, NULL, (void *)&acceptTimer, p)) puts("Error creating timer thread");
|
if (pthread_create(&thread, NULL, (void *)&acceptTimer, p)) puts("Error creating timer thread");
|
||||||
else puts("Creating timer thread succeeded");
|
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;
|
timerPointerOf(p)->status = -1;
|
||||||
char *buff = calloc(BUFSIZ, sizeof(char));
|
char *buff = calloc(BUFSIZ, sizeof(char));
|
||||||
if(buff) {
|
if(buff) {
|
||||||
@@ -306,7 +311,8 @@ void handleAccept(void *p) {
|
|||||||
puts("Check buffer");
|
puts("Check buffer");
|
||||||
if(!checkBuffer(timerPointerOf(p))) break;
|
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");
|
} else puts("Error allocating buffer");
|
||||||
close(accept_fd);
|
close(accept_fd);
|
||||||
} else puts("Error accepting client");
|
} else puts("Error accepting client");
|
||||||
@@ -335,7 +341,7 @@ void acceptClient() {
|
|||||||
timer->data = NULL;
|
timer->data = NULL;
|
||||||
timer->is_open = 0;
|
timer->is_open = 0;
|
||||||
timer->fp = NULL;
|
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("Creating thread succeeded");
|
||||||
} else puts("Allocate timer error");
|
} else puts("Allocate timer error");
|
||||||
} else {
|
} else {
|
||||||
@@ -361,7 +367,7 @@ FILE *openFile(char* file_path, int lock_type, char* mode) {
|
|||||||
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes) {
|
int closeFileAndSend(THREADTIMER *timer, char *data, size_t numbytes) {
|
||||||
closeFile(timer->fp);
|
closeFile(timer->fp);
|
||||||
timer->is_open = 0;
|
timer->is_open = 0;
|
||||||
return sendData(timer->accept_fd, data, numbytes);
|
return send_data(timer->accept_fd, data, numbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeFile(FILE *fp) {
|
void closeFile(FILE *fp) {
|
||||||
|
|||||||
Reference in New Issue
Block a user