Вопрос. Как создать потоки в FreeRTOS для обработки нескольких клиентов на TCP-сервере с помощью LwIP Netconn API?

Я запускаю пример tcpecho на основе LwIP Netconn API, код из http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257896, в частности, приложение эхо-сервера TCP, описанное в примечаниях по применению UM1713. , и запустить прошивку в папке LwIP_UDPTCP_Echo_Server_Netconn_RTOS, так как я использую FreeRTOS. Код ниже.

Сервер 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);
}
}
}

person eRod    schedule 26.06.2015    source источник


Ответы (1)


Создайте несколько потоков с помощью следующего 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);
person Mohsin    schedule 04.07.2015
comment
Спасибо за ответ, но у меня есть еще вопросы. Разве мы не должны привязываться только к порту 7 (эхо-порт)? Зачем привязка к порту 80 или 4000? Имеет ли значение, какие номера портов мы должны привязать? Сколько потоков нам нужно создать? - person eRod; 07.07.2015
comment
несколько клиентов должны быть привязаны к разным портам. если один клиент привязан к порту 7, другой клиент должен быть привязан к другому номеру порта. - person Mohsin; 09.07.2015