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.

[参考译文] TM4C1294KCPDT:TCP 客户端/服务器重新连接问题

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1135947/tm4c1294kcpdt-tcp-client-server-reconnect-issue

器件型号:TM4C1294KCPDT

尊敬的 TI:

我将 MCU 作为 TCP 服务器,它运行良好,允许在客户端中进行连接和数据传输。 当数据传输工作时、在此期间、我将断开客户端与服务器的连接。 如果要再次连接、则客户端在连接到服务器时出现错误、而 ping 则在此处连接部分功能以重新连接客户端。

我希望在这部分代码中进行重新连接。  

if (status=0 || connection_Stat=0)

// clientfd=0;
clientfd =接受(server、(struct socaddr *)&clientAddr、&addrlen);

Void tcpHandler(UArg arg0, UArg arg1)
{
    int                status;


    struct sockaddr_in localAddr;
    struct sockaddr_in clientAddr;
    int                optval;
    int                optlen = sizeof(optval);
    socklen_t          addrlen = sizeof(clientAddr);
    //Task_Handle        taskHandle;
    //Task_Params        taskParams;
    //Error_Block        eb;

    server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (server == -1)
    {
        System_printf("Error: socket not created.\n");
        goto shutdown;
    }


    memset(&localAddr, 0, sizeof(localAddr));
    localAddr.sin_family = AF_INET;
    localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localAddr.sin_port = htons(arg0);

    status = bind(server, (struct sockaddr *)&localAddr, sizeof(localAddr));
    if (status == -1) {
        System_printf("Error: bind failed.\n");
        goto shutdown;
    }

    status = listen(server, NUMTCPWORKERS);
    if (status == -1) {
        System_printf("Error: listen failed.\n");
        goto shutdown;
    }

    optval = 1;
    if (setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
        System_printf("Error: setsockopt failed\n");
        goto shutdown;
    }


   // Current_init();


    while ((clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen)) != -1)
    {
        connection_Stat=1;
        lcd_clear();
        HAL_Delay(2000);
        lcd_put_cur(0, 0);
        lcd_send_string("Remote Mode");
        if(LC_RMT_PIN)
            {
                   MODE=LOCAL;
            }
            while(1)
            {
                if(MODE==LOCAL)
                {
                    Local_Mode_operation();
                    lcd_clear();
                    lcd_put_cur(0, 0);
                    lcd_send_string("Remote Mode");
                    HAL_Delay(2000);
                }
               while(MODE==REMOTE)
               {
                   status = checkLinkState();
                   if(status==0 || connection_Stat==0)
                   {
                      // clientfd=0;
                       clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen);
                   }
                   else
                   {
                          uint8_t Eth_Buffer[129];
                          if(LC_RMT_PIN)
                           {
                              lcd_clear();
                              HAL_Delay(10);
                              lcd_put_cur(0, 0);
                              lcd_send_string("Local Mode");
                              HAL_Delay(5000);
                              lcd_clear();
                              MODE=LOCAL;
                              break;
                           }
                          //recv(lSocket,(char *)rcvd_data,10, MSG_DONTWAIT);
                          recv(clientfd,(char *)rcvd_data,10, MSG_DONTWAIT);
                          if(rcvd_data[0]=='C')
                          {
                              channel_no=((rcvd_data[1]-48)*10 + (rcvd_data[2]-48));
                              float val = ((rcvd_data[4]-48)*1000);
                              val += (rcvd_data[6]-48)*100;
                              val += (rcvd_data[7]-48)*10;
                              val += (rcvd_data[8]-48);
                              Set_point[channel_no]=val/1000;
                              memset(rcvd_data,0x00,sizeof(rcvd_data));
                          }
                          Eth_Buffer[0]=0x2A;

                          for(uint8_t i=0;i<32;i++)
                          {
                              Mux_1_2_add(i);
                             // HAL_Delay(10);
                              for(uint8_t j=0;j<5;j++)
                              {
                                  ADCSequenceDataGet(ADC0_BASE, 0, &ADCValues);
                                  volt=(ADCValues*3.3/4096);
                              }

                              volt= volt*1000;
                              uint8_t t=i*4;
                              Eth_Buffer[t+1]=((int)volt >> 24) & 0xFF;
                              Eth_Buffer[t+2]=((int)volt >> 16) & 0xFF;
                              Eth_Buffer[t+3]=((int)volt >> 8) & 0xFF;
                              Eth_Buffer[t+4]=(int)volt & 0xFF;

                          }
                          //stat=send(lSocket, Eth_Buffer,sizeof(Eth_Buffer), 0 );

                          stat=send(clientfd, Eth_Buffer,sizeof(Eth_Buffer), 0 );
                          if(stat<0)
                              connection_Stat=0;
                          else
                              connection_Stat=1;
                   }
               }
            }
    }
    addrlen = sizeof(clientAddr);
    goto restart;


    System_printf("Error: accept failed.\n");

