From 3cf914313303b1a42969335a5ace2497b3bf5417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 26 Oct 2022 17:01:32 +0800 Subject: [PATCH] fix --- server.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/server.c b/server.c index 763215d..e05dad4 100644 --- a/server.c +++ b/server.c @@ -71,10 +71,11 @@ struct threadtimer_t { int index; // 自身位置 time_t touch; // 最后访问时间,与当前时间差超过 MAXWAITSEC 将强行中断连接 int accept_fd; // 本次 accept 的 fd - int lock_type; // 打开文件类型 ssize_t numbytes; // 本次接收的数据长度 - int16_t status; // 本会话所处的状态 - int16_t is_open; // 标识 fp 是否正在使用 + int8_t status; // 本会话所处的状态 + uint8_t is_open; // 标识 fp 是否正在使用 + uint8_t lock_type; // 打开文件类型 + uint8_t again_cnt; // EAGAIN 次数 FILE *fp; // 本会话打开的文件 char data[TIMERDATSZ]; }; @@ -182,6 +183,7 @@ static void accept_client() { timer->is_open = 0; timer->fp = NULL; timer->status = -1; + timer->again_cnt = 0; if(send_data(timer->accept_fd, "Welcome to simple kanban server.", 33) <= 0) { puts("Send banner to new client failed"); clean_timer(timer); @@ -347,9 +349,14 @@ static int handle_accept(threadtimer_t* p) { if((p)->numbytes <= 0) break; if(!(r = check_buffer((p)))) break; } - if((p)->numbytes < 0) { + if((p)->numbytes <= 0) { perror("recv"); - r = r && errno == EWOULDBLOCK; + if(errno == EAGAIN) { + if(!++(p)->again_cnt) { + r = 0; + puts("Max EAGAIN cnt exceeded"); + } + } else r = 0; } printf("Recv finished, continune: %s\n", r?"true":"false"); return r;