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/TM4C1292NCPDT:TI NDK 中支持多个 TCP 连接打开

Guru**** 2393025 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/681425/rtos-tm4c1292ncpdt-multiple-tcp-connection-opening-support-in-ti-ndk

器件型号:TM4C1292NCPDT

工具/软件:TI-RTOS

您好!

我修改了 tcpEcho 项目、用于侦听 TCP 502端口以接收任何传入数据包、并处理 DUT 中的传入数据包。

在这里、我有两个不同的 PC 应用程序将数据包发送到502个端口。 问题是、当 另一个应用程序已连接时、我将无法建立一个应用程序的连接。 是 NDK 堆栈的预期行为、也可以通过 NDK 设置进行修改。 如果是、需要在哪里进行典型配置来支持多个 TCP 通道连接?

此致

巴拉

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

    这应该是可能的。 您如何设置侦听套接字?

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

    您好 Todd、

    我使用了 Global.networkOpenHook ="&netOpenHook";

    在 netOpenHook 函数内、我将创建一个动态任务、如下所示。

    空 netOpenHook()

      Task_handle taskHandle;

      Task_Params taskParams;

      Task_handle tftpTaskHandle;

      Task_Params tftpTaskParams;

      ERROR_Block EB;

      /*确保已初始化 Error_Block */

      ERROR_INIT (&EB);

      /*

      * 创建一个任务,该任务将建立传入的 TCP 连接。

      * arg0将是此任务侦听的端口。

      *

      Task_Params_init (&taskParams);

      taskParams.STACKSIZE = MODBUSHANDLERSTACK;

      taskParams.priority = 1;

      taskParams.arg0 = MODBUSPORT;

      taskHandle = Task_create ((Task_FuncPtr) ModbusHandler、&taskParams、&EB);

      if (taskHandle == NULL){

        system_printf ("netOpenHook:创建 modbusHandler 任务失败\n");

      }

      system_flush();

    我的动态任务将初始化 Modbus TCP 堆栈、并在502端口上持续监听任何传入的数据包。

    内部 ModbusHandler (UArg0、UArgarg1)

    /*

    *初始化 Modbus 源代码库。
    *

    /*初始化计时器*/

    /*初始化应用程序上下文*/

    /*初始化目标配置结构*/

    /*初始化信道结构 */

    /*初始化 IO 配置结构*/

    //使用 TCP,因为它使样本更易于在 PC 上使用
    IOCnfg.type = IOC_TYPE_TCP;

    /*在分析器窗口中显示的名称*/
    strcpy (IOCnfg.iocTCP.chnlName、"IOC MB 从属设备");

    /*。*。*。*。*允许任何客户端连接*/
    strcpy (IOCnfg.ioctcp.ipAddress、"*.*.*.*");

    /* Modbus 的默认 ipPort 为502。
    *
    IOCnfg.ioctcp.ipPort = 502;
    IOCnfg.ioctcp.mode = IOCCP_MODE_SERVER;
    linkConfig.type = MBLINK_TYPE_TCP;

    pSclChannel = mbchnl_openChannel (pApplContext、NULL、NULL、 &linkConfig、&physConfig、 IOCnfg、&targetConfig);
    if (pSclChannel ==空)

      /*无法打开*/
     SYSPRINT ("打开通道失败、退出程序\n");

     /*在退出之前睡眠10秒钟*/

     Task_sleep (1000);
      返回(1);

    /*初始化并打开 Modbus 从站会话*/
    smbsesn_initconfig (&sesnConfig);
    pSclSession =(SESN *) smbsesn_openSession (pSclChannel、&sesnConfig、 NULL);

    if (pSclSession = NULL)

       /*无法打开*/
      TSYSPRINT ("打开会话失败、退出程序\n");

      /*在退出之前睡眠10秒钟*/

      Task_sleep (1000);
      返回(1);


    while (1)

      checkTimer();
      CheckForInput (pApplContext);
     Task_sleep (10);

     

    在开放通道内、将创建 tcp_socket 线程。


    我的 NDK 配置如下。

    /*========================= NDK 配置=================== *
    VAR NDK = XDC.loadPackage ('ti.NDK.config');
    VAR Global = xdc.useModule('ti.ndk.config.Global');
    VAR IP = xdc.useModule('ti.ndk.config.Ip');
    VAR UDP = xdc.useModule('ti.ndk.config.Udp');
    VAR TCP = xdc.useModule('ti.ndk.config.Tcp');

    global.ipv6 = false;
    global.stackLibType = Global. min;
    Global.networkOpenHook ="&netOpenHook";

    //自动调用 fdOpen/CloseSession 以执行套接字任务*/
    Global.autoOpenCloseFD = true;


    global.pktNumFrameBufs=10;
    global.memRawPageCount = 6;
    global.ndkThreadStackSize = 4096;
    global.lowTaskStackSize = 1024;
    Global.normTaskStackSize = 1024;
    global.highTaskStackSize = 1024;
    tcp.transmitBufSize = 4096;
    tcp.receiveBufSize = 4096;

    我还遇到另一个问题-当我的客户端 TCP 应用程序尝试与 DUT 连接和断开几乎10次时、我将收到如下所示的控制台消息、需要在下电上电后再次建立 TCP 连接。 但即使 TCP 不起作用、ping 也能正常工作。

    在这种情况下、我已经在 ROV 中检查了堆栈和堆大小、在这里、它在所有任务中都有足够的内存。

    可以帮助我尽快关闭吗? 它是我的项目中的一个非常关键的问题。

    软件版本如下所示

    tirtos_tivac_2_16_01_14

    BIOS_6_45_02_31

    NDK_2_25_00_09

    tidrivers_tivac_2_16_01_13

     

    此致

    巴拉

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

    监听呼叫在哪里? 例如、在 TI-RTOS 中的 TCPEcho 示例中、有以下内容
    状态=监听(服务器、NUMTCPWORKERS);

    NUMTCPWORKERS (3)限制了连接的积压数量。

    您能否确认您可以在目标上运行 TCPEcho、在不同 PC 上运行 TCPSendReceive?

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

    这是我正在使用的监听呼叫"ListenSocket、IOCTCP_Backlog)"、其中 IOCTCP_Backlog = 5。

    >>您能否确认可以在目标上运行 TCPEcho,在不同 PC 上运行 TCPSendReceive?
    让我来尝试一下。

    >>>我还遇到另一个问题-当我的客户端 TCP 应用程序尝试与 DUT 连接并断开连接近10次时,我将收到如下所示的控制台消息,需要在下电上电后再次建立 TCP 连接。 但即使 TCP 不起作用、ping 也能正常工作。

    --你对这个问题有什么建议吗? 因为与多个连接相比、这是一个严重的问题?

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

    最后、我发现了第10次 Modbus TCP 断开连接的问题。 对于 TCP 套接字关闭,我们使用了 shutdown () API 而不是 close() API。


    巴拉