瀏覽代碼

transport: fix transport ssl blocking
In SSL mode, if `esp_transport_poll_read` function is used, the cache data in mebdtls will be blocked

xutao 5 年之前
父節點
當前提交
87bcb95180
共有 1 個文件被更改,包括 7 次插入4 次删除
  1. 7 4
      components/tcp_transport/transport_ssl.c

+ 7 - 4
components/tcp_transport/transport_ssl.c

@@ -86,6 +86,7 @@ static int ssl_poll_read(esp_transport_handle_t t, int timeout_ms)
 {
     transport_ssl_t *ssl = esp_transport_get_context_data(t);
     int ret = -1;
+    int remain = 0;
     struct timeval timeout;
     fd_set readset;
     fd_set errset;
@@ -94,6 +95,10 @@ static int ssl_poll_read(esp_transport_handle_t t, int timeout_ms)
     FD_SET(ssl->tls->sockfd, &readset);
     FD_SET(ssl->tls->sockfd, &errset);
 
+    if ((remain = esp_tls_get_bytes_avail(ssl->tls)) > 0) {
+        ESP_LOGD(TAG, "remain data in cache, need to read again");
+        return remain;
+    }
     ret = select(ssl->tls->sockfd + 1, &readset, NULL, &errset, esp_transport_utils_ms_to_timeval(timeout_ms, &timeout));
     if (ret > 0 && FD_ISSET(ssl->tls->sockfd, &errset)) {
         int sock_errno = 0;
@@ -149,10 +154,8 @@ static int ssl_read(esp_transport_handle_t t, char *buffer, int len, int timeout
     int poll, ret;
     transport_ssl_t *ssl = esp_transport_get_context_data(t);
 
-    if (esp_tls_get_bytes_avail(ssl->tls) <= 0) {
-        if ((poll = esp_transport_poll_read(t, timeout_ms)) <= 0) {
-            return poll;
-        }
+    if ((poll = esp_transport_poll_read(t, timeout_ms)) <= 0) {
+        return poll;
     }
     ret = esp_tls_conn_read(ssl->tls, (unsigned char *)buffer, len);
     if (ret < 0) {