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.

[参考译文] RTOS/TM4C1294NCZAD:UDP 发送到广播地址

Guru**** 2341440 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/602782/rtos-tm4c1294nczad-udp-sendto-broadcast-address

器件型号:TM4C1294NCZAD

工具/软件:TI-RTOS

您好!

我刚刚开始在 TM4C 上与 TI-RTOS 合作、首先让我说一下 TI 开发团队在这方面所做的出色工作。  我已经使用 eCos 和 FreeRTOS 完成了很多开发工作、向 TI-RTOS 过渡是一个非常愉快的体验。  我向它移植了一个相当复杂的应用程序、但遇到的困难非常少。  干得不错。

但是、我有一个问题、我似乎无法解决。  此应用程序的要求之一是偶尔需要向全局广播地址(255.255.255.255)发送 UDP 数据包,而无论我做什么,我都不能做到这一点。  FreeRTOS 使用相当相似的 UDP 堆栈、此代码在该操作系统下工作正常(可以肯定的是、在具有完全不同网络驱动程序的完全不同的处理器上)。

有没有人有幸向全球广播传输数据?  如果感兴趣、我可以接收发送到广播地址的数据包、但它们在发送到广播地址时似乎消失了。  我已经在以太网级别进行了无线通信、完全没有任何数据被传输。

本质上是代码。  我对我的操作代码做了一些小改动、删除了一些#define 常量、但简而言之、这就是。

我已经尝试运行调试器、我实际上看不到会丢弃数据包的任何情况。

有没有人有幸向全球广播传输数据?

感谢您的任何指导!

