问:如何使用LwIP Netconn API在FreeRTOS中创建线程来处理TCP服务器上的多个客户端?

时间:2015-06-26 19:20:08

标签: multithreading tcp server freertos lwip

我正在运行基于LwIP Netconn API的tcpecho示例,来自http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257896的代码,特别是应用笔记UM1713中描述的TCP echo服务器应用程序,以及因为我使用FreeRTOS而在LwIP_UDPTCP_Echo_Server_Netconn_RTOS文件夹下运行固件。 代码如下。

tcpecho服务器已经在一个线程上运行,但是一次只能处理1个客户端,所以我想将其更改为处理多个客户端。到目前为止,我从不同的论坛上读到,解决方案是使用多个线程来处理多个客户端。由于我不是FreeRTOS的专家,有人能说明如何做到这一点吗?

谢谢,

static void tcpecho_thread(void *arg)
{
  struct netconn *conn, *newconn;
  err_t err, accept_err;
  struct netbuf *buf;
  void *data;
  u16_t len;

LWIP_UNUSED_ARG(arg);

/* Create a new connection identifier. */
conn = netconn_new(NETCONN_TCP);

if (conn!=NULL)
{  
/* Bind connection to well known port number 7. */

err = netconn_bind(conn, NULL, 7);

if (err == ERR_OK)
{
  /* Tell connection to go into listening mode. */
  netconn_listen(conn);

  while (1) 
  {
    /* Grab new connection. */
     accept_err = netconn_accept(conn, &newconn);

    /* Process the new connection. */
    if (accept_err == ERR_OK) 
    {

      while (netconn_recv(newconn, &buf) == ERR_OK) 
      {
        do 
        {
          netbuf_data(buf, &data, &len);
          netconn_write(newconn, data, len, NETCONN_COPY);

        } 
        while (netbuf_next(buf) >= 0);

        netbuf_delete(buf);
      }

      /* Close connection and discard connection identifier. */
      netconn_close(newconn);
      netconn_delete(newconn);
    }
  }
}
else
{
  netconn_delete(newconn);
}
}
}

1 个答案:

答案 0 :(得分:0)

使用以下API创建多个线程:

sys_thread_new("TCPECHO", tcp_echoserver_netconn_thread, NULL,
               TCPECHOSERVER_THREAD_STACKSIZE, TCPECHOSERVER_THREAD_PRIO);

在创建新netconn之后的每个线程中将其绑定到不同的端口, 例如:

  • 在主题1中==> err = netconn_bind(conn, NULL, 80);
  • 在主题2中==> err = netconn_bind(conn, NULL, 4000);