فهرست منبع

change: ftp,调整socket的关闭逻辑,调整上传文件的分片大小

Wendal Chen 2 ماه پیش
والد
کامیت
36b211b6c7
2فایلهای تغییر یافته به همراه26 افزوده شده و 5 حذف شده
  1. 5 1
      components/network/libftp/luat_ftp.h
  2. 21 4
      components/network/libftp/luat_ftp_client.c

+ 5 - 1
components/network/libftp/luat_ftp.h

@@ -3,7 +3,11 @@
 #include "luat_network_adapter.h"
 #define FTP_CMD_SEND_MAX 		(128)
 #define FTP_CMD_RECV_MAX 		(1024)
-#define PUSH_BUFF_SIZE 			(4096)
+#ifdef LUAT_USE_PSRAM
+#define PUSH_BUFF_SIZE 			(64*1024)
+#else
+#define PUSH_BUFF_SIZE 			(4*1024)
+#endif
 #define FTP_SOCKET_TIMEOUT 		(30000)
 
 #define FTP_OK 					(0)

+ 21 - 4
components/network/libftp/luat_ftp_client.c

@@ -180,7 +180,8 @@ static int32_t ftp_task_cb(void *pdata, void *param){
 		g_s_ftp.network->upload_done_size = (size_t)g_s_ftp.network->data_netc->ack_size;
 		if (g_s_ftp.network->upload_done_size >= g_s_ftp.network->local_file_size){
 			LLOGD("ftp data upload done!");
-			network_close(g_s_ftp.network->data_netc, 0);
+			network_close(g_s_ftp.network->data_netc, 5*1000);
+			g_s_ftp.network->data_netc_online = 0;
 		}
 		break;
 	case FTP_EVENT_DATA_CONNECT:
@@ -539,13 +540,22 @@ static void ftp_task(void *param){
 					goto operation_failed;
 				}
 			}
-
+			size_t read_size = PUSH_BUFF_SIZE;
 			uint8_t* buff = luat_heap_malloc(PUSH_BUFF_SIZE);
+			if (buff == NULL) {
+				buff = luat_heap_malloc(4*1024);
+				if (buff == NULL) {
+					LLOGE("ftp push malloc fail");
+					goto operation_failed;
+				}
+				read_size = 4*1024;
+			}
 			int offset = 0;
 			g_s_ftp.network->upload_done_size = 0;
 			while (1) {
-				memset(buff, 0, PUSH_BUFF_SIZE);
-				int len = luat_fs_fread(buff, sizeof(uint8_t), PUSH_BUFF_SIZE, g_s_ftp.fd);
+				// TODO 应该等ACK, 然后再发下一段数据, 否则大文件无法上传
+				memset(buff, 0, read_size);
+				int len = luat_fs_fread(buff, sizeof(uint8_t), read_size, g_s_ftp.fd);
 				if (len < 1)
 					break;
 				luat_ftp_data_send(&g_s_ftp, buff, len);
@@ -669,6 +679,13 @@ operation_failed:
 			ftp_state = FTP_ERROR;
 		}
 	}
+	if (g_s_ftp.network && g_s_ftp.network->data_netc){
+		network_close(g_s_ftp.network->data_netc, 0);
+	}
+	if (g_s_ftp.network && g_s_ftp.network->cmd_netc){
+		network_close(g_s_ftp.network->cmd_netc, 0);
+	}
+	luat_rtos_task_sleep(10);
 	OS_BufferWrite(&g_s_ftp.result_buffer, g_s_ftp.network->cmd_recv_data, g_s_ftp.network->cmd_recv_len);
 	if (ftp_state == FTP_SUCCESS_NO_DATE) ftp_state = FTP_SUCCESS_DATE;
 	l_ftp_cb(ftp_state);