|
发表于 2024-5-31 22:46:11
|
显示全部楼层
数据接收:[C] 纯文本查看 复制代码 static VOID nx_app_thread_entry(ULONG thread_input)
{
/* USER CODE BEGIN Nx_App_Thread_Entry 0 */
UINT ret = NX_SUCCESS;
ULONG socket_state;
NX_PACKET *RxPacket;
ULONG bytes_read;
ULONG peer_ip_address;
ULONG peer_port;
// 测试时使用端到端(直接连接电脑),初始化需要一定时间,这里延时一段时间再去连接服务器
tx_thread_sleep(10000);
/* 创建TCP Socket */
ret = nx_tcp_socket_create(&NetXDuoEthIpInstance, /* IP实例控制块 */
&TCPSocket, /* TCP控制块 */
"TCP Client Socket", /* TCP Socket名 */
NX_IP_NORMAL, /* IP服务类型 */
NX_FRAGMENT_OKAY, /* 使能IP分段 */
NX_IP_TIME_TO_LIVE, /* 指定一个 8 位的值,用于定义此数据包在被丢弃之前可通过的路由器数目 */
1024, /* TCP Socket接收队列中允许的最大字节数 */
NX_NULL, /* 用于在接收流中检测到紧急数据时调用的回调函数 */
NX_NULL); /* TCP Socket另一端发出断开连接时调用的回调函数 */
if (ret)
{
log_i("TCP Client socket create failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
/* 绑定端口 */
ret = nx_tcp_client_socket_bind(&TCPSocket, NX_APP_DEFAULT_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("TCP Client socket bind port failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
/* 连接远程服务器 */
ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("TCP Client socket connect server failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
// tx_thread_resume(&TCP_Send_Thread);
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)
{
log_i("TCP socket is not established!!!");
/* 绑定端口 */
ret = nx_tcp_client_socket_bind(&TCPSocket, NX_APP_DEFAULT_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("TCP Client socket rebind port failed:0x%x", ret);
tx_thread_sleep(100);
}
/* 连接远程服务器 */
ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("TCP Client socket reconnect server failed:0x%x", ret);
tx_thread_sleep(100);
}
}
if ((socket_state == NX_TCP_ESTABLISHED) && (ret == NX_SUCCESS))
{
log_i("TCP socket is established");
/* 接收TCP客户端发的TCP数据包 */
ret = nx_tcp_socket_receive(&TCPSocket, /* TCP Socket控制块 */
&RxPacket, /* 接收到的数据包 */
NX_WAIT_FOREVER); /* 永久等待 */
if (ret == NX_SUCCESS)
{
/* 获取客户端的IP地址和端口 */
ret = nx_tcp_socket_peer_info_get(&TCPSocket, /* TCP Socket控制块 */
&peer_ip_address, /* 远程IP地址 */
&peer_port); /* 远程端口号 */
if (ret != NX_SUCCESS)
{
log_i("TCP Client get ip addr and port failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
/* 获取客户端发来的数据 */
ret = nx_packet_data_retrieve(RxPacket, /* 接收到的数据包 */
data_buffer, /* 解析出数据 */
&bytes_read); /* 数据大小 */
if (ret != NX_SUCCESS)
{
log_i("TCP Client parse rev data failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
/* 打印接收到数据 */
PRINT_DATA(peer_ip_address, (unsigned int)peer_port, data_buffer);
ret = nx_packet_release(RxPacket);
if (ret != NX_SUCCESS)
{
log_i("rx packet release failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
}
else
{
log_i("TCP Client receive data failed:0x%x", ret);
/* 释放数据包 */
nx_packet_release(RxPacket);
/* 断开连接 */
nx_tcp_socket_disconnect(&TCPSocket, NX_WAIT_FOREVER);
/* disconnect the socket */
nx_tcp_client_socket_unbind(&TCPSocket);
}
}
}
/* USER CODE END Nx_App_Thread_Entry 0 */
}
数据发送:[C] 纯文本查看 复制代码 static VOID TCP_Send_Thread_entry(ULONG thread_input)
{
UINT ret = NX_SUCCESS;
ULONG socket_state;
NX_PACKET *TxPacket;
uint8_t sendbuf[20];
uint32_t count = 0;
while (1)
{
/* 获取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)
{
tx_thread_sleep(1000);
}
else
{
ret = nx_packet_allocate(&NxAppPool, &TxPacket, NX_TCP_PACKET, TX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("allocate tx packet failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
sprintf((char *)sendbuf, "sendbuf = %d\r\n", count++);
/*将要发送的数据附加到TraPacket */
ret = nx_packet_data_append(TxPacket, (VOID *)sendbuf, strlen((char *)sendbuf), &NxAppPool, TX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("packet append data failed:0x%x", ret);
nx_packet_release(TxPacket);
while (1)
{
tx_thread_sleep(1000);
}
}
/* 发送数据,注意发送后,此函数会释放数据包 */
ret = nx_tcp_socket_send(&TCPSocket, TxPacket, NX_WAIT_FOREVER);
if (ret != NX_SUCCESS)
{
log_i("TCP Client send data failed:0x%x", ret);
while (1)
{
tx_thread_sleep(1000);
}
}
tx_thread_sleep(1000);
}
}
} |
|