فهرست منبع

update: iperf,发送时检查缓冲区大小,空间不够就别费劲发送了

Wendal Chen 3 ماه پیش
والد
کامیت
1086e5b531
1فایلهای تغییر یافته به همراه19 افزوده شده و 0 حذف شده
  1. 19 0
      components/network/iperf/src/luat_lwiperf.c

+ 19 - 0
components/network/iperf/src/luat_lwiperf.c

@@ -292,9 +292,17 @@ static void iperf_free(size_t line, void* ptr);
    u16_t txlen_max;
    void *txptr;
    u8_t apiflags;
+   u16_t available_space;
  
    LWIP_ASSERT("conn invalid", (conn != NULL) && conn->base.tcp && (conn->base.server == 0));
  
+   /* 检查发送缓冲区是否有可用空间 */
+   available_space = tcp_sndbuf(conn->conn_pcb);
+   if (available_space == 0) {
+     /* 没有可用空间,等待下次调用 */
+     return ERR_OK;
+   }
+ 
    do {
      send_more = 0;
      if (conn->settings.amount & PP_HTONL(0x80000000)) {
@@ -341,6 +349,12 @@ static void iperf_free(size_t line, void* ptr);
        apiflags = 0; /* no copying needed */
        send_more = 1;
      }
+     
+     /* 限制发送长度不超过可用缓冲区空间 */
+     if (txlen_max > available_space) {
+       txlen_max = available_space;
+     }
+     
      txlen = txlen_max;
      do {
       #if ENABLE_PSIF
@@ -360,6 +374,11 @@ static void iperf_free(size_t line, void* ptr);
  
      if (err == ERR_OK) {
        conn->bytes_transferred += txlen;
+       /* 更新剩余可用空间 */
+       available_space -= txlen;
+       if (available_space == 0) {
+         send_more = 0; /* 缓冲区已满,停止发送 */
+       }
      } else {
        send_more = 0;
      }