Przeglądaj źródła

1、添加ws内存爆炸问题
2、解决一个ntp内存泄露

guohui 2 lat temu
rodzic
commit
1abebf93fa
4 zmienionych plików z 20 dodań i 21 usunięć
  1. 10 15
      pro/mongoose/mongoose.c
  2. 1 1
      pro/mongoose/mongoose.h
  3. 3 1
      pro/src/app.c
  4. 6 4
      pro/src/websocket_handle.c

+ 10 - 15
pro/mongoose/mongoose.c

@@ -15219,22 +15219,17 @@ size_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,
 }
 
 
-static void my_mask(uint8_t *data, size_t len) {
-    size_t i;
-    uint8_t *p=data, *mask=p-4;
-    for (i = 0; i < len; i++) p[i] ^= mask[i & 3];
-}
-size_t mg_ws_send2(struct mg_connection *c, const void *buf, size_t len,
-                  int op) {
-  uint8_t *p=malloc(len+100);
-  if(!p) return -1;
+size_t mg_ws_send2(struct mg_connection *c, const void *buf, size_t len, int op, int max_tlen) {
   uint8_t header[14];
-  size_t header_len = mkhdr(len, op, c->is_client, p);
-  memcpy(p+header_len, buf, len);
-  //my_mask(p+header_len, len);
-  mg_io_send(c, p, header_len+len);
-  free(p);
-  
+  if(!c) return -1;
+  if(max_tlen>0 && c->send.len>max_tlen) {
+    mg_iobuf_resize(&c->send, 0);
+  }
+  size_t header_len = mkhdr(len, op, c->is_client, header);
+  mg_send(c, header, header_len);
+  MG_VERBOSE(("WS out: %d [%.*s]", (int) len, (int) len, buf));
+  mg_send(c, buf, len);
+  mg_ws_mask(c, len);
   return header_len + len;
 }
 

+ 1 - 1
pro/mongoose/mongoose.h

@@ -2251,7 +2251,7 @@ struct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url,
 void mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,
                    const char *fmt, ...);
 size_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);
-size_t mg_ws_send2(struct mg_connection *, const void *buf, size_t len, int op);
+size_t mg_ws_send2(struct mg_connection *, const void *buf, size_t len, int op, int max_tlen);
 size_t mg_ws_wrap(struct mg_connection *, size_t len, int op);
 size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);
 size_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,

+ 3 - 1
pro/src/app.c

@@ -1555,7 +1555,9 @@ void* ntp_thread(void *arg)
     {
         if (end_t - start_t >= 1 && _globalNTPManager.mode == true)
         {
-            globalNTPclient = createNTPClient(_globalNTPManager.ntpaddress, _globalNTPManager.port);
+            if(globalNTPclient==NULL) {
+                globalNTPclient = createNTPClient(_globalNTPManager.ntpaddress, _globalNTPManager.port);
+            }
 
             if (globalNTPclient ==NULL)
             {

+ 6 - 4
pro/src/websocket_handle.c

@@ -8,12 +8,13 @@
 #include "sqlite_handle.h"
 #include "json_handle.h"
 #include "cascade.h"
-
+#include "cfg.h"
 
 //#define USE_WS2
-#define USE_ONE_CONN
+#define WS_SEND_TLEN_MAX  (1024*1024*10)
 
 #define WS_MAX    10
+#define USE_ONE_CONN
 
 typedef struct mg_mgr           mg_mgr_t;
 typedef struct mg_connection    mg_conn_t;
@@ -46,7 +47,7 @@ static int ws_send(ws_handle_t *wh, void *data, int len, int isBinary)
         return -1;
     }
 #ifdef USE_WS2
-    mg_ws_send2(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+    mg_ws_send2(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, WS_SEND_TLEN_MAX);
 #else
     mg_ws_send(wh->c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
 #endif
@@ -60,7 +61,7 @@ static int ws_broadcast(ws_handle_t *wh, void *data, int len, int isBinary)
 
     for (c=wh->mgr.conns; c!=NULL; c=c->next) {
 #ifdef USE_WS2
-        mg_ws_send2(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
+        mg_ws_send2(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, WS_SEND_TLEN_MAX);
 #else
         mg_ws_send(c, data, len, isBinary?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
 #endif
@@ -272,6 +273,7 @@ void* websocket_thread(void* arg)
     ws_handle_t *wh=(ws_handle_t*)h->arg;
     const char *listen_addr="ws://[::]:6785";
 
+    mg_log_set(MG_LL_DEBUG);
     mg_mgr_init(&wh->mgr);  // Initialise event manager
     mg_http_listen(&wh->mgr, listen_addr, fn, NULL);  // Create HTTP listener
     wh->inited = 1;