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.

[参考译文] CCS/BOOSTXL-CC3135:TCP 服务器在非阻塞模式下不工作

Guru**** 2394305 points
Other Parts Discussed in Thread: MSP-EXP432E401Y

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/900918/ccs-boostxl-cc3135-tcp-server-not-working-in-nonblocking-mode

器件型号:BOOSTXL-CC3135
主题中讨论的其他器件:MSP-EXP432E401Y

工具/软件:Code Composer Studio

您好!

我使用2个 MSP-EXP432E401Y 和2个 BOOSTXLCC-3135。 我正在进行 CAN 总线电缆更换。 为此、我使用了一个略微修改的"network_terminal"示例、其中添加了 CAN 功能。 我想在非阻塞模式下同时使用 CAN 和 TCP。 CAN 正在非阻塞模式下工作。 TCP 客户端设备也在非阻塞模式下工作。 TCP 服务器设备不是,但应启用非阻塞。 在我的代码中、我在"CAN_Read"和"SL_Recv"之间交替。 当接收数据时、它通过"sl_Send"或"CAN_write"发送数据(请参阅下面的代码)。 我检查了两个器件上的参数:

TCP 服务器设备:NB=1、newsock=1

TCP 客户端设备:NB=1、SOC=0

有什么想法,为什么 TCP 服务器处于阻塞模式?

这是来自 TCP 服务器的代码。 TCP 客户端代码与"SOCK_"相同、而不是"newSOCK_"。 其余代码基本上是原始的"network_terminal"。

while (1)
{
STATUS = CAN_READ (CAN、&CANRXFrame、sizeof (CANRXFrame));

if (status == 16)
{
while (status!= 8)
{
状态= sl_Send (newsock、CANRXFrame.data、sizeof (CANRXFrame.data)、0);
}
}

status = sl_Recv (newsock、CANTXFram.data、sizeof (CANTXFram.data)、0);

if (status ==8)
{
while (status!= 16)
{
状态= CAN_WRITE (CAN、CANTXFrame、sizeof (CANTXFrame));
}
}

此致

Christoph

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

    您好、Christoph、

    您是否已将 TCP 套接字切换到非阻塞模式? 接受传入连接后、您需要将新套接字切换到非阻塞模式。

    SlSockNonblocking_t nonblocking;
    nonblocking.NonBlockingEnabled = 1;
    RetVal = sl_SetSockOpt (socketTCP、sl_SOL_Socket、sl_SO_NONblocking、 非阻塞、大小(非阻塞)(&N); 

    此外、TCP 处理代码也不是完全正确的。 SL_ API 中的错误代码处理能力不足。

    1月

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

    您好、Jan、

    它应该切换到非阻塞模式、因为代码基础是"network_terminal"示例。 代码如下:

    if (true== nb)
    {
    非阻塞= true;
    
    状态=
    SL_SetSockOpt (sock、SL_SOL_Socket、SL_SO_NONBLOCKING、非阻塞(&N)、
    sizeof (非阻塞));
    UART_PRINT ("sl_SetSockOpt =%u \n\r\n\r\n"、status);
    if (状态< 0)
    {
    UART_PRINT ("[line:%d、error:%d]%s\n\r"、__line__、status、
    sl_socket_error);
    return(-1);
    }
    newsock = sl_error_BSD_EAGAAIN;
    } 

    但它在 sl_accept 之前调用。 正如您所说的、我在 sl_accept 之后也调用了它、但服务器仍处于阻塞模式。 我还将其替换为您的代码、因为它稍有不同、但服务器仍处于阻塞模式。 在服务器上进行 sl_Recv 调用后、代码不会继续。 这就是我认为它仍然处于阻塞模式的原因。

    为了确保我没有意外更改代码中的内容、我返回到原始的"network_terminal"示例。 在这里、我只更改了它们实际发送和接收数据的代码。 我对服务器和客户端都使用下面显示的代码(对于服务器使用“newsock”,对于客户端使用“sock”)。 两者都只 会重复调用 sl_Recv。

    while (1)
    {
    UART_PRINT ("调用 sl_Recv\n\n");
    状态= sl_Recv (newsock、&APP_CB.gDataBuffer.nwData、MAX_BUF_SIZE、0);
    UART_PRINT (" SL_Recv 的返回值:%u\n\r\n、STATUS);
    睡眠(1);
    } 

    端子输出如下所示。 左侧是服务器、右侧是客户端。 根据我的理解、两个器件都应重复打印上述代码。 但只有客户端似乎处于非阻塞模式。 服务器只打印一次"calling sl_Recv"、而客户端重复执行此操作。 因为它在我的项目中。 我还检查了两个器件上"NB"的值"1"。 或者我是否缺少了什么?

    此致

    Christoph

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

    您好、Christoph、

    您是否切换到由 sl_Accept()或原始侦听套接字(handle sock)创建的非阻塞模式套接字(套接字句柄 newsock)?

    如果要调查网络端的情况、可以使用 Wireshark 软件并直接监听 TCP 通信。

    1月

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

    您好、Jan、

    你是对的。 SL_SetSockOpt 使用"SOCK_"作为不来自 SL_Accept 的参数。 在 sl_accept 之后调用它、并使用从 sl_accept 生成的"newsock"、则它可以正常工作。 它现在处于非阻塞模式。 非常感谢:)我可以从 sl_API 中获得有关错误处理的更多信息吗? 我在 SDK 中仅找到 error.h 文件。 还有其他东西吗?

    网络终端示例可能需要一个小问题修复。 在调用 sl_accept 之前、使用"sock"调用 sl_SetSockOpt。 因此、错误的 sock 设置为"非阻塞"。

    此致

    Christoph

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

    您好、Christoph、

    有关使用 SWRU445中的套接字的信息 以及主机驱动程序的说明。

    >网络终端示例可能需要修复。 在调用 sl_accept 之前、使用"sock"调用 sl_SetSockOpt。 因此、错误的 sock 设置为"非阻塞"。

    我不这么认为。 因为它取决于您希望在非阻塞模式下使用的套接字。 对于 TCP 服务器、您有两个 BSD 套接字。 一个用于传入连接的侦听套接字和由 connect()创建的客户端套接字。 两个套接字都可以处于阻塞模式或不阻塞模式、这取决于您的应用需求。 在互联网上、您将找到许多包含 BSD 套接字说明的教程、其中所有方面的描述都比我以前更好。

    1月