修复创建 websocket 内存泄漏问题
authorhcj <1224667075@qq.com>
Wed, 2 Jul 2025 01:52:46 +0000 (09:52 +0800)
committerhcj <1224667075@qq.com>
Wed, 2 Jul 2025 01:52:46 +0000 (09:52 +0800)
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp

index 2a2857f..1b6c2b4 100644 (file)
@@ -530,7 +530,7 @@ int send_websocket_message(WebSocketClient *client, const unsigned char *message
         goto send_websocket_message_ERROR;
     }
     ret = 0;
-send_websocket_message_ERROR:
+    send_websocket_message_ERROR:
     bk_sleep(message_len/1000+1);
     free(frame);
     // bk_sleep(message_len/1000+1);
@@ -746,8 +746,6 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint
 
     err_t ret=0;
 
-    ip_sem.dns_done_sem = osSemaphoreNew(1, 0, NULL);
-
     parsed_url = parse_url(url);//解析url
 
     if (parsed_url.error) {
@@ -772,13 +770,21 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers,uint
 
     client->sockfd = lwip_socket(AF_INET, SOCK_STREAM, 0);
     if (client->sockfd < 0) {
+        
         printf("socket creation failed %d errno: %d\r\n",client->sockfd,errno);
         goto client_ERROR;
     }
-lwip_setsockopt(client->sockfd, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+    lwip_setsockopt(client->sockfd, SOL_SOCKET, SO_KEEPALIVE, (const void*)&opt, sizeof(opt));
+    lwip_setsockopt(client->sockfd, SOL_SOCKET, SO_REUSEADDR,(const void*)&opt, sizeof(opt));
    // printf("init_websocket_client 3\n");
     if(use_dns)
     {
+        ip_sem.dns_done_sem= osSemaphoreNew(1, 0, NULL);
+        if(ip_sem.dns_done_sem==0)
+        {
+            goto client_ERROR;
+        }
+
         ret =dns_gethostbyname(parsed_url.host,&ip,dns_found,&ip_sem);
         // if(ERR_OK==ret)
         {
@@ -872,8 +878,9 @@ void lwip_close_websocket_client(WebSocketClient *client) {
     {
         printf("lwip_close_websocket_client ");
         lwip_shutdown(client->sockfd,SHUT_RDWR);
+        bk_sleep(10);
         int err= lwip_close(client->sockfd);
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"lwip_close %d\n",err);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"lwip_close %d %d\n",client->sockfd,err);
         free(client);
     }
     
@@ -1442,6 +1449,9 @@ bool aer_result_analysis(char *buf)
     {
         stop_AudioCaptureProcess_AI();
         asr_is_start=0;
+
+        // bool state = false;
+        // SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool));
         // uapi_stop_asr();
         return false;
     }
@@ -1478,6 +1488,10 @@ int g_test_server_index = 1; //0 正式版本, 1 测试版本, 2 Snicker 服
 
 static int asr_client_ping=0;
 
+int asr_client_sockfd_last_id=-1;
+
+void asr_server_deinit(void);
+
 
 void bk_websocket_asr(void *data) {
   
@@ -1487,7 +1501,7 @@ void bk_websocket_asr(void *data) {
     bool state = true;
     
     is_bk_websocket_asr=1;
-// while (disconnect_server==0)
+    // while (1)
     {
         char url_buf[124]={0};
         if (g_test_server_index==0)
@@ -1562,7 +1576,13 @@ void bk_websocket_asr(void *data) {
 
         // uapi_start_asr();
         // SendMsgToUIService(UI_4G_AI_INIT_STAUS, 0,&state, sizeof(bool));
+
+        int sndbuf_len = 1024*5;
+        lwip_setsockopt(asr_client->sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf_len, sizeof(sndbuf_len));
+
                uapi_start_asr();
+
+        // asr_server_deinit();
         
         while (disconnect_server==0)
         {
@@ -1586,7 +1606,7 @@ void bk_websocket_asr(void *data) {
             {
             if(false== aer_result_analysis(asr_recv_buf))
             {
-printf("WS_lwip_close false== aer_result_analysis(asr_recv_buf)\r\n");
+                printf("WS_lwip_close false== aer_result_analysis(asr_recv_buf)\r\n");
                 break;
             }
             }
@@ -1598,9 +1618,11 @@ printf("WS_lwip_close false== aer_result_analysis(asr_recv_buf)\r\n");
 
         set_ai_asr_service_init_flag(0);
         free(asr_recv_buf);
+
         lwip_close_websocket_client(asr_client);
         asr_client=NULL;
-asr_client_ping=0;
+
+        asr_client_ping=0;
         bk_sleep(1000);
         // return;
     }
@@ -2014,7 +2036,7 @@ static void time_sync_func(void)
 {
 if(asr_client)
     {
-         if(asr_client_ping)
+        if(asr_client_ping)
         {
             asr_server_deinit();
             lwip_close_websocket_client(asr_client);