中级会员
- 积分
- 313
- 金钱
- 313
- 注册时间
- 2013-10-11
- 在线时间
- 38 小时
|
10金钱
请教LwIP+FreeRTOS。希望能实现拔插网线自动重启TCP服务器。ST例程代码如下,请帮忙看看。
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);
}
}
}
void tcpecho_init(void)
{
sys_thread_new("tcpecho_thread", tcpecho_thread, NULL, DEFAULT_THREAD_STACKSIZE, TCPECHO_THREAD_PRIO);
}
/** 这里是网线热拔插检测功能,希望能实现拔插网线自动重启TCP服务器
* @brief This function notify user about link status changement.
* @param netif: the network interface
* @retval None
*/
void ethernetif_notify_conn_changed(struct netif *netif)
{
/* NOTE : This is function could be implemented in user file
when the callback is needed,
*/
if(netif_is_link_up(netif))
{
/* When the netif is fully configured this function must be called.*/
netif_set_up(netif);
tcpecho_init(); //这里增加是否正确?
}
else
{
/* When the netif link is down this function must be called.*/
netif_set_down(netif);
}
}
代码里创建TCP服务流程是:
sys_thread_new("tcpecho_thread...
netconn_new(NETCONN_TCP);
netconn_bind(conn, NULL, 7);
netconn_listen(conn);
netconn_recv(newconn, &buf)
netconn_write(newconn, data, len, NETCONN_COPY);
循环记录及发送数据即可。我想问的是TCP服务已正常工作,网线拔插,如何重启这流程?是需要直接删除创建的任务?还是需要先用netconn_close(newconn);netconn_delete(newconn);删除连接,再删除线程后重新创建?
|
最佳答案
查看完整内容[请看2#楼]
还是自己回答吧。
代码基本没问题,就是需要在新建的conn里把接收超时打开就行了。因为移植了freeRTOS+LwIP,导致接收函数为阻塞态,导致拔出网线无法退出接收函数,加超时后,超时时自动会退出连接,插好网线连接时,自动会连接上的。
|