OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3980|回复: 3

LwIP+FreeRTOS TCP server 重启问题

[复制链接]

28

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-10-11
在线时间
38 小时
发表于 2019-9-28 10:16:56 | 显示全部楼层 |阅读模式
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,导致接收函数为阻塞态,导致拔出网线无法退出接收函数,加超时后,超时时自动会退出连接,插好网线连接时,自动会连接上的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-10-11
在线时间
38 小时
 楼主| 发表于 2019-9-28 10:16:57 | 显示全部楼层
还是自己回答吧。
代码基本没问题,就是需要在新建的conn里把接收超时打开就行了。因为移植了freeRTOS+LwIP,导致接收函数为阻塞态,导致拔出网线无法退出接收函数,加超时后,超时时自动会退出连接,插好网线连接时,自动会连接上的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-9-29 02:31:52 | 显示全部楼层
帮顶
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2019-12-25 18:52:01 | 显示全部楼层
请问楼主能否较详细说明一下是哪个函数需要修改参数吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 17:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表