Эх сурвалжийг харах

update jerry_net, 处理远端断开链接的操作处理

Signed-off-by: Sunxin <sunxin@rt-thread.com>
Sunxin 6 жил өмнө
parent
commit
84dded5db7

+ 95 - 34
rtthread-port/jerry_net.c

@@ -259,7 +259,7 @@ void net_socket_callback_free(const void *args, uint32_t size)
         js_socket_info->connect_thread = RT_NULL;
     }
 
-    if (js_socket_info->readData_thread != RT_NULL)
+    if (js_socket_info->readData_thread != RT_NULL && !js_socket_info->isClosing)
     {
         /*Tell readThread to stop reading*/
 
@@ -432,24 +432,58 @@ void net_socket_readData(jerry_value_t js_socket)
     get_net_info((void **)&js_socket_info, js_socket);
     int bytesRead = recv(js_socket_info->socket_id, buffer, BUFFER_SIZE + 1, 0);
 
-    /*set property: data*/
-    js_buffer_t *js_buffer;
-    jerry_value_t data_value = jerry_buffer_create(bytesRead, &js_buffer);
-    if (js_buffer)
+    if (js_socket_info->isClosing)
     {
-        rt_memcpy(js_buffer->buffer, buffer, bytesRead);
+        return;
     }
 
-    /*emit 'data' event*/
-    net_event_info *event_info = (net_event_info *)malloc(sizeof(net_event_info));
-    memset(event_info, 0, sizeof(net_event_info));
+    if (bytesRead <= 0)
+    {
+        js_socket_info->isClosing = true;
 
-    event_info->event_name = strdup("data");
-    event_info->js_target = js_socket;
-    event_info->js_return = data_value;
+        /*emit 'end' event*/
+        net_event_info *event_info = (net_event_info *)malloc(sizeof(net_event_info));
+        memset(event_info, 0, sizeof(net_event_info));
 
-    js_send_callback(js_socket_info->event_callback, event_info, sizeof(net_event_info));
-    free(event_info);
+        event_info->event_name = strdup("end");
+        event_info->js_target = js_socket;
+        event_info->js_return = RT_NULL;
+
+        js_send_callback(js_socket_info->event_callback, event_info, sizeof(net_event_info));
+        free(event_info);
+
+
+        /*do close callback*/
+        net_closeInfo_t *close_info  = (net_closeInfo_t *)malloc(sizeof(net_closeInfo_t));
+        memset(close_info, 0, sizeof(net_closeInfo_t));
+
+        close_info->js_server = js_socket_info->js_server;
+        close_info->js_socket = js_socket;
+
+        js_send_callback(js_socket_info->close_callback, close_info, sizeof(net_closeInfo_t));
+        free(close_info);
+    }
+    else
+    {
+        /*set property: data*/
+        js_buffer_t *js_buffer;
+        jerry_value_t data_value = jerry_buffer_create(bytesRead, &js_buffer);
+        if (js_buffer)
+        {
+            rt_memcpy(js_buffer->buffer, buffer, bytesRead);
+        }
+
+        /*emit 'data' event*/
+        net_event_info *event_info = (net_event_info *)malloc(sizeof(net_event_info));
+        memset(event_info, 0, sizeof(net_event_info));
+
+        event_info->event_name = strdup("data");
+        event_info->js_target = js_socket;
+        event_info->js_return = data_value;
+
+        js_send_callback(js_socket_info->event_callback, event_info, sizeof(net_event_info));
+        free(event_info);
+    }
 }
 
 void net_socket_sendData(net_writeInfo_t *write_info, jerry_value_t js_socket)
@@ -547,6 +581,10 @@ void net_socket_readData_entry(void *p)
         FD_SET(socket, &readfds);
         FD_SET(pipe_read_fd, &readfds);
 
+        if (js_socket_info->isClosing)
+        {
+            return;
+        }
         if (js_socket_info->timeout.tv_sec == 0 && js_socket_info->timeout.tv_usec == 0)
         {
             select(max_fd, &readfds, 0, 0, 0);
@@ -567,10 +605,6 @@ void net_socket_readData_entry(void *p)
                 free(event_info);
             }
         }
-        if (FD_ISSET(socket, &readfds) && js_socket_info->readable == true)
-        {
-            net_socket_readData(js_socket);
-        }
 
         if (FD_ISSET(pipe_read_fd, &readfds))
         {
@@ -589,6 +623,11 @@ void net_socket_readData_entry(void *p)
             net_socket_sendData(&write_info, js_socket);
             rt_sem_release(js_socket_info->socket_sem);
         }
+
+        if (FD_ISSET(socket, &readfds) && js_socket_info->readable == true)
+        {
+            net_socket_readData(js_socket);
+        }
     }
 }
 