shutdown:
    if (server > 0)
    {
        close(server);
    }
}

请帮助

此致

霍迪达斯

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

    您好!

     我不是 TI-RTOS NDK 的专家、也不知道问题的原因。 我发现此帖子包含了可能值得尝试的变通办法。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/710149/rtos-tm4c1290ncpdt-ndk-in-ti-rtos-works-intermittently-after-being-shutdown-and-restarted

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

    您好!

    已阅读您建议的链接、并发现没有与创建的此类文件链接。 项目。 我已将 TCP 回显示例作为模板并针对所需的实现方式进行了修改。  
    因此、如果有人可以帮助我在 TI-RTOS NDK 中实现此类解决方案、 任何帮助都是可调用的。

    谢谢、此致

    霍迪达斯

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

    您好!

     上述文件位于 C:\ti_tirtos_tivac_2_16_00_08\products\tidrivers_tivac_2_16_00_08\packages/ti\drivers\emac\emacSnow.c 中 您只需将此文件复制到您的项目文件夹、进行上述修改、然后与其余应用程序文件一起重新编译。  

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

    您好!

    最后、当 TM4C1294作为客户端工作时、我已解决了此问题。 但是、我的要求是在服务器中实施 、这有助于配置 PC/客户端 IP 地址、因为任何地址都不会将客户端严格绑定到特定 IP 以与设备连接。

    因此,根据您的建议,我们将尽快尝试并返回这里。

    此致

    霍迪达斯

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

    您好!

     很高兴您的问题得到解决。 您是否会详细说明您如何解决与社区分享的问题?  

    [引用 userid="289369" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1135947/tm4c1294kcpdt-tcp-client-server-reconnect-issue/4217893 #4217893">因此,根据您的建议,请尽快尝试,然后返回此处。
    [/报价]

    我现在将关闭该线程。 如果您有任何更新、请 回写此帖子、该主题将自动重新打开。 为了给你一个抬头,我将在下星期二之前离开办公室。

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

    您好!

     当我断开电缆时、问题再次出现。 链接状态变为0,当我再次连接电缆时,链接状态变为1,但这是我尝试与服务器连接,但连接功能 崩溃。 附加代码片段。

    此致

    霍迪达斯

    while(MODE==REMOTE)
               {
                   status = checkLinkState();
                   if(status==0 || connection_Stat==0)
                   {
                       if(status==0)
                       {
                           connection_Stat=0;
                           lcd_put_cur(1, 0);
                           lcd_send_string("connect Ethernet");
                       }
                       else if(connection_Stat==0)
                       {
                         lcd_put_cur(1, 0);
                         lcd_send_string("Server not ready");
                       }
                       if(LC_RMT_PIN)
                          {
                              MODE=LOCAL;
                              goto Local;
                          }
    
                   }
                   if(status && connection_Stat==0)
                      {
    
                             fdClose(lSocket);
                             fdOpenSession(TaskSelf());
                             lSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
                             if (lSocket < 0)
                             {
                                // System_printf("tcpHandler: socket failed\n");
                                 Task_exit();
                                 return;
                             }
    
                             memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
                             sLocalAddr.sin_family = AF_INET;
                             sLocalAddr.sin_addr.s_addr = inet_addr("192.168.1.130");//htonl(INADDR_ANY);
                             sLocalAddr.sin_port = htons(arg0);
    
                             connection_Stat=0;
                              while(connect(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0)
                                 {
                                     if(LC_RMT_PIN)
                                     {
                                         MODE=LOCAL;
                                         goto Local;
                                     }
                                     SysCtlDelay(400000);
                                 }
                              connection_Stat=1;
                              lcd_clear();
                              lcd_put_cur(0, 0);
                              lcd_send_string("Remote Mode");
                      }
                   else
                   {
                          uint8_t Eth_Buffer[129];
                          if(LC_RMT_PIN)
                           {
                              lcd_clear();
                              HAL_Delay(10);
                              lcd_put_cur(0, 0);
                              lcd_send_string("Local Mode");
                              HAL_Delay(5000);
                              lcd_clear();
                              MODE=LOCAL;
                              break;
                           }
                           stat=recv(lSocket,(char *)rcvd_data,10, MSG_DONTWAIT);
    
                          if(rcvd_data[0]=='C')
                          {
                              channel_no=((rcvd_data[1]-48)*10 + (rcvd_data[2]-48));
                              float val = ((rcvd_data[4]-48)*1000);
                              val += (rcvd_data[6]-48)*100;
                              val += (rcvd_data[7]-48)*10;
                              val += (rcvd_data[8]-48);
                              Set_point[channel_no]=val/1000;
                              memset(rcvd_data,0x00,sizeof(rcvd_data));
                          }
                          Eth_Buffer[0]=0x2A;
    
                          for(uint8_t i=0;i<32;i++)
                          {
                              Mux_1_2_add(i);
                             // HAL_Delay(10);
                              for(uint8_t j=0;j<5;j++)
                              {
                                  ADCSequenceDataGet(ADC0_BASE, 0, &ADCValues);
                                  volt=(ADCValues*3.3/4096);
                              }
    
                              volt= volt*1000;
                              uint8_t t=i*4;
                              Eth_Buffer[t+1]=((int)volt >> 24) & 0xFF;
                              Eth_Buffer[t+2]=((int)volt >> 16) & 0xFF;
                              Eth_Buffer[t+3]=((int)volt >> 8) & 0xFF;
                              Eth_Buffer[t+4]=(int)volt & 0xFF;
    
                          }
                          stat=send(lSocket, Eth_Buffer,sizeof(Eth_Buffer), 0 );
                          if(stat<0)
                          {
                              connection_Stat=0;
                              lcd_put_cur(1, 0);
                              lcd_send_string("Server not ready");
                          }
                          else
                          {
                              //connection_Stat=1;
                          }
                   }
               }

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

    您好!

     是您为客户端或服务器端发布的代码。 如果是针对客户、我会有点困惑。  sLocalAddr 是否适用于服务器? 变量名 sLocalAddr 有点令人困惑。 通常、对于客户端、您需要设置服务器 IP 地址和端口、以便可以使用 connect 命令连接到服务器。 我建议您将变量名称从 sLocalAddr 更改为 sServerAddr 以避免混淆。  

    memset ((char *)&sLocalAddr、0、sizeof (sLocalAddr));
    sLocalAddr.Sin_Family = AF_iNet;
    sLocalAddr.sin addr.s_addr = inet_addr ("192.168.1.130");//htonl (INADDR_ANY);
    sLocalAddr.Sin_port = htons (arg0);

    connection_Stat=0;
    while (connect (lSocket、(struct socaddr *)和 sLocalAddr、sizeof (sLocalAddr))< 0)

    它在哪里崩溃? 您是否有足够的堆栈和堆存储器? 您能否使用 ROV 来确定堆栈或堆是否已用完? 您能否增加它们以查看它是否会产生影响? 您以前似乎解决了客户方面的问题。 您采取了哪些措施来解决该问题?