|
发表于 2021-11-6 09:43:02
|
显示全部楼层
貌似是你的姿势不太对,发送玩要释放数据包
- /*
- *********************************************************************************************************
- * 函 数 名: NetXTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void NetXTest(void)
- {
- UINT status;
- UINT ret;
- ULONG socket_state;
- UINT old_priority;
- ULONG source_ip_address;
- NX_PACKET *data_packet;
- UINT source_port;
- ULONG bytes_read;
- /* 创建信号量,用于通知TCP服务器监听到新连接 */
- tx_semaphore_create(&Semaphore, "App Semaphore", 0);
-
- /* 初始化NetX */
- nx_system_initialize();
- /* 创建内存池 */
- status = nx_packet_pool_create(&pool_0,
- "NetX Main Packet Pool",
- 1536, (ULONG*)(((int)packet_pool_area + 15) & ~15) ,
- NX_PACKET_POOL_SIZE);
- /* 检测创建是否失败 */
- if (status) error_counter++;
- /* 例化IP */
- status = nx_ip_create(&ip_0,
- "NetX IP Instance 0",
- IP_ADDRESS(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3),
- 0xFFFFFF00UL,
- &pool_0, nx_driver_stm32f4xx,
- (UCHAR*)AppTaskNetXStk,
- sizeof(AppTaskNetXStk),
- APP_CFG_TASK_NETX_PRIO);
-
-
- /* 检测创建是否失败 */
- if (status) error_counter++;
- /* 使能ARP,并提供ARP缓存 */
- status = nx_arp_enable(&ip_0, (void *)arp_space_area, sizeof(arp_space_area));
- /* 使能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++;
-
- /* NETX初始化完毕后,重新设置优先级 */
- tx_thread_priority_change(netx_thread_ptr, APP_CFG_TASK_NETX_PRIO1, &old_priority);
- tx_thread_priority_change(&AppTaskNetXProTCB, APP_CFG_TASK_NetXPro_PRIO1, &old_priority);
-
- /////////////////////////////////////////////////////////////////////////////
- /* 创建TCP Socket */
- ret = nx_tcp_socket_create(&ip_0,
- &TCPSocket,
- "TCP Server Socket",
- NX_IP_NORMAL,
- NX_FRAGMENT_OKAY,
- NX_IP_TIME_TO_LIVE,
- 4320,
- NX_NULL,
- NX_NULL);
- if (ret)
- {
- Error_Handler(__FILE__, __LINE__);
- }
- /*
- * 监听新的链接。
- * 创建回调TCP_listen_callback表示监听到新连接。
- */
- ret = nx_tcp_server_socket_listen(&ip_0, DEFAULT_PORT, &TCPSocket, MAX_TCP_CLIENTS, tcp_listen_callback);
- if (ret)
- {
- Error_Handler(__FILE__, __LINE__);
- }
- if(tx_semaphore_get(&Semaphore, TX_WAIT_FOREVER) != TX_SUCCESS)
- {
- }
- else
- {
- /* 启动TCP通信前,接收新连接 */
- ret = nx_tcp_server_socket_accept(&TCPSocket, TX_WAIT_FOREVER);
- if (ret)
- {
- Error_Handler(__FILE__, __LINE__);
- }
- }
-
-
- while(1)
- {
- TX_MEMSET(data_buffer, '\0', sizeof(data_buffer));
- /* 获取socket状态 */
- nx_tcp_socket_info_get(&TCPSocket, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &socket_state, NULL, NULL, NULL);
- /* 如果连接还没有建立,继续接受新连接,成功的话开启接收数据 */
- if(socket_state != NX_TCP_ESTABLISHED)
- {
- ret = nx_tcp_server_socket_accept(&TCPSocket, NX_IP_PERIODIC_RATE);
- }
- if(ret == NX_SUCCESS)
- {
- /* 接收TCP客户端发的TCP数据包 */
- ret = nx_tcp_socket_receive(&TCPSocket, &data_packet, NX_WAIT_FOREVER);
- if (ret == NX_SUCCESS)
- {
- /* 获取客户端的IP地址和端口 */
- nx_udp_source_extract(data_packet, &source_ip_address, &source_port);
- /* 获取客户端发来的数据 */
- nx_packet_data_retrieve(data_packet, data_buffer, &bytes_read);
- /* 打印接收到数据 */
- PRINT_DATA(source_ip_address, source_port, data_buffer);
- /* 立即将接收到的数据发送回去 */
- ret = nx_tcp_socket_send(&TCPSocket, data_packet, NX_IP_PERIODIC_RATE);
- if (ret == NX_SUCCESS)
- {
- }
- /* 释放数据包 */
- nx_packet_release(data_packet);
- }
- else
- {
- /* 断开连接,重新监听 */
- nx_tcp_socket_disconnect(&TCPSocket, NX_WAIT_FOREVER);
- nx_tcp_server_socket_unaccept(&TCPSocket);
- nx_tcp_server_socket_relisten(&ip_0, DEFAULT_PORT, &TCPSocket);
- }
- }
- else
- {
- /* 处于空闲状态 */
-
- }
- }
- }
复制代码
|
|