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.

[参考译文] TM4C1294NCZAD:TI-RTOS NDK MCU 在接受 TCP/IP 套接字连接请求时永远阻塞。

Guru**** 2511985 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1348674/tm4c1294nczad-ti-rtos-ndk-mcu-blocks-forever-at-accept-tcp-ip-socket-connection-requests

器件型号:TM4C1294NCZAD

您好!

 

我正在使用 TI-RTOS NDK 栈通过 TCP/IP 套接字连接将 PC 连接到 TM4C129微控制器。 我在 PC 端使用套接字测试应用程序。

 

当 PC 是服务器(接受来自微控制器的连接)、微控制器是客户端(使用连接 API)时、我能够建立连接。

 

然而,当 PC 是客户端(尝试连接到微控制器)并且微控制器是服务器(创建套接字、绑定、监听然后尝试接受)时,微控制器将在 Accept ()函数时锁定,从不会看到来自 PC 的连接请求。

 

我下面的代码中是否存在可能导致该问题的原因? 这个代码和 TI 示例应用(enet_tcpecho_server_tirtos)之间的唯一区别是、我将微控制器配置为使用静态 IP、而不是通过 DHCP 分配给它。 这是否与问题有关?

 

注:

  • 在 Accept 时编写以下代码块、从不打印"Accept socket success"(接受套接字成功)(也不命中 break 语句)。
  • 我在 PC 防火墙上启用了本地和远程 TCP 端口、以确保不存在防火墙问题。

 

微控制器作为服务器代码:

 

serverListenSocket =套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);

如果(serverListenSocket == socket_error)

{

中断;

 

system_printf ("创建套接字成功。\n");

system_flush();

 

memset (&localAddress、0、sizeof (localAddress));

localAddress.sin_family = AF_INET;

localAddress.sin_addr.s_addr = inet_addr ("192.168.1.20");

localAddress.sin_port = htons (50000);

 

status = bind (serverListenSocket、(struct sockaddr *)&localAddress、sizeof (localAddress);

如果(status!= 0)

{

中断;

 

system_printf ("绑定套接字成功。\n");

system_flush();

 

// TODO -将 maxcon 参数更改为常量

Status = Listen (serverListenSocket、3);

如果(status!= 0)

{

中断;

 

system_printf ("Listen socket success.\n");

system_flush();

 

// TODO -接受来自远程主机的连接

ClientSocket = Accept (serverListenSocket、(struct sockaddr *)&clientAddress、&clientAddressLen);

if (ClientSocket ==(int) invalid_socket)

{

中断;

 

system_printf ("接受套接字成功。\n");

system_flush();

 

配置文件的 IP 地址部分:

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="602233" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1348674/tm4c1294nczad-ti-rtos-ndk-mcu-blocks-forever-at-accept-tcp-ip-socket-connection-requests "]

    memset (&localAddress、0、sizeof (localAddress));

    localAddress.sin_family = AF_INET;

    localAddress.sin_addr.s_addr = inet_addr ("192.168.1.20");

    localAddress.sin_port = htons (50000);

     

    status = bind (serverListenSocket、(struct sockaddr *)&localAddress、sizeof (localAddress);

    [/报价]

    您已绑定到错误的本地地址。 您应该参考可以绑定到任何地址的示例(INADDR_ANY)。  

    您的 PC (客户端)应连接到服务器(192.168.1.20)

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

    尊敬的 Charles:

    感谢您的答复。 我以与示例工程相同的方式切换到了使用 INADDR_ANY、但仍然无法连接。 你还有其他建议吗?

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

    您好!

     您的客户端 IP 地址是什么?  

     客户端是否与服务器位于同一个子网?

     你是怎么想出 192.168.1.20的? 您需要确保此 IP 地址尚未分配给其他节点,否则可能会发生冲突。

     使用 DHCP 的原始示例是否起作用?

     可以显示 Wireshark 输出吗?

     您能展示自己的 PC 客户端应用吗?

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

    您好!

    感谢您的建议。 我的客户端(PC) IP 地址是192.168.1.182。 我有一条以太网电缆直接连接 PC 和微控制器。

    我正在使用在线找到的 SocketTest 应用程序 :::SocketTest::- Test My Socket (sourceforge.net)

    这是我在 Wireshark 上看到的输出。 在本例中、我将微控制器(服务器) IP 地址设置为192.168.1.181、将其端口设置为23。 微控制器的 MAC 地址为11:22:33:44:55:66。 如您所见、MCU 以"is at"命令响应"who"命令、但从未进一步执行。 你以前见过这个吗? 有什么想法可能会导致这种情况?

    我可以尝试使用 DHCP。 有趣的是、当 客户端/服务器翻转过来使微控制器成为客户端、而 PC 是服务器时、套接字连接确实起作用。

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

    尊敬的 Robert:

     您能否报告使用 DHCP 并将 MCU 用作服务器? 换而言之、请按原样使用该示例、无需修改。 你能让它正常工作吗? 如果它能够工作、它可以排除许多变量、例如网络、防火墙或网关问题。 您随机选择的 MAC 地址似乎是一个通用 管理和多播地址、但它不是分配给公司的 OUI 地址。   

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

    尊敬的 Charles:

    我在 EK-TM4C1294XL 评估套件上测试了 DHCP TCP echo 服务器示例项目、该评估套件具有类似的 MCU、并且可以正常运行(PC 能够连接到 LaunchPad)。 它还可以在静态 IP 模式下工作。 这似乎表明定制 MCU 上的软件配置有误。 我现在正在尝试对它进行诊断。

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

    尊敬的 Robert:

     很高兴您取得了进展、并感谢您确认 LaunchPad 上的静态地址和 DHCP 工作情况。 如果在 LaunchPad 上可以使用相同的固件、那么我倾向于认为定制板存在一些问题。 确保通过4.87k 电阻器将 RBIAS 引脚更正为 GO GND。 另请比较定制电路板和 LaunchPad 之间的原理图。  

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

    尊敬的 Charles:

    我找到了这个问题。 它与微控制器的 MAC 地址有关。 我要在 MAC 地址的第一个字节中设置1的位置位。 这导致 MAC 地址配置为"多播"而不是"单播"。  由于已将数据包帧配置为多播、所以客户端(PC)拒绝了来自微控制器的数据包帧。  我们希望针对我们的设置提供单播。

    例如、MAC 地址11-22-33-44-55-66无效、因为第一个字节的 LSB 为1 (0001 0001)、但 00-22-33-44-55-66和02-22-33-44-55-66均有效、因为在二进制中、第一个字节的 LSB 为零(分别为0000 0000和0000 0010)。

    我发现了这一点、因为在我的一个测试场景中、我将 MAC 地址设置为0-0-0-0-0、连接正常。 进一步挖掘 MAC 地址的详细信息后、我发现了设置多播/广播位的错误。

    希望此记录可以帮助遇到同样问题的任何人。

    再次感谢您的帮助。

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

    尊敬的 Robert:

     很高兴您的问题得到解决。 这与我之前的注释内联、可能会拒绝多播帧。 请参见下方的。 我将此帖子添加为书签、以便我可以推荐可能报告相同症状的其他人。  

    您随机选择的 MAC 地址似乎是一个普遍 管理和多播的地址