Procházet zdrojové kódy

fixbug: keepalive reset

ithewei před 6 roky
rodič
revize
08ac0a8789

+ 4 - 4
event/nio.c

@@ -33,8 +33,8 @@ accept:
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         char localip[64];
         char localip[64];
         char peerip[64];
         char peerip[64];
-        inet_ntop(AF_INET, &localaddr->sin_addr, localip, sizeof(localip));
-        inet_ntop(AF_INET, &peeraddr->sin_addr, peerip, sizeof(peerip));
+        inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+        inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
         printd("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", io->fd, connfd,
         printd("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", io->fd, connfd,
                 localip, ntohs(localaddr->sin_port),
                 localip, ntohs(localaddr->sin_port),
                 peerip, ntohs(peeraddr->sin_port));
                 peerip, ntohs(peeraddr->sin_port));
@@ -73,8 +73,8 @@ static void nio_connect(hio_t* io) {
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         char localip[64];
         char localip[64];
         char peerip[64];
         char peerip[64];
-        inet_ntop(AF_INET, &localaddr->sin_addr, localip, sizeof(localip));
-        inet_ntop(AF_INET, &peeraddr->sin_addr, peerip, sizeof(peerip));
+        inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+        inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
         printd("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
         printd("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
                 localip, ntohs(localaddr->sin_port),
                 localip, ntohs(localaddr->sin_port),
                 peerip, ntohs(peeraddr->sin_port));
                 peerip, ntohs(peeraddr->sin_port));

+ 5 - 5
event/overlapio.c

@@ -98,8 +98,8 @@ static void on_acceptex_complete(hio_t* io) {
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         char localip[64];
         char localip[64];
         char peerip[64];
         char peerip[64];
-        inet_ntop(AF_INET, &localaddr->sin_addr, localip, sizeof(localip));
-        inet_ntop(AF_INET, &peeraddr->sin_addr, peerip, sizeof(peerip));
+        inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+        inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
         printd("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", listenfd, connfd,
         printd("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", listenfd, connfd,
                 localip, ntohs(localaddr->sin_port),
                 localip, ntohs(localaddr->sin_port),
                 peerip, ntohs(peeraddr->sin_port));
                 peerip, ntohs(peeraddr->sin_port));
@@ -131,8 +131,8 @@ static void on_connectex_complete(hio_t* io) {
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
         char localip[64];
         char localip[64];
         char peerip[64];
         char peerip[64];
-        inet_ntop(AF_INET, &localaddr->sin_addr, localip, sizeof(localip));
-        inet_ntop(AF_INET, &peeraddr->sin_addr, peerip, sizeof(peerip));
+        inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+        inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
         printd("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
         printd("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
                 localip, ntohs(localaddr->sin_port),
                 localip, ntohs(localaddr->sin_port),
                 peerip, ntohs(peeraddr->sin_port));
                 peerip, ntohs(peeraddr->sin_port));
@@ -238,7 +238,7 @@ hio_t* hconnect (hloop_t* loop, const char* host, int port, hconnect_cb connect_
     socklen_t addrlen = sizeof(struct sockaddr_in);
     socklen_t addrlen = sizeof(struct sockaddr_in);
     memset(&peeraddr, 0, addrlen);
     memset(&peeraddr, 0, addrlen);
     peeraddr.sin_family = AF_INET;
     peeraddr.sin_family = AF_INET;
-    inet_pton(AF_INET, host, &peeraddr.sin_addr);
+    inet_pton(peeraddr.sin_family, host, &peeraddr.sin_addr);
     if (peeraddr.sin_addr.s_addr == INADDR_NONE) {
     if (peeraddr.sin_addr.s_addr == INADDR_NONE) {
         struct hostent* phe = gethostbyname(host);
         struct hostent* phe = gethostbyname(host);
         if (phe == NULL)    return NULL;
         if (phe == NULL)    return NULL;

+ 6 - 2
examples/client.cpp

@@ -46,9 +46,13 @@ void on_connect(hio_t* io, int state) {
     }
     }
     struct sockaddr_in* localaddr = (struct sockaddr_in*)io->localaddr;
     struct sockaddr_in* localaddr = (struct sockaddr_in*)io->localaddr;
     struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
     struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
+    char localip[64];
+    char peerip[64];
+    inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+    inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
     printf("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
     printf("connect connfd=%d [%s:%d] => [%s:%d]\n", io->fd,
-            inet_ntoa(localaddr->sin_addr), ntohs(localaddr->sin_port),
-            inet_ntoa(peeraddr->sin_addr), ntohs(peeraddr->sin_port));
+            localip, ntohs(localaddr->sin_port),
+            peerip, ntohs(peeraddr->sin_port));
 
 
     // NOTE: just on loop, readbuf can be shared.
     // NOTE: just on loop, readbuf can be shared.
     hio_t* iostdin = hread(io->loop, 0, readbuf, RECV_BUFSIZE, on_stdin);
     hio_t* iostdin = hread(io->loop, 0, readbuf, RECV_BUFSIZE, on_stdin);

+ 2 - 2
examples/server.cpp

@@ -35,8 +35,8 @@ void on_accept(hio_t* io, int connfd) {
     struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
     struct sockaddr_in* peeraddr = (struct sockaddr_in*)io->peeraddr;
     char localip[64];
     char localip[64];
     char peerip[64];
     char peerip[64];
-    inet_ntop(AF_INET, &localaddr->sin_addr, localip, sizeof(localip));
-    inet_ntop(AF_INET, &peeraddr->sin_addr, peerip, sizeof(peerip));
+    inet_ntop(localaddr->sin_family, &localaddr->sin_addr, localip, sizeof(localip));
+    inet_ntop(peeraddr->sin_family, &peeraddr->sin_addr, peerip, sizeof(peerip));
     printf("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", io->fd, connfd,
     printf("accept listenfd=%d connfd=%d [%s:%d] <= [%s:%d]\n", io->fd, connfd,
             localip, ntohs(localaddr->sin_port),
             localip, ntohs(localaddr->sin_port),
             peerip, ntohs(peeraddr->sin_port));
             peerip, ntohs(peeraddr->sin_port));

+ 18 - 5
examples/webbench.c

@@ -48,6 +48,7 @@ int Connect(const char* host, int port) {
 
 
 #define VERSION         "webbench/1.19.3.15"
 #define VERSION         "webbench/1.19.3.15"
 
 
+int verbose = 0;
 volatile int timerexpired = 0; // for timer
 volatile int timerexpired = 0; // for timer
 int time    = 30;
 int time    = 30;
 int clients = 1;
 int clients = 1;
@@ -66,11 +67,12 @@ char buf[1460] = {0};
 
 
 int mypipe[2]; // IPC
 int mypipe[2]; // IPC
 
 
-static const char options[] = "?hV01kt:p:c:";
+static const char options[] = "?hvV01kt:p:c:";
 
 
 static const struct option long_options[] = {
 static const struct option long_options[] = {
     {"help", no_argument, NULL, 'h'},
     {"help", no_argument, NULL, 'h'},
     {"version", no_argument, NULL, 'V'},
     {"version", no_argument, NULL, 'V'},
+    {"verbose", no_argument, NULL, 'v'},
     {"time", required_argument, NULL, 't'},
     {"time", required_argument, NULL, 't'},
     {"proxy", required_argument, NULL, 'p'},
     {"proxy", required_argument, NULL, 'p'},
     {"clients", required_argument, NULL, 'c'},
     {"clients", required_argument, NULL, 'c'},
@@ -90,6 +92,7 @@ void print_usage() {
 Options:\n\
 Options:\n\
   -?|-h|--help              Print this information.\n\
   -?|-h|--help              Print this information.\n\
   -V|--version              Print version.\n\
   -V|--version              Print version.\n\
+  -v|--verbose              Print verbose.\n\
   -0|--http10               Use HTTP/1.0 protocol.\n\
   -0|--http10               Use HTTP/1.0 protocol.\n\
   -1|--http11               Use HTTP/1.1 protocol.\n\
   -1|--http11               Use HTTP/1.1 protocol.\n\
   -k|--keepalive            Connection: keep-alive.\n\
   -k|--keepalive            Connection: keep-alive.\n\
@@ -111,6 +114,7 @@ int parse_cmdline(int argc, char** argv) {
         case '?':
         case '?':
         case 'h': print_usage(); exit(1);
         case 'h': print_usage(); exit(1);
         case 'V': puts(VERSION); exit(1);
         case 'V': puts(VERSION); exit(1);
+        case 'v': verbose = 1; break;
         case '0': http = 0; break;
         case '0': http = 0; break;
         case '1': http = 1; break;
         case '1': http = 1; break;
         case 'k': keepalive = 1; break;
         case 'k': keepalive = 1; break;
@@ -285,21 +289,30 @@ connect:
 write:
 write:
                 if (timerexpired) break;
                 if (timerexpired) break;
                 wrbytes = write(sock, request, len);
                 wrbytes = write(sock, request, len);
-                //printf("write %d bytes\n", wrbytes);
+                if (verbose) {
+                    printf("write %d bytes\n", wrbytes);
+                }
                 if (wrbytes != len) {
                 if (wrbytes != len) {
                     ++failed;
                     ++failed;
                     goto close;
                     goto close;
                 }
                 }
-                //printf("%s\n", request);
+                if (verbose) {
+                    printf("%s\n", request);
+                }
 read:
 read:
                 if (timerexpired) break;
                 if (timerexpired) break;
+                memset(buf, 0, sizeof(buf));
                 rdbytes = read(sock, buf, sizeof(buf));
                 rdbytes = read(sock, buf, sizeof(buf));
-                //printf("read %d bytes\n", rdbytes);
+                if (verbose) {
+                    printf("read %d bytes\n", rdbytes);
+                }
                 if (rdbytes <= 0) {
                 if (rdbytes <= 0) {
                     ++failed;
                     ++failed;
                     goto close;
                     goto close;
                 }
                 }
-                //printf("%s\n", buf);
+                if (verbose) {
+                    printf("%s\n", buf);
+                }
                 bytes += rdbytes;
                 bytes += rdbytes;
                 ++succeed;
                 ++succeed;
 close:
 close:

+ 10 - 4
http/HttpParser.h

@@ -34,6 +34,13 @@ struct http_parser_userdata {
             header_value.clear();
             header_value.clear();
         }
         }
     }
     }
+
+    void init() {
+        state = HP_START_REQ_OR_RES;
+        url.clear();
+        header_field.clear();
+        header_value.clear();
+    }
 };
 };
 
 
 class HttpParser {
 class HttpParser {
@@ -52,22 +59,21 @@ public:
         hp_settings.on_headers_complete = HttpParser::on_headers_complete;
         hp_settings.on_headers_complete = HttpParser::on_headers_complete;
         hp_settings.on_body             = HttpParser::on_body;
         hp_settings.on_body             = HttpParser::on_body;
         hp_settings.on_message_complete = HttpParser::on_message_complete;
         hp_settings.on_message_complete = HttpParser::on_message_complete;
+        hp_parser.data = &hp_userdata;
     }
     }
 
 
     void parser_request_init(HttpRequest* req) {
     void parser_request_init(HttpRequest* req) {
+        hp_userdata.init();
         hp_userdata.type = HTTP_REQUEST;
         hp_userdata.type = HTTP_REQUEST;
-        hp_userdata.state = HP_START_REQ_OR_RES;
         hp_userdata.payload = req;
         hp_userdata.payload = req;
         http_parser_init(&hp_parser, HTTP_REQUEST);
         http_parser_init(&hp_parser, HTTP_REQUEST);
-        hp_parser.data = &hp_userdata;
     }
     }
 
 
     void parser_response_init(HttpResponse* res) {
     void parser_response_init(HttpResponse* res) {
+        hp_userdata.init();
         hp_userdata.type = HTTP_RESPONSE;
         hp_userdata.type = HTTP_RESPONSE;
-        hp_userdata.state = HP_START_REQ_OR_RES;
         hp_userdata.payload = res;
         hp_userdata.payload = res;
         http_parser_init(&hp_parser, HTTP_REQUEST);
         http_parser_init(&hp_parser, HTTP_REQUEST);
-        hp_parser.data = &hp_userdata;
     }
     }
 
 
     int execute(const char* data, size_t len) {
     int execute(const char* data, size_t len) {

+ 18 - 4
http/HttpRequest.h

@@ -109,6 +109,10 @@ public:
         http_major = 1;
         http_major = 1;
         http_minor = 1;
         http_minor = 1;
         content_type = CONTENT_TYPE_NONE;
         content_type = CONTENT_TYPE_NONE;
+    }
+
+    void reset() {
+        init();
         headers.clear();
         headers.clear();
         body.clear();
         body.clear();
         json.clear();
         json.clear();
@@ -247,17 +251,23 @@ public:
     std::string         url;
     std::string         url;
     QueryParams         query_params;
     QueryParams         query_params;
 
 
-    HttpRequest() {
+    HttpRequest() : HttpInfo() {
         init();
         init();
     }
     }
 
 
     void init() {
     void init() {
-        HttpInfo::init();
         method = HTTP_GET;
         method = HTTP_GET;
         headers["User-Agent"] = DEFAULT_USER_AGENT;
         headers["User-Agent"] = DEFAULT_USER_AGENT;
         headers["Accept"] = "*/*";
         headers["Accept"] = "*/*";
     }
     }
 
 
+    void reset() {
+        HttpInfo::init();
+        init();
+        url.clear();
+        query_params.clear();
+    }
+
     std::string dump_url() {
     std::string dump_url() {
         std::string str;
         std::string str;
         if (strstr(url.c_str(), "://") == NULL) {
         if (strstr(url.c_str(), "://") == NULL) {
@@ -333,15 +343,19 @@ class HttpResponse : public HttpInfo {
 public:
 public:
     http_status         status_code;
     http_status         status_code;
 
 
-    HttpResponse() {
+    HttpResponse() : HttpInfo() {
         init();
         init();
     }
     }
 
 
     void init() {
     void init() {
-        HttpInfo::init();
         status_code = HTTP_STATUS_OK;
         status_code = HTTP_STATUS_OK;
     }
     }
 
 
+    void reset() {
+        HttpInfo::init();
+        init();
+    }
+
     std::string dump(bool is_dump_headers = true, bool is_dump_body = false) {
     std::string dump(bool is_dump_headers = true, bool is_dump_body = false) {
         char c_str[256] = {0};
         char c_str[256] = {0};
         std::string str;
         std::string str;

+ 7 - 3
http/server/HttpHandler.h

@@ -74,10 +74,14 @@ public:
     }
     }
 
 
     void init() {
     void init() {
-        parser.parser_request_init(&req);
-        req.init();
-        res.init();
         fc = NULL;
         fc = NULL;
+        parser.parser_request_init(&req);
+    }
+
+    void reset() {
+        init();
+        req.reset();
+        res.reset();
     }
     }
 
 
     void keepalive() {
     void keepalive() {

+ 1 - 1
http/server/http_server.cpp

@@ -102,7 +102,7 @@ static void on_read(hio_t* io, void* buf, int readbytes) {
             handler->res.status_code, http_status_str(handler->res.status_code));
             handler->res.status_code, http_status_str(handler->res.status_code));
 
 
         if (keepalive) {
         if (keepalive) {
-            handler->init();
+            handler->reset();
             handler->keepalive();
             handler->keepalive();
         }
         }
         else {
         else {