@@ -675,18 +714,27 @@ int net_socket_updateProperty(jerry_value_t js_socket)
 
 void net_socket_connect_entry(void *connect_info)
 {
-	net_connectInfo_t* info = (net_connectInfo_t*)connect_info;
-	int ret = connect(info->socket_id, (struct sockaddr *)info->socket_fd, sizeof(struct sockaddr));
-	if (ret >= 0)
-	{
-	    if (net_socket_updateProperty(info->js_socket))
-	    {
-	        net_socket_startRead(info->js_socket);
-	    }
-	}
-
-	rt_free(info->socket_fd);
-	rt_free(info);
+    net_connectInfo_t *info = (net_connectInfo_t *)connect_info;
+    int ret = connect(info->socket_id, (struct sockaddr *)info->socket_fd, sizeof(struct sockaddr));
+    if (ret >= 0)
+    {
+        if (net_socket_updateProperty(info->js_socket))
+        {
+            net_socket_startRead(info->js_socket);
+        }
+    }
+
+    rt_free(info->socket_fd);
+    rt_free(info);
+
+    /*get socket_info*/
+    struct socket_info *js_socket_info = RT_NULL;
+    get_net_info((void **)&js_socket_info, info->js_socket);
+
+    if (js_socket_info)
+    {
+        js_socket_info->connect_thread = RT_NULL;
+    }
 }
 
 DECLARE_HANDLER(socket_connect)
@@ -786,7 +834,7 @@ DECLARE_HANDLER(socket_connect)
     if (port > 0)
     {
         struct sockaddr_in *socket_fd = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
-        memset(socket_fd,0,sizeof(struct sockaddr_in));
+        memset(socket_fd, 0, sizeof(struct sockaddr_in));
 
         socket_fd->sin_family = AF_INET;
 
@@ -801,8 +849,8 @@ DECLARE_HANDLER(socket_connect)
         socket_fd->sin_port = htons(port);
         rt_memset(&(socket_fd->sin_zero), 0, sizeof(socket_fd->sin_zero));
 
-        net_connectInfo_t* connect_info = (net_connectInfo_t*)malloc(sizeof(net_connectInfo_t));
-        memset(connect_info,0 , sizeof(net_connectInfo_t));
+        net_connectInfo_t *connect_info = (net_connectInfo_t *)malloc(sizeof(net_connectInfo_t));
+        memset(connect_info, 0, sizeof(net_connectInfo_t));
 
         connect_info->socket_fd = socket_fd;
         connect_info->socket_id = js_socket_info->socket_id;
@@ -831,6 +879,18 @@ DECLARE_HANDLER(socket_destroy)
         return jerry_create_undefined();
     }
 
+    /*emit 'end' event*/
+    net_event_info *event_info = (net_event_info *)malloc(sizeof(net_event_info));
+    memset(event_info, 0, sizeof(net_event_info));
+
+    event_info->event_name = strdup("end");
+    event_info->js_target = this_value;
+    event_info->js_return = RT_NULL;
+    js_send_callback(js_socket_info->event_callback, event_info, sizeof(net_event_info));
+    free(event_info);
+
+
+    /*do close callback*/
     net_closeInfo_t *close_info  = (net_closeInfo_t *)malloc(sizeof(net_closeInfo_t));
     memset(close_info, 0, sizeof(net_closeInfo_t));
 
@@ -1021,6 +1081,7 @@ jerry_value_t create_js_socket()
         js_socket_info->allowHalfOpen = false;
         js_socket_info->writable = true;
         js_socket_info->readable = true;
+        js_socket_info->isClosing = false;
         js_socket_info->event_callback = js_add_callback(net_event_callback_func);
         js_socket_info->fun_callback = js_add_callback(net_socket_callback_func);
         js_socket_info->close_callback = js_add_callback(net_socket_callback_free);
@@ -1389,7 +1450,7 @@ DECLARE_HANDLER(server_listen)
             net_serverInfo_t *js_server_info = RT_NULL;
             get_net_info((void **)&js_server_info, this_value);
 
-            js_server_info->listen_thread = rt_thread_create("net_listen", net_server_listen_entry, listen_info, 1024, 20, 5);
+            js_server_info->listen_thread = rt_thread_create("net_listen", net_server_listen_entry, listen_info, 2048, 20, 5);
             rt_err_t thread_ret = rt_thread_startup(js_server_info->listen_thread);
 
             if (thread_ret == RT_EOK)

+ 2 - 0
rtthread-port/jerry_net.h

@@ -40,6 +40,8 @@ struct socket_info
     bool writable ;
     bool readable ;
 
+    bool isClosing;
+
     struct js_callback *event_callback;
     struct js_callback *fun_callback;
     struct js_callback *close_callback;