This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我注意到尝试使用 sendto ()发送 UDP 数据包时出现了一个奇怪的问题。 当我尝试在初始化后过早定期发送时、会出现此问题。 症状:
- Sendto 不起作用,报告 ENOBUFS 的时间为15-30秒,最终以正确的频率恢复并开始发送。 (在 Wireshark 和 SocketTest 中观察网络流量)
-如果我在开始定期发送之前添加延迟、我根本看不到问题、定期发送会在开始时立即开始工作。 (Sendto 始终返回成功发送的正确字节数、而不是-1 (当它不起作用且流量在 Wireshark 和 sockettest 中可见时)
是否有人知道导致这种情况的原因?
工具:
TM4C1294开发套件
TI-RTOS TIVAC 2.16
NDK 2.25
计划:
Enet_udpecho_client_tirtos 的修改版本、使用时钟模块定期发送(大约100-200ms)而不是回波。
也不能完全确定这是否是正确的论坛、请告诉我是否应该移动它。
您好!
很抱歉、我不确定问题是什么。 读取 NDK 参考指南时、错误代码指示内存分配失败。
进一步阅读 sendto 描述 https://pubs.opengroup.org/onlinepubs/009604499/functions/sendto.html 可能是 :如果发送套接字中没有空间来容纳要发送的消息,并且套接字文件描述符没有 O_NONBLOCK 设置, sendto ()应在空间可用之前阻止。 如果发送套接字中没有空间来保存要发送的消息,并且套接字文件描述符确实设置了 O_NONBLOCK, 则 sendto ()将失败。 您能确定您是处于阻塞模式还是非阻塞模式吗? 您可以更改为阻塞模式吗? 可以使用 getsockopt()获取套接字选项的值,使用 setsocketop()设置套接字选项参数的值。
您好、Charles、
感谢您的回复。 它似乎在默认情况下处于打开状态,我根据您的建议使用 getsockopt()进行了验证。
还有其他想法吗?
您好!
我发现以下两个主题帖存在您报告的类似问题、但我不确定该解决方案 是否适用于您。 可以看一下吗?
您好、Charles、
我读取了您的第一个链接、它似乎指向内存问题? 由于我的问题似乎是临时性的、我不确定这是正确的方向。
我已将以太网发送任务大小设置为1024、数据包不超过20字节。
该任务使用邮箱、共享套接字和 sendto、这就是它的相关内容。 ROV Classic 报告 stackPeak 为504、heapMem largestFreeSize 为0x2e78。 这对我来说似乎是足够的证据、这不是一个记忆问题、但您的想法是值得欢迎的。
很遗憾、我无法打开第二个链接。
您好 Sasha、
第二个线程是内部线程、我没有意识到这一点。 我将整个线程链复制到 Word 文档中。 此线程还具有 ENOBUFS 标志。
共享套接字是什么意思? enet_udpecho_client_tirtos 是否适合您? 我不确定您的应用要求您在 while 循环中发送数据、而在接收特定事件和发送数据之间没有某种形式的同步。 如果没有同步、您唯一的活动任务是在 while 循环中持续发送数据、我认为这些数据可能导致缓冲区溢出。
您好、Charles、
内部线程似乎显示了一些配置更改、如果这确实是内存问题、可能会有所帮助、我将尝试这些更改并返回给您。
对于共享套接字、我使用 fdShare 在接收和发送任务之间共享套接字。 正如我说过的、我正在使用示例项目的修改版本、我已经在相当大的裕度上偏离了该版本。 此外、我不会以无限 while 循环发送数据、我会定期发送数据(每200ms 一次)。
您好 Sasha、
我想在帖子开始时、您说过如果您添加200ms 的延迟、那么就没有问题了。 您是要进一步缩短延迟吗? 您能不能告诉您可以在多短的时间内成功传输数据?