空 udpBroadcastHandler (UARg arg0、UARg arg1)
{
内部 字节接收;
内部 字节 Sent;
内部 状态;
内部 服务器;
FD_SET readSet;
struct sockaddr_in localAddr;
struct sockaddr_in clientAddr;
struct sockaddr_in BroadcastAddr;
socklen_t 地址;
特性 缓冲区[512];
特性 UDP_WRITE_BUF[512];
unsigned int UDP_WRITE_BUF_SIZE;

服务器=套接字(AF_iNet、SOCK_DGRAM、IPPROTO_UDP);
if (server ==1){
System_printf ("错误:未创建套接字。\n");
转到关断;
}

memset (localAddr、0、sizeof (localAddr));
localAddr.Sin_Family = AF_iNet;
//还尝试将 localaddr.sin_addr.s_addr 绑定到我的 IP 地址
localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
localAddr.sin 端口= htons (65001);

memset (&BroadcastAddr、0、sizeof (BroadcastAddr));
BroadcastAddr.Sin_Family = AF_iNet;
BroadcastAddr.Sin_addr.s_addr = htonl (0xFFFFFFFF);//htonl 不是必需的、因为反向字节顺序为=、但不会影响任何内容
BroadcastAddr.Sin_port = htons (65002);

status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
如果(status =-1){
System_printf ("错误:绑定失败。\n");
转到关断;
}

执行{
fd_zero (readSet);
fD_set (服务器、readSet);
addrlen = sizeof (clientAddr);

Status = select (server + 1、readSet、NULL、NULL、NULL);
如果(状态> 0){
if (fd_isset (server、readSet)){
bytesRcvd = recvfrom (服务器、缓冲区、UDPPACKETSIZE、0、
(struct sockaddr *)&clientAddr、&addrlen);

如果(bytesRcvd >0){
System_printf ("GotBytes!");
//无论数据包是直接发送到我的 IP 地址还是广播地址,都可以正常接收
if (buffer[0]= 0xAA){/*上游器件广播*
udp_WRITE_BUf_SIZE = System_sprintf (udp_WRITE_BUf、"活动");
//Send Back to the IP Address that broadcasted to us on 65002
//这按预期工作
clientAddr.sin 端口=htons (65002);
字节 Sent = sendto (server、udp_WRITE_Buf、udp_WRITE_BUf_SIZE、0、(struct sockaddr *)&clientAddr、 sizeof (clientAddr));
if (bytesSent!= udp_WRITE_BUf_SIZE){
System_printf ("发送到广播客户端时出错\n");
}
//如果我们位于不同的子网,也将其发送回全局广播地址
//这不发送任何内容,但字节 Sent 确实等于 udp_WRITE_BUf_SIZE,因此不会触发错误
//操作系统似乎认为数据包是发送的,尽管它绝对不是
字节 Sent = sendto (server、udp_WRITE_Buf、udp_WRITE_BUf_SIZE、0、(struct sockadr *)&BroadcastAddr、 sizeof (BroadcastAddr);
if (bytesSent!= udp_WRITE_BUf_SIZE){
System_printf ("发送到广播地址时出错");
}
UDP_WRITE_BUF_SIZE = 0;


}
}

}
while (status > 0);

shutdown:
如果(服务器> 0){
关闭(服务器);
}
}//结束任务 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Benjamin、

     您能否先尝试一下 RTOS-UDP 示例、看看您能否在 Wireshark 上看到正确的流量?

     您可以从 CCS 内的 Resource Explorer 导入 UDP 示例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从 UDPEcho 示例开始、该示例工作正常。 我已经进行了修改、但在发送到除广播之外的任何地址时、它仍然可以正常工作。

    接收/发送例程与 UDPEcho 示例基本相同。

    接收和发送功能完美-除非我要发送到广播。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Benjamin、
    我不是以太网专家。 我想知道您的路由器是否正在阻止全1的 IP (广播)地址。 如果是这样、您可能需要与 IT 人员核实。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

    链路中没有路由器、并且正在接收发送到设备的广播数据包。  我非常确信 Tiva-C 不会发送广播数据包、并且它不是一个交换/路由问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、插入到完全相同的以太网交换机端口中的基于 FreeRTOS 的类似器件能够按预期进行通信。 这肯定是 TI-RTOS 或 Tiva MAC 驱动程序中的东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Benjamin、
    我们的 TI-RTOS SME 将帮助您解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Charles。

    他们会在这里还是直接与我联系?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ben、

    我尝试了您的代码、然后从 sendto 获得-1的回波用于广播。 我正在寻找返回的原因。 您使用的是哪个版本的 TI-RTOS?

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Todd、

    感谢您的关注。
    有趣的是、你得到的值为-1。

    适用于 TM4C 的 TI-RTOS
    2.16.00.08
    2016年2月25日

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在插座上启用广播后、我能够使其正常工作。

    int optval=1;
    setsockopt (server、SOL_socket、SO_broadcast、&optval、sizeof (optval));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    工作完美!

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 TI 支持和工程团队。  您在 TI-RTOS 方面的工作非常出色、我希望您知道、我们非常感谢您提供的支持级别。  我能够将相对复杂的应用程序迁移到 TI-RTOS 的速度对您的开发有很大影响、而且为解决一个难题提供的支持绝对是极好的。

    我希望其他供应商的响应速度和能力都能减半。

    做得非常好!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你们的友好话语!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    语言得到了很好的-值得的-好的。

    然而-海报"BEN"有 RTOS 经验-成功了-因此它很好奇、"这是怎么需要的、代码块/功能"被错过了? 手册/用户指南中的说明是否正确-或者可能过于"内部"-需要特殊访问。

    此处的兴趣(和真正的价值)-在发现"解决方案的来源/方法"时可能会证明更多-而不是具体的答案...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    老实说,一旦我被指向正确的方向,我就意识到我应该自己找到答案。  Berkely 套接字有详尽的文档记录、SO_broadcast 是一个稳固的选项。

    参考资料: https://notes.shichao.io/unp/ch7/#so_broadcast-socket-option

    为什么 FreeRTOS 不需要设置选项尚不清楚、但实际上 TI-RTOS 可以正确处理。