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/DK-TM4C129X:创建静态 Web 服务器任务时、使用 NDK 的 TCP 服务器套接字不起作用

Guru**** 2483995 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/727423/rtos-dk-tm4c129x-tcp-server-socket-not-working-using-ndk-when-web-server-task-is-created-static

器件型号:DK-TM4C129X

工具/软件:TI-RTOS

您好!

我将 DK-TM4C129以及 TI RTOS 和 NDK 用于 Web 服务器应用。 我开始使用 tcpecho、然后我就能使它正常工作了。

我修改了 tcpecho 代码、如下所示、并且能够使其与动态创建的 Web 服务器任务配合使用。 但是、当我尝试使用挂钩上的 Semaphore_post 和 web_server_task 上的 Semaphore_pend 静态执行它时、我会不断收到错误。 套接字函数返回-1。

如果您继续向下滚动、我还添加了任务为静态的代码。 我找到了该计划。 挂钩被调用、然后 web_server_task 在挂起后运行其余代码。 我不明白为什么套接字返回-1错误。 顺便说一下、在这里、web_server_task 是使用配置文件创建的。 如果我删除了配置文件中的任务并切换回任务的动态创建、则代码工作正常。 如果有任何帮助,将不胜感激
谢谢
AJ
void enet_open_hook (void)

   Task_handle taskHandle;
   Task_Params taskParams;
   ERROR_Block EB;
   /*确保已初始化 Error_Block */
   ERROR_INIT (&EB);
   /*
    * 创建一个任务,该任务将建立传入的 TCP 连接。
    * arg0将是此任务侦听的端口。
    *
   Task_Params_init (&taskParams);
   taskParams.STACKSIZE = 1024;
   taskParams.priority = 1;
   //taskParams.arg0 = TcpPort;
   任务处理= Task_create ((Task_FuncPtr) web_server_task、&taskParams、&EB);
   if (taskHandle == NULL){
       System_printf ("netOpenHook:创建 tcpHandler 任务失败\n");
   }
   system_flush();
}//end void enet_open_hook (void)
/********* /
void web_server_task (void)

   uint8_t val_array[10];
   int bytesRcvd;
   int bytesSent;
   char buffer[256];
   int               服务器;
   int               clientfd;
   INT               状态;
   int               optval;
   int               optlen = sizeof (optval);
   struct sockaddr_in localAddr;
   struct sockaddr_in clientAddr;
   socklen_t         addrlen = sizeof (clientAddr);

   Write_UART ("\n\n\r\n\r\n 正在运行 Web 服务器任务...");
   服务器=套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP);
   Write_UART ("\n\n\r 服务器套接字=");
   long_TO_ASCII (server、val_array);
   WRITE_UART (val_array);
   if (服务器<=0)
   {
       Write_UART ("\n\r 主套接字失败");
   }
   memset (localAddr、0、sizeof (localAddr));
   localAddr.Sin_Family = AF_iNet;
   localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
   localAddr.Sin_port = htons(80);
   status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
   如果(状态< 0)
   {
       Write_UART ("\n\n\r 错误绑定");
   }
   状态=侦听(服务器、3);
   如果(状态< 0)
   {
       WRITE_UART ("\n\n\r 错误监听");
   }
   optval = 1;
   if (setsockopt (server、SOL_socket、SO_keepalive、&optval、optlen)< 0)
   {
       Write_UART ("\n\n\rError setsockopt");
   }

   while ((clientfd = accept (server、(struct sockaddr *)&clientAddr、&addrlen)!=-1)
   {
       Write_UART ("\n\rClientfd 套接字=");
       long_TO_ASCII (clientfd、val_array);
       WRITE_UART (val_array);
       while ((bytesRcvd = recv (clientfd、buffer、256、0))> 0)
       {
           字节 Sent = SEND (clientfd、buffer、字节 Rcvd、0);
           if (bytesSent < 0 || bytesSent!= bytesRcvd)
           {
               WRITE_UART ("\n\rError byte send/rcv");
           }
       }
   }//结束 while (1)
//end void web_server_task (void)
void enet_open_hook (void)

  
   Sempahore_post (server_sem);
}//end void enet_open_hook (void)
/********* /
void web_server_task (void)

   uint8_t val_array[10];
   int bytesRcvd;
   int bytesSent;
   char buffer[256];
   int               服务器;
   int               clientfd;
   INT               状态;
   int               optval;
   int               optlen = sizeof (optval);
   struct sockaddr_in localAddr;
   struct sockaddr_in clientAddr;
   socklen_t         addrlen = sizeof (clientAddr);
  Semaphore_pend (server_sem、BIOS_wait_forever);
   Write_UART ("\n\n\r\n\r\n 正在运行 Web 服务器任务...");
   服务器=套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP);
   Write_UART ("\n\n\r 服务器套接字=");
   long_TO_ASCII (server、val_array);
   WRITE_UART (val_array);
   if (服务器<=0)
   {
       Write_UART ("\n\r 主套接字失败");
   }
   memset (localAddr、0、sizeof (localAddr));
   localAddr.Sin_Family = AF_iNet;
   localAddr.sin_addr.s_addr = htonl (INADDR_ANY);
   localAddr.Sin_port = htons(80);
   status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr));
   如果(状态< 0)
   {
       Write_UART ("\n\n\r 错误绑定");
   }
   状态=侦听(服务器、3);
   如果(状态< 0)
   {
       WRITE_UART ("\n\n\r 错误监听");
   }
   optval = 1;
   if (setsockopt (server、SOL_socket、SO_keepalive、&optval、optlen)< 0)
   {
       Write_UART ("\n\n\rError setsockopt");
   }

   while ((clientfd = accept (server、(struct sockaddr *)&clientAddr、&addrlen)!=-1)
   {
       Write_UART ("\n\rClientfd 套接字=");
       long_TO_ASCII (clientfd、val_array);
       WRITE_UART (val_array);
       while ((bytesRcvd = recv (clientfd、buffer、256、0))> 0)
       {
           字节 Sent = SEND (clientfd、buffer、字节 Rcvd、0);
           if (bytesSent < 0 || bytesSent!= bytesRcvd)
           {
               WRITE_UART ("\n\rError byte send/rcv");
           }
       }
   }//结束 while (1)
//end void web_server_task (void)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面是您的代码片段。 您编写了 Sempahore_post ()而不是 Semaphore_post ()。 首先尝试修复此问题、然后查看此问题是否得到解决。

    void enet_open_hook (void)


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

    您好、Charles、

    感谢您的回答。 我进行了更正、但仍然遇到问题。

    顺便说一下、在可能不完全相关的注释中、我在运行 tcpecho 采样程序时打印了套接字编号。 获得一个巨大的套接字编号(套接字函数返回值)是否正常... 比如537048868?

    我在其他微控制器中完成了套接字编程、例如 Synergy S7、通常套接字函数返回32到64之间的值。 我相信在 Windows 上执行此操作时也是如此(并非100%肯定)。 对此有什么想法吗?

    谢谢

    AJ  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我终于弄清楚了这一点。 我必须补充一点

    fdOpenSession (Task_self ())位于 semaphore_pend 之后、恰好在我运行 BSD 代码之前。

    为什么会出现这种情况? 我不理解。 此外、我仍然被套接字函数返回的巨大套接字 ID 所困扰。

    AJ