硬汉嵌入式论坛

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

[ThreadX全家桶] NetX双机通信

[复制链接]

3

主题

7

回帖

16

积分

新手上路

积分
16
发表于 2025-8-30 22:35:40 | 显示全部楼层 |阅读模式
各位,请问下,我使用NetX协议栈,目前遇到的问题是这样的:
1、单个板子做TCP Server或Client分别都能与电脑通信成功;
2、两个开发板分别做server和client直连也能互相收发数据成功;
但是我当将这两个开发板通过交换机拉入局域网中就无法通信成功是为什么,是在同一个网段,和局域网网段相同,
我也试过把电脑和板子(分别做server和client)通过交换机拉入局域网中也能收发数据,通信成功,但是两个板子在局域网下通信就有问题是为什么,目前没有思路,有没有玩过NetX的大哥给指点一下。


回复

使用道具 举报

12

主题

84

回帖

140

积分

初级会员

积分
140
发表于 2025-9-1 08:36:32 | 显示全部楼层
两者的MAC地址冲突了吗?MAC地址首字节是偶数吗?
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2025-9-2 09:54:21 | 显示全部楼层
egoistaw 发表于 2025-9-1 08:36
两者的MAC地址冲突了吗?MAC地址首字节是偶数吗?

请问下,两个MAC地址相同会导致什么问题呢,都是00:11:22:33:44:55
回复

使用道具 举报

4

主题

1461

回帖

1473

积分

至尊会员

积分
1473
发表于 2025-9-2 13:45:15 | 显示全部楼层
赶紧改吧!
回复

使用道具 举报

3

主题

41

回帖

50

积分

初级会员

积分
50
发表于 2025-9-2 21:04:17 | 显示全部楼层
超级涛 发表于 2025-9-2 09:54
请问下,两个MAC地址相同会导致什么问题呢,都是00:11:22:33:44:55

arp协议根据MAC地址来映射IP地址
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118328
QQ
发表于 2025-9-3 10:34:10 | 显示全部楼层
MAC必须唯一,商业还得购买

IEEE MAC地址购买价格及购买方案选择
https://forum.anfulai.cn/forum.p ... 8416&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2025-9-4 12:47:36 | 显示全部楼层
egoistaw 发表于 2025-9-1 08:36
两者的MAC地址冲突了吗?MAC地址首字节是偶数吗?

大佬,我将我的两个MAC地址都修改成局域网唯一的了,但是目前问题仍然没有解决,目前的问题是,单独测试TCP Server没有任何问题,测试TCP Client就会出现一开始通信正常,时序为每100ms收发100字节数据,通信一段时间后(这个时间不确定有时是5-10分钟,有时能30分钟),后面就会出现TCP连接断开,目前不仅仅是在局域网中了,我网线直连电脑也会出现这个问题,是还有什么设置我没注意到吗?
/*
*********************************************************************************************************
*        函 数 名: netx_tcp_client_test
*        功能说明: TCP Client应用
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/   
void netx_tcp_client_test(void)
{
    UINT status;
    UINT ret;

        ULONG peer_ip_address;
        ULONG peer_port;


    uint32_t count = 0;
    uint8_t Addr[4] = {0};
    static uint8_t index = 1;

    /* 初始化NetX */
    netx_system_init();

    // 初始化内存池
    status = netx_packet_pool_create();
    if(NX_SUCCESS != status)
    {
        printf("\r\n内存池初始化失败\r\n");
    }               

    /* 例化IP */
    // 创建IP相关
    status = netx_ip_create(IP_ADDRESS(192, 168, 50, 133),    /* IP地址 */
                            G_IP0_SUBNET_MASK);
    if(status)
    {
        printf("\r\nnx_ip_create failed.\r\n");
    }

    // 支持ARP地址解析协议
    status = netx_arp_enable();
    if(status)
    {
        printf("\r\nnx_arp_enable failed.\r\n");
    }

    /* 使能fragment */   
    status = netx_ip_fragment_enable();
    if(status)
    {
        printf("\r\nfragment_enable failed.\r\n");
    }

    /* 使能TCP */
    status =  netx_tcp_enable();
    if(status)
    {
        printf("\r\ntcp_enable failed.\r\n");
    }

    /* 使能UDP  */
    status =  netx_udp_enable();
    if(status)
    {
        printf("\r\nudp_enable failed.\r\n");
    }

    /* 使能ICMP */
    status = netx_icmp_enable();
    if(status)
    {
        printf("\r\nnx_icmp_enable failed.\r\n");
    }
   
    // 等待该链接被启用
    ULONG current_state;
    status = netx_ip_status_check(NX_IP_LINK_ENABLED, &current_state, LINK_ENABLE_WAIT_TIME);
    if(NX_SUCCESS != status)
    {
        printf("\r\nnx_ip_status_check failed.\r\n");
    }



