工具/软件:TI-RTOS
您好!
我修改了 tcpEcho 项目、用于侦听 TCP 502端口以接收任何传入数据包、并处理 DUT 中的传入数据包。
在这里、我有两个不同的 PC 应用程序将数据包发送到502个端口。 问题是、当 另一个应用程序已连接时、我将无法建立一个应用程序的连接。 是 NDK 堆栈的预期行为、也可以通过 NDK 设置进行修改。 如果是、需要在哪里进行典型配置来支持多个 TCP 通道连接?
此致
巴拉
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.
工具/软件:TI-RTOS
您好!
我修改了 tcpEcho 项目、用于侦听 TCP 502端口以接收任何传入数据包、并处理 DUT 中的传入数据包。
在这里、我有两个不同的 PC 应用程序将数据包发送到502个端口。 问题是、当 另一个应用程序已连接时、我将无法建立一个应用程序的连接。 是 NDK 堆栈的预期行为、也可以通过 NDK 设置进行修改。 如果是、需要在哪里进行典型配置来支持多个 TCP 通道连接?
此致
巴拉
您好 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
此致
巴拉