硬汉嵌入式论坛

 找回密码
 立即注册
查看: 69|回复: 5
收起左侧

Netx的流控需要在应用层处理吗?

[复制链接]

12

主题

38

回帖

74

积分

初级会员

积分
74
发表于 前天 21:49 | 显示全部楼层 |阅读模式
接收代码
while(1)
{
    if(app_buffer_available())
    { // 用户缓冲区未满,继续接收数据
      status = nx_tcp_socket_receive(&socket, &packet, NX_NO_WAIT);
      if(status == NX_SUCCESS) {
        // 接收数据,写入用户缓存
        status = nx_packet_data_retrieve(&packet, user_buffer,&len);
      }
      nx_packet_release(packet);  // 释放
    }
    else
    {// 用户缓冲区满了,不接收
      tx_thread_sleep(1);
    }
}
实际测试发现,在用户缓冲区满了后,下位机就不再调用nx_tcp_socket_receive和nx_packet_data_retrieve了,但是上位软件还可以继续发送数据,过一段时间后上位软件就发现网络会断开了?
TCP协议栈不是有自动流控吗,怎么会出这个问题呢?难道流控需要在应用层处理吗?
版本是nx_api.h   6.2.1  
哪位网友遇到过此类问题啊?请不吝赐教
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 昨天 09:24 | 显示全部楼层
你的代码实现可能有点问题,参考我这个试试


V7-2402_ThreadX NetXDUO TCP Server.7z (10.90MB)
V7-2403_ThreadX NetXDUO TCP Client.7z (10.91MB)
回复

使用道具 举报

9

主题

69

回帖

111

积分

初级会员

积分
111
发表于 昨天 16:38 | 显示全部楼层
socket create时的window值应该小于等于应用层buffer总大小
回复

使用道具 举报

25

主题

216

回帖

291

积分

高级会员

积分
291
QQ
发表于 昨天 18:05 | 显示全部楼层
eric2013 发表于 2025-7-3 09:24
你的代码实现可能有点问题,参考我这个试试

我当时用的大佬这一套 NetDUO,单独自己建例程跑没什么问题,把任务挪到真实工程里(数个任务)也会出现楼主说的情况,过一段时间TCP客户端会自动断开。

当时没深究这事搞个网口模块就出货了,现在我也准备重启 NetDUO 的使用。这种情况大佬没有碰到过吗?
回复

使用道具 举报

12

主题

38

回帖

74

积分

初级会员

积分
74
 楼主| 发表于 昨天 20:57 | 显示全部楼层
本帖最后由 younew 于 2025-7-3 20:58 编辑
eric2013 发表于 2025-7-3 09:24
你的代码实现可能有点问题,参考我这个试试

谢谢!
V7-2402的代码我看了:
···
while(1){
  ...省略
if((socket_state == NX_TCP_ESTABLISHED)&&(ret == NX_SUCCESS))
        {
               
            /* 接收TCP客户端发的TCP数据包 */
            ret = nx_tcp_socket_receive(&TCPSocket,        /* TCP Socket控制块 */
                                                    &data_packet,      /* 接收到的数据包 */
                                                    NX_WAIT_FOREVER);  /* 永久等待 */

            if (ret == NX_SUCCESS)
            {
               
                                /* 获取客户端的IP地址和端口 */
                                nx_tcp_socket_peer_info_get(&TCPSocket,       /* TCP Socket控制块 */
                                                                                        &peer_ip_address, /* 远程IP地址 */
                                                                                        &peer_port);      /* 远程端口号 */

                /* 获取客户端发来的数据 */
                nx_packet_data_retrieve(data_packet,    /* 接收到的数据包 */
                                                        data_buffer,    /* 解析出数据 */
                                                        &bytes_read);   /* 数据大小 */

                /* 打印接收到数据 */
                PRINT_DATA(peer_ip_address, (unsigned int)peer_port, data_buffer);

                /* 立即将接收到的数据发送回去 */
                ret =  nx_tcp_socket_send(&TCPSocket,       /* TCP Socket控制块 */
                                                          data_packet,      /* 数据包 */
                                                          NX_WAIT_FOREVER); /* 永久等待 */
            }
            else
            {
                /* 断开连接 */
                nx_tcp_socket_disconnect(&TCPSocket,
                                                         NX_WAIT_FOREVER);
                                
                                /* 解除Socket和服务器端口的绑定 */
                nx_tcp_server_socket_unaccept(&TCPSocket);
                                
                                /* 重新监听 */
                nx_tcp_server_socket_relisten(&ip_0,
                                                              DEFAULT_PORT,
                                                              &TCPSocket);
            }
        }
}
···和我的代码类似啊,也是调用nx_tcp_socket_receive和nx_packet_data_retrieve接收收据。但是例程中没有涉及应用层缓存满了以后该怎么处理的啊。
问了几个AI都说,及时用户层缓存满了也要不停的调用nx_tcp_socket_receive,否则netx协议栈的接收window无法更新。
我反问AI,我缓存满了再继续调用nx_tcp_socket_receive,数据没地方存啊,岂不是要丢弃啊?然后AI说应用层要配合netx协议栈一起做流控。
说明:我的用户缓存是远大于接收window的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 1 小时前 | 显示全部楼层
younew 发表于 2025-7-3 20:57
谢谢!
V7-2402的代码我看了:
···

TCP是自动协商的,你应用层处理完毕了,再接收就行了,这个不是UDP,UDP不行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-4 11:31 , Processed in 0.258646 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表