2015-06-26 24 views
0

我正在運行基於LwIP Netconn API的tcpecho示例,代碼爲http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257896,特別是應用筆記UM1713中描述的TCP回顯服務器應用程序,並且自從我使用FreeRTOS以來在LwIP_UDPTCP_Echo_Server_Netconn_RTOS文件夾下運行固件。 代碼如下。問:如何使用LwIP Netconn API在FreeRTOS中創建線程以處理TCP服務器上的多個客戶端?

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); 
} 
} 
} 

回答

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);
+0

感謝您的回答,但我有更多的問題。我們不應該綁定到只有端口7(回聲端口)?爲什麼綁定到端口80或4000?我們必須綁定哪些端口號碼是否重要?我們需要創建多少個線程? – eRod

+0

多個客戶端必須綁定到不同的端口。如果一個客戶端綁定到端口7,則其他客戶端必須綁定到某個其他端口號。 – Mohsin