硬汉嵌入式论坛

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

[ThreadX全家桶] NETXDUO UDP接收数据的问题

[复制链接]

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2021-4-8 20:13:18 | 显示全部楼层 |阅读模式
本帖最后由 oneV 于 2021-4-8 20:19 编辑

在调试NETXDUO的TCP/UDP过程中遇到很奇怪的现象,求教
ST例程中使用如下方式接收数据
  1. ret = nx_udp_socket_receive(&UDPSocket, &data_packet, NX_WAIT_FOREVER);

  2.     if (ret == NX_SUCCESS)
  3.     {
  4.       /* data is available, read it into the data buffer */
  5.       nx_packet_data_retrieve(data_packet, data_buffer, &bytes_read);
  6.                
  7.       /* get info about the client address and port */
  8.       nx_udp_source_extract(data_packet, &source_ip_address, &source_port);

  9.       /* print the client address, the remote port and the received data */
  10. //      PRINT_DATA(source_ip_address, source_port, data_buffer, bytes_read);

  11.       /* resend the same packet to the client */
  12.       ret =  nx_udp_socket_send(&UDPSocket, data_packet, source_ip_address, source_port);
  13.     }
复制代码
这里在创建UDP的时候使用
  1. /* create the UDP socket */
  2.   ret = nx_udp_socket_create(&IpInstance, &UDPSocket, "UDP Server Socket", NX_IP_NORMAL, NX_FRAGMENT_OKAY, NX_IP_TIME_TO_LIVE, QUEUE_MAX_SIZE);
复制代码
QUEUE_MAX_SIZE为512,data_buffer大小为512,如果外部发送来的数据大于512程序就会死掉,原因是 nx_packet_data_retrieve函数在复制数据包到data_buffer中的时候如果这个buffer小了就会破坏内存引发不可以预测的结果。那么问题来了,在不知道外界数据包大小的情况下这个情况如何避免呢?而我试过TCP并不存在这个问题。
第二个就是上面的例程中如果将nx_udp_socket_send注释掉,那么数据只能接收6次就死掉了,TCP、UDP皆如此,这又是什么原因?

回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2021-4-8 21:58:47 | 显示全部楼层
好吧 自我解答一波
需要调用nx_packet_release(data_packet);
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2021-4-8 22:04:31 | 显示全部楼层
但是第一个问题还是不知如何解决
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115806
QQ
发表于 2021-4-9 08:27:40 | 显示全部楼层
这个我还没有测试过。

感觉你这个QUEUE_MAX_SIZE为512配置有问题,这个配置的是最大UDP报文数,你接收这么多报文需要极大的空间,你可以修改为1试试
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2021-4-9 10:46:33 | 显示全部楼层
eric2013 发表于 2021-4-9 08:27
这个我还没有测试过。

感觉你这个QUEUE_MAX_SIZE为512配置有问题,这个配置的是最大UDP报文数,你接收这 ...

好像并不是   接收数据的大小不能超过这个data_buffer的大小   一超过就挂了  硬汉要不做一下这个实验看看
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115806
QQ
发表于 2021-4-9 10:59:54 | 显示全部楼层
oneV 发表于 2021-4-9 10:46
好像并不是   接收数据的大小不能超过这个data_buffer的大小   一超过就挂了  硬汉要不做一下这个实验看 ...

好的,等更新UDP章节教程时我专门测试下。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2021-4-9 11:25:59 | 显示全部楼层
eric2013 发表于 2021-4-9 10:59
好的,等更新UDP章节教程时我专门测试下。

看了一下_nx_packet_data_retrieve的源码 实际packet的长度是有个nx_packet_length的  那么也就是可以在数据copy前做个判断 超过了要么就不copy  要么就是再开辟一块大的内存
回复

使用道具 举报

1

主题

75

回帖

78

积分

初级会员

积分
78
发表于 2021-4-9 22:34:35 | 显示全部楼层
推荐使用这个API:nx_packet_data_extract_offset
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2021-4-10 14:09:52 | 显示全部楼层
catro 发表于 2021-4-9 22:34
推荐使用这个API:nx_packet_data_extract_offset

非常感谢,这个才是正解
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 08:42 , Processed in 0.291140 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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