STM32 LwiP 多 TCP 服务器
STM32 LwiP Multiple TCP Server
我试图在我的 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 天的测试,
参数
#define MEMP_NUM_NETCONN 4
绝对是我的麻烦。
我只需要将它设置为 10,一切都很好
我试图在我的 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 天的测试, 参数
#define MEMP_NUM_NETCONN 4
绝对是我的麻烦。 我只需要将它设置为 10,一切都很好