//    ULONG       actual_status     = 0;
//    NX_PACKET   *my_packet        = NULL;
//    ULONG       server_address    = 0;
//    ULONG       client_address    = 0;
//    ULONG       network_mask      = 0;
//    // 清除我们之前的 DHCP 会话事件标志。
//    ULONG       actual_events     = 0;
//
//    // 创建IP相关
//    status = netx_ip_create(G_IP0_ADDRESS, G_IP0_SUBNET_MASK);
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_ip_create failed.\r\n");
//    }
//
//    // 如果已配置网关地址则设置该地址
//    if (IP_ADDRESS(0, 0, 0, 0) != G_IP0_GATEWAY_ADDRESS)
//    {
//        status = netx_ip_gateway_address_set (G_IP0_GATEWAY_ADDRESS);
//        if(NX_SUCCESS != status)
//        {
//            printf("\r\nnx_ip_gateway_address_set failed.\r\n");
//        }
//    }
//
//    // 支持ARP地址解析协议
//    status = netx_arp_enable();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_arp_enable failed.\r\n");
//    }
//
//    /* 使能TCP */
//    status =  netx_tcp_enable();
//    if(status)
//    {
//        printf("\r\ntcp_enable failed.\r\n");
//    }
//
//    // 使能UDP
//    status = netx_udp_enable();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_udp_enable failed.\r\n");
//    }
//
//    // 使能ICMP
//    status = netx_icmp_enable();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_icmp_enable failed.\r\n");
//    }
//
//    // 等待该链接被启用
//    status = netx_ip_status_check(NX_IP_LINK_ENABLED, &current_state, LINK_ENABLE_WAIT_TIME);
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_ip_status_check failed.\r\n");
//    }
//
//    // 初始化DHCP客户端
//    // 创建DHCP相关
//    status = netx_dhcp_create();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_dhcp_create failed.\r\n");
//    }
//
//    // 设置DHCP客户端数据包
//    status = netx_dhcp_packet_pool_set();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_dhcp_packet_pool_set failed.\r\n");
//    }
//    printf("\r\nNetwork 初始化成功\r\n");
//
//    // 创建一个事件标志组
//    status = tx_event_flags_create(&netx_event_flags_group, "netx_event_group_name");
//    if(TX_SUCCESS != status)
//    {
//        printf("\r\ntx_event_flags_create failed.\r\n");
//        return ;
//    }
//
//    printf("\r\nChecking Ethernet Link...\r\n");
//
//    // 等待连接加载完成
//    do
//    {
//        status = netx_ip_driver_direct_command(NX_LINK_GET_STATUS, &actual_status);
//    } while (NX_TRUE != actual_status);
//
//    printf("\r\nEthernet link is up.\r\n");
//
//    // 注册一个DHCP状态变化回调函数
//    status = netx_dhcp_state_change_notify();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_dhcp_state_change_notify failed.\r\n");
//        return ;
//    }
//
//    // 开始启动DHCP客户端
//    status =  netx_dhcp_start();
//    if(NX_SUCCESS != status)
//    {
//        printf("\r\nnx_dhcp_start failed.\r\n");
//        return ;
//    }
//    printf("\r\nDHCP client is running.\r\n");
//
//    // 等待直到DHCP分配一个IP地址
//    // 等待绑定事件的发生
//    status = tx_event_flags_get(&netx_event_flags_group, 0x1,TX_AND_CLEAR, &actual_events, 2000);
//    if((TX_SUCCESS == status) && (true == actual_events))
//    {
//        printf("\r\nDHCP client is assigned an IP address.\r\n");
//
//        // 获取客户端IP地址
//        status = netx_ip_address_get(&client_address, &network_mask);
//        if(NX_SUCCESS != status)
//        {
//            printf("\r\nnx_ip_address_get failed.\r\n");
//            return ;
//        }
//        // 打印客户端IP地址
//        Addr[0] = (uint8_t)((client_address >> 24) & 0xFF);
//        Addr[1] = (uint8_t)((client_address >> 16) & 0xFF);
//        Addr[2] = (uint8_t)((client_address >> 8) & 0xFF);
//        Addr[3] = (uint8_t)(client_address & 0xFF);
//        printf("\r\nClient IP 地址:%d.%d.%d.%d\r\n", Addr[0], Addr[1], Addr[2], Addr[3]);
//
//        // 获取DHCP服务器的IP地址
//        status = netx_dhcp_server_address_get(&server_address);
//        if(NX_SUCCESS != status)
//        {
//            printf("\r\nnx_dhcp_server_address_get failed.\r\n");
//            return ;
//        }
//        // 打印客户端IP地址
//        Addr[0] = (uint8_t)((server_address >> 24) & 0xFF);
//        Addr[1] = (uint8_t)((server_address >> 16) & 0xFF);
//        Addr[2] = (uint8_t)((server_address >> 8) & 0xFF);
//        Addr[3] = (uint8_t)(server_address & 0xFF);
//        printf("\r\nServer IP 地址:%d.%d.%d.%d\r\n", Addr[0], Addr[1], Addr[2], Addr[3]);
//
//        // 检查此设备是否能使用这个IP发送和接收数据
//        status =  netx_icmp_ping(server_address, "Hello World", sizeof("Hello World"), &my_packet, NX_WAIT_FOREVER);
//        if(NX_SUCCESS != status)
//        {
//            printf("\r\nnx_icmp_ping failed.\r\n");
//            return ;
//        }
//        printf("\r\nSuccessfully Pinged DHCP Server.\r\n");
//
//        // 在我们用完回声响应数据包时将其释放。
//        netx_packet_release(my_packet);
//    }



    ////////////////////////////////////////////////////////////////////////////////////////////////

    /* 创建TCP Socket */
    ret = netx_tcp_socket_create();
    if(ret)
    {
        printf("\r\ntcp_socket_create failed.\r\n");
    }

    /* 绑定端口 */
    ret =  netx_tcp_client_socket_bind(TCP_SERVER_PORT, NX_WAIT_FOREVER);

    if (ret != NX_SUCCESS)
    {
        printf("\r\ntcp_client_socket_bind failed.\r\n");
    }

    /* 注册断连回调函数 */
    ret = netx_tcp_socket_disconnect_complete_notify();
    if (ret != NX_SUCCESS)
    {
        printf("\r\ntcp_socket_disconnect_complete_notify failed.\r\n");
    }

    /* 连接远程服务器 */
    ret = netx_tcp_client_socket_connect(IP_ADDRESS(Server_Addr[0], Server_Addr[1], Server_Addr[2], Server_Addr[3]), DEFAULT_PORT, NX_WAIT_FOREVER);
    if (ret != NX_SUCCESS)
    {
        printf("\r\ntcp_client_socket_connect failed.\r\n");
    }
    LED_GREEN_ON();

        while(1)
        {
            memset(data_buffer, 0, 100);

        /* 获取socket状态 */
        netx_tcp_socket_info_get(&socket_state);

        /* 如果连接还没有建立,继续接受新连接,成功的话开启接收数据 */
        if(socket_state != NX_TCP_ESTABLISHED)
        {
            /* 绑定端口 */
            ret =  netx_tcp_client_socket_bind(TCP_SERVER_PORT, NX_WAIT_FOREVER);

            if (ret != NX_SUCCESS)
            {
                printf("\r\ntcp_client_socket_bind failed.\r\n");
            }

            /* 连接远程服务器 */
            ret = netx_tcp_client_socket_connect(IP_ADDRESS(Server_Addr[0], Server_Addr[1], Server_Addr[2], Server_Addr[3]), DEFAULT_PORT, NX_WAIT_FOREVER);

            if (ret != NX_SUCCESS)
            {
                printf("\r\ntcp_client_socket_connect failed.\r\n");
            }
        }

        if((socket_state == NX_TCP_ESTABLISHED))
        {
            for(uint8_t i = 0; i < 100; i++)
            {
                sendbuf = index;
                index += 1;
                if(index > 250)
                {
                    index = 1;
                }
            }
            ret = netx_packet_allocate(&TraPacket, NX_TCP_PACKET, TX_WAIT_FOREVER);  // 申请发送数据包
            if (ret)
            {
                printf("\r\npacket_allocate failed.\r\n");
            }
            ret = netx_packet_data_append(TraPacket, (VOID *)sendbuf, strlen((char *)sendbuf), TX_WAIT_FOREVER);  // 将要发送的数据附加到TraPacket
            if (ret)
            {
                printf("\r\npacket_data_append failed.\r\n");
            }
            ret =  netx_tcp_socket_send(TraPacket, NX_WAIT_FOREVER);  // 发送数据,注意发送后,此函数会释放数据包
            // netx_tcp_send_buff(sendbuf, sizeof(sendbuf));
            LED_BLUE_OFF();
            LED_RED_ON();
            netx_data_record.netx_send_cnt++;  // 发送次数加1

            /* 接收TCP客户端发的TCP数据包 */
            ret = netx_tcp_socket_receive(&RecPacket,        /* 接收到的数据包 */
                                          100);  /* 永久等待 */

            if (ret == NX_SUCCESS)
            {
                /* 获取客户端发来的数据 */
                netx_packet_data_retrieve(RecPacket,      /* 接收到的数据包 */
                                                          data_buffer,    /* 解析出数据 */
                                                          &bytes_read);   /* 数据大小 */

                if(memcmp(data_buffer, sendbuf, 100) == 0)
                {
                    netx_data_record.netx_success_cnt++; // 成功++
                }
                else
                {
                    netx_data_record.netx_error_cnt++;  // 失败++
                }
                memset(data_buffer, 0, 100);
                netx_packet_release(RecPacket);
                LED_BLUE_ON();
                LED_RED_OFF();
            }
            else if(ret == NX_NO_PACKET)
            {
                netx_data_record.netx_outtime_cnt++;  // 超时++
                memset(data_buffer, 0, 100);
                netx_packet_release(RecPacket);
            }
            else
            {
                netx_packet_release(RecPacket);   // 释放数据包
                netx_tcp_socket_disconnect(NX_WAIT_FOREVER);  // 断开连接
                netx_tcp_client_socket_unbind();  // 断开Socket
                LED_GREEN_TOGGLE();
                tx_thread_sleep(10);
            }
        }
        tx_thread_sleep(10);
        }
}
这是我的程序,您看下。
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2025-9-4 12:50:35 | 显示全部楼层
wireshark抓包是这样子的,就是通信一直都正常着,然后某个时间节点就突然TCP断开了。wireshark我不是特别会使,各位论坛的大佬们看看我这是有什么问题吗?
1756961340891.jpg
回复

使用道具 举报

12

主题

84

回帖

140

积分

初级会员

积分
140
发表于 2025-9-4 14:20:54 | 显示全部楼层
超级涛 发表于 2025-9-4 12:50
wireshark抓包是这样子的,就是通信一直都正常着,然后某个时间节点就突然TCP断开了。wireshark我不是特别 ...

看着没啥大问题,抓包截图也没见到发FIN,只是看到133反应慢了。真要挑出来点什么的话,socket _send有失败的风险,失败了要手动释放packet,不然就泄露了,包泄露可能会引发断网这个问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 15:22 , Processed in 0.048337 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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