|

楼主 |
发表于 2025-9-4 12:47:36
|
显示全部楼层
大佬,我将我的两个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, ¤t_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, ¤t_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);
}
}
这是我的程序,您看下。 |
|