|
最近在用国产GD芯片跑ThreadX,调试网口驱动时用NetXDUO遇到了个现象,程序在跑TCP服务端和UDP时都没有问题,在调试TCP客户端连接上位机时nx_tcp_client_socket_connect这个函数一直返回0x21,查了下IP和端口都没有问题,而且电脑和板子也在同一网段,但是连接时就一直返回0x21失败,希望大佬们帮忙看下还可能是哪里的问题。
这里贴下代码:
#define DEFAULT_PORT 7788 /* TCP服务器监听端口号 */
#define IP_ADDR0 192
#define IP_ADDR1 168
#define IP_ADDR2 28
#define IP_ADDR3 245
#define MAX_TCP_CLIENTS 1
#define TCP_SERVER_ADDRESS IP_ADDRESS(192,168,28,146)
#define TCP_SERVER_PORT 1001
void NetXTest(void)
{
UINT status;
UINT ret;
ULONG socket_state;
UINT old_priority;
NX_PACKET *data_packet;
NX_PACKET *TraPacket;
NX_PACKET *RecPacket;
ULONG bytes_read;
ULONG peer_ip_address;
ULONG peer_port;
UINT source_port;
ULONG source_ip_address;
UINT count=0;
/* 初始化NetX */
nx_system_initialize();
/* 创建内存池 */
status = nx_packet_pool_create(&pool_0, /* 内存池控制块 */
"NetX Main Packet Pool", /* 内存池名 */
1536, /* 内存池每个数据包大小,单位字节
此值必须至少为 40 个字节,并且还必须可以被 4 整除 */
(ULONG*)(((int)packet_pool_area + 15) & ~15) ,/* 内存池地址,此地址必须ULONG对齐 */
NX_PACKET_POOL_SIZE); /* 内存池大小NX_PACKET_POOL_SIZE */
/* 检测创建是否失败 */
if (status) error_counter++;
/* 例化IP */
status = nx_ip_create(&ip_0, /* IP实例控制块 */
"NetX IP Instance 0", /* IP实例名 */
IP_ADDRESS(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3), /* IP地址 */
0xFFFFFF00UL, /* 子网掩码 */
&pool_0, /* 内存池 */
nx_driver_gd, /* 网卡驱动 */
(UCHAR*)AppTaskNetXStk, /* IP任务栈地址 */
sizeof(AppTaskNetXStk), /* IP任务栈大小,单位字节 */
APP_CFG_TASK_NETX_PRIO); /* IP任务优先级 */
/* 检测创建是否失败 */
if (status) error_counter++;
/* 使能ARP,并提供ARP缓存 */
status = nx_arp_enable(&ip_0, /* IP实例控制块 */
(void *)arp_space_area, /* ARP缓存地址 */
sizeof(arp_space_area)); /* 每个 ARP 条目均为 52 个字节,因此,ARP 条目总数是52字节整数倍 */
/* 使能fragment */
status = nx_ip_fragment_enable(&ip_0);
/* 检测使能成功 */
if (status) error_counter++;
/* 使能TCP */
status = nx_tcp_enable(&ip_0);
/* 检测使能成功 */
if (status) error_counter++;
/* 使能UDP */
status = nx_udp_enable(&ip_0);
/* 检测使能成功 */
if (status) error_counter++;
/* 使能ICMP */
status = nx_icmp_enable(&ip_0);
/* 检测使能成功 */
if (status) error_counter++;
/* 创建TCP Socket */
ret = nx_tcp_socket_create(&ip_0, /* IP实例控制块 */
&TCPSocket, /* TCP控制块 */
"TCP Server Socket", /* TCP Socket名 */
NX_IP_NORMAL, /* IP服务类型 */
NX_FRAGMENT_OKAY, /* 使能IP分段 */
NX_IP_TIME_TO_LIVE, /* 指定一个 8 位的值,用于定义此数据包在被丢弃之前可通过的路由器数目 */
4320, /* TCP Socket接收队列中允许的最大字节数 */
NX_NULL, /* 用于在接收流中检测到紧急数据时调用的回调函数 */
NX_NULL); /* TCP Socket另一端发出断开连接时调用的回调函数 */
if (ret)
{
count++;
//Error_Handler(__FILE__, __LINE__);
}
/* 绑定端口 */
ret = nx_tcp_client_socket_bind(&TCPSocket, DEFAULT_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
count++;
// Error_Handler(__FILE__, __LINE__);
}
/* 连接远程服务器 */
ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
count++;
// Error_Handler(__FILE__, __LINE__);
}
while(1)
{
TX_MEMSET(data_buffer, '\0', sizeof(data_buffer));
/* 获取 socket 状态 */
nx_tcp_socket_info_get(&TCPSocket, /* TCP Socket 控制块 */
NULL, /* 发送的 TCP 数据包总数目 */
NULL, /* 发送的 TCP 总字节数 */
NULL, /* 接收 TCP 数据包总数目 */
NULL, /* 接收的 TCP 总字节数 */
NULL, /* 重新传输的 TCP 数据包总数目 */
NULL, /* Socket 上 TCP 排队的 TCP 数据包总数 */
NULL, /* Socket 上有校验和错误的 TCP 数据包总数 */
&socket_state, /* Socket 当前状态 */
NULL, /* 仍在排队等待 ACK 的发送数据包总数 */
NULL, /* 当前发送窗口大小 */
NULL); /* 当前接收窗口大小 */
/* 如果连接还没有建立,继续接受新连接,成功的话开启接收数据 */
if(socket_state != NX_TCP_ESTABLISHED)
{
/* 绑定端口 */
ret = nx_tcp_client_socket_bind(&TCPSocket, DEFAULT_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
// Error_Handler(__FILE__, __LINE__);
}
/* 连接远程服务器 */
ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
// Error_Handler(__FILE__, __LINE__);
}
}
if((socket_state == NX_TCP_ESTABLISHED)&&(ret == NX_SUCCESS))
{
/* 接收 TCP 客户端发的 TCP 数据包 */
ret = nx_tcp_socket_receive(&TCPSocket, /* TCP Socket 控制块 */
&RecPacket, /* 接收到的数据包 */
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(RecPacket, /* 接收到的数据包 */
data_buffer, /* 解析出数据 */
&bytes_read); /* 数据大小 */
/* 打印接收到数据 */
//PRINT_DATA(peer_ip_address, (unsigned int)peer_port, data_buffer);
nx_packet_release(RecPacket);
/* 申请发送数据包 */
ret = nx_packet_allocate(&pool_0, &TraPacket, NX_TCP_PACKET, TX_WAIT_FOREVER);
if (ret)
{
// Error_Handler(__FILE__, __LINE__);
}
// sprintf((char *)sendbuf, "sendbuf = %d\r\n", count++);
/*将要发送的数据附加到 TraPacket */
ret = nx_packet_data_append(TraPacket, (VOID *)tcpsendtest, strlen((char *)tcpsendtest),
&pool_0, TX_WAIT_FOREVER);
if (ret)
{
// Error_Handler(__FILE__, __LINE__);
}
/* 发送数据,注意发送后,此函数会释放数据包 */
ret = nx_tcp_socket_send(&TCPSocket,
TraPacket,
NX_WAIT_FOREVER);
if (ret)
{
//Error_Handler(__FILE__, __LINE__);
}
}
else
{
/* 释放数据包 */
nx_packet_release(RecPacket);
/* 断开连接 */
nx_tcp_socket_disconnect(&TCPSocket,
NX_WAIT_FOREVER);
/* disconnect the socket */
nx_tcp_client_socket_unbind(&TCPSocket);
}
}
}
}
|
|