STM32 LwiP多个TCP服务器

时间:2017-07-03 13:31:51

标签: tcp stm32 freertos lwip

我尝试在STM32F107上安装3或4个tcp服务器。我使用freeRTOS和LwIP(以及CubeMX + ST HAL库)。

我创建了一个任务tcp_server,在任务中,我创建了3个netconn结构,每个结构都有不同的tcp端口。 回调:

void socket_callback(struct netconn * conn, enum netconn_evt evt, u16_t len)
{
    queue_event_t msg;
    if (evt == NETCONN_EVT_RCVPLUS)
    {
            msg.cmd = MSG_TEST;
            if (conn == user_conn.conn_modbus)
                msg.cmd = MSG_MODBUS;
            else if (conn == user_conn.conn_modbus_listen)
                msg.cmd = MSG_MODBUS_LISTEN;
            else if (conn == user_conn.conn_rs232)
                msg.cmd = MSG_RS232;
            else if (conn == user_conn.conn_rs232_listen)
                msg.cmd = MSG_RS232_LISTEN;
            else if (conn == user_conn.conn_rs485)
                msg.cmd = MSG_RS485;
            else if (conn == user_conn.conn_rs485_listen)
                msg.cmd = MSG_RS485_LISTEN;
            xQueueSend(user_conn.evtQueue, &msg, 1000);
    }
}

服务器创建:

static struct netconn * createServer(int port) 
{
    struct netconn * conn;
    err_t err;

    conn = netconn_new_with_callback(NETCONN_TCP, socket_callback);
    if (conn == NULL) 
    {
          char *msg = "Cannot create netconn\n\r";
          HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
          return NULL;
    }

    err = netconn_bind(conn, NULL, port);
    if (err != ERR_OK)
    {
        char *msg = "Error in Binding \n\r";
        HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
        print_error(err);
        netconn_delete(conn);
        return NULL;
    }
    err = netconn_listen(conn);
    if (err != ERR_OK)
    {
      char *msg = "Error in listenning \n\r";
      HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
        print_error(err);
        netconn_delete(conn);
        return NULL;
    }
    return conn;
}

线程:

static void servertcp_thread()
{
    queue_event_t evt;
    user_conn.evtQueue = xQueueCreate(10, sizeof (queue_event_t));
    user_conn.conn_modbus_listen = createServer(502);
    user_conn.conn_rs232_listen = createServer(10001);
    user_conn.conn_rs485_listen = createServer(50001);

    while(1)
   {
        waitServer(&user_conn, &evt);
        send_rs232(&user_conn);
        send_rs485(&user_conn);
        if((user_conn.conn_modbus_listen != NULL) && (evt.cmd == MSG_MODBUS_LISTEN))
            processModbusListen(&user_conn);
        if((user_conn.conn_rs232_listen != NULL) && (evt.cmd == MSG_RS232_LISTEN))
            processRS232Listen(&user_conn);
        if((user_conn.conn_rs485_listen != NULL) && (evt.cmd == MSG_RS485_LISTEN))
            processRS485Listen(&user_conn);
        if((user_conn.conn_modbus != NULL) && (evt.cmd == MSG_MODBUS))
            modbus_tcp_server(&user_conn);
        if((user_conn.conn_rs232 != NULL) && (evt.cmd == MSG_RS232))
            rs232_tcp_server(&user_conn);
        if((user_conn.conn_rs485 != NULL) && (evt.cmd == MSG_RS485))
            rs485_tcp_server(&user_conn);
   }
}

创建成功(netconn_new_with_callback / netconn_bind和netconn_listen没有错误)。

当我尝试连接到1个tcp端口时,它被接受,一切正常。

但是当我尝试连接到第二个端口而第一个连接仍处于活动状态时,会调用回调,但netconn_accept(conn,& newconn);失败并报告ERR_ABRT,我不知道为什么。

3函数(processModbusListen,processRS232Listen和processRS485Listen)按照相同的原型进行编码:

static int processXXXListen(user_conn_t * user_data) 
{
    struct netconn *newconn;
    err_t error_accept;
    error_accept = netconn_accept(user_data->conn_XXX_listen, &newconn);
    if (error_accept == ERR_OK)
    {
        if (user_data->conn_rs485)
        {
            // Close unwanted connection
            netconn_close(newconn);
            netconn_delete(newconn);
            char *msg = "Error XXX Connection during establishement\n\r";
            HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
        }
        else
        {
            // connection established
            char *msg = "XXX Connection established\n\r";
            HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
            user_data->conn_XXX = newconn;
        }
    }
    else
    {
        char *msg = "Error in acceptation TCP XXX connection\n\r";
        HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF);
        print_error(error_accept);
    }
    return 0;
}

奇怪的是,当我只创建2个netconn结构时,我在同一时间对2连接没有任何问题。

什么会导致连接中止? 如何在同一时间获得3连接? 如果有可能的话......

1 个答案:

答案 0 :(得分:0)

好的,是的,经过1天的测试, 参数

#define MEMP_NUM_NETCONN 4

绝对是让我烦恼的原因。 我只需将其设置为10,一切都像魅力一样