搜索
bottom↓
回复: 9

关于lwip的掉线问题请教【付费咨询】?

[复制链接]

出40入0汤圆

发表于 2021-3-8 22:30:34 | 显示全部楼层 |阅读模式
500汤圆
1.上次那个问题,组播太大,导致lwip挂掉ping不同。
经过测试发现是无法接收数据,可以发送数据。后面我改了组播过滤,貌似解决了问题。。两三天不出问题

2.到了后面,发现还有部分设备直接挂掉,无法ping通。我觉得发送挂掉了。

排除最原始的组播报文导致设备挂掉竞争因素造成,我将接收中断由大循环处理,可以仍然会受大量数据冲击挂掉情况。也就是问题1,不是接收竞争引起的。

我的lwip就使能了DHCP,IGMP,UDP,UDP我是同时开启了两个PCB进行接收,指定PCB2发送,初始化以及发送如下。发送是在任意时候发送,接收目前也是已经修改为大循环接收。

现在不知道在哪些地方可能会卡死,目前lwip版本为2.1.2的版本,此事已困扰我很久。恳请各位了解的能帮忙分析解决一下。



  1. /**
  2. ******************************************************************************
  3. * @file    server.c
  4. * @author  MCD Application Team
  5. * @version V1.0.0
  6. * @date    11/20/2009
  7. * @brief   A sample UDP/TCP server application.
  8. ******************************************************************************
  9. * @copy
  10. *
  11. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13. * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  14. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17. *
  18. * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
  19. */

  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "lwip/pbuf.h"
  23. #include "lwip/udp.h"
  24. #include "lwip/tcp.h"
  25. #include "lwip/igmp.h"
  26. #include <string.h>
  27. #include <stdio.h>


  28. #define UDP_SERVER_PORT 8888/* define the UDP local connection port */
  29. #define UDP_CLIENT_PORT 8888/* define the UDP remote connection port */



  30. void udp_server_callback( void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port );
  31. void udp2_server_callback( void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port );

  32. struct udp_pcb        *upcbSer;
  33. struct udp_pcb        *upcbSer2;

  34. u16_t                LastPort;
  35. ip_addr_t        LastAddress;
  36. void UdpServer_init( void )
  37. {
  38.   upcbSer = udp_new();
  39.   
  40.   udp_bind( upcbSer, IP_ADDR_ANY, UDP_SERVER_PORT );
  41.   udp_recv( upcbSer, udp_server_callback, NULL );

  42.   upcbSer2=udp_new();
  43.   udp_bind( upcbSer2, IP_ADDR_ANY, UDP_SERVER_PORT );
  44.   udp_recv( upcbSer2, udp2_server_callback, NULL );
  45.   upcbSer2->local_port=3671;

  46. }





  47. void udp_server_callback( void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port )
  48. {
  49.   
  50.   
  51.   Remote_IPPort        = port;
  52.   Remote_IPAddress[3]=((addr->addr>>24)&0xFF);
  53.   Remote_IPAddress[2]=((addr->addr>>16)&0xFF);
  54.   Remote_IPAddress[1]=((addr->addr>>8)&0xFF);
  55.   Remote_IPAddress[0]=((addr->addr>>0)&0xFF);
  56.   
  57.   UCHAR *pBuffer;
  58.   pBuffer=(unsigned char *) p->payload;
  59.   
  60. //处理数据部分

  61.   pbuf_free( p );
  62. }

  63. #if USE_SEC_UDP

  64. void udp2_server_callback( void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port )
  65. {
  66.   
  67.   Remote_IPPort        = port;
  68.   Remote_IPAddress[3]=((addr->addr>>24)&0xFF);
  69.   Remote_IPAddress[2]=((addr->addr>>16)&0xFF);
  70.   Remote_IPAddress[1]=((addr->addr>>8)&0xFF);
  71.   Remote_IPAddress[0]=((addr->addr>>0)&0xFF);
  72.   
  73.   UCHAR *pBuffer;
  74.   pBuffer=(unsigned char *) p->payload;
  75.   
  76.   
  77.   //处理数据部分
  78.   pbuf_free( p );
  79. }

  80. #endif



  81. void udp_server_send_data(UCHAR *pBuffer,USHORT pLength,UCHAR *pDestAddr,USHORT pDestPort)
  82. {

  83.   struct pbuf        * p;
  84.   ip_addr_t nIpAddr;
  85.   p                = pbuf_alloc( PBUF_TRANSPORT, pLength, PBUF_ROM );
  86.   p->payload        = pBuffer;
  87.   
  88.   nIpAddr.addr=(pDestAddr[3]<<24)|(pDestAddr[2]<<16)|(pDestAddr[1]<<8)|(pDestAddr[0]);
  89.   
  90.   udp_connect( upcbSer2, &nIpAddr, pDestPort);
  91.   udp_send( upcbSer2, p );
  92.   udp_disconnect( upcbSer2 );
  93.   udp_bind( upcbSer2, IP_ADDR_ANY, UDP_SERVER_PORT );
  94.   udp_recv( upcbSer2, udp2_server_callback, NULL );
  95.   
  96.   pbuf_free( p );
  97.   

  98. }

复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出40入0汤圆

 楼主| 发表于 2021-3-8 22:33:06 | 显示全部楼层
本帖最后由 anhuicainong 于 2021-3-8 22:46 编辑

我认为屏蔽组播地址进来,并未找到最终的原因,目前这个问题复现的情况比较少,而且该产品安装在国外,只能通过远程升级固件来进行测试验证

可以使用一个MEMP_NUM_UDP_PCB,对应多个客户端嘛?

出100入113汤圆

发表于 2021-3-9 08:56:53 | 显示全部楼层
我使用的是 V2.0.3,据说这个版本最稳定,可以试试。另外,我觉得大概率是 LWIP 的配置问题,特别是各个 buff 大小的配置,仔细了解一下各项配置参数。
没有太多信息,无法具体分析,我以前测试过一下组播,没有压力测试,所以也不确定我的配置是否就是稳定的,并且你还开了很多其他服务,可能内存消耗上比较大。
我怀疑是内存动态分配失败导致挂起?

出100入113汤圆

发表于 2021-3-9 08:59:33 | 显示全部楼层
还有一个地方,以前我做 TCP 接收压力测试时,也会出现阻塞死线程的情况,其实就是内存分配不足导致。加大内存,并做心跳检测重启后,这个问题解决了。

出40入0汤圆

 楼主| 发表于 2021-3-9 10:23:54 来自手机 | 显示全部楼层
saccapanna 发表于 2021-3-9 08:59
还有一个地方,以前我做 TCP 接收压力测试时,也会出现阻塞死线程的情况,其实就是内存分配不足导致。加大 ...

你看下我的初始化是否有问题?
我的服务不多,数据量也不大,所以很奇怪
UDP是收个就断开的机制吗?
不胜感激

出100入113汤圆

发表于 2021-3-9 11:13:14 | 显示全部楼层
anhuicainong 发表于 2021-3-9 10:23
你看下我的初始化是否有问题?
我的服务不多,数据量也不大,所以很奇怪
UDP是收个就断开的机制吗?

如果能正常通信,只是跑一段时间会断开,应该就不是使用的问题,大概率是配置的问题。我没有用过 UDP,我只用过TCP。以下是我对配置的一些测试和注释,你仔细看看。
产品出去前,在研发阶段就应该做压力测试,我们用LWIP系统做了很多配置和压力测试后,才敢用于产品。以下配置在 STM32F429上,两路TCP毫无问题

配置贴出来,结果有敏感词发不了,算了,你自己好好检查一下配置,特别是内存相关的。

出40入0汤圆

 楼主| 发表于 2021-3-9 13:41:18 来自手机 | 显示全部楼层
saccapanna 发表于 2021-3-9 11:13
如果能正常通信,只是跑一段时间会断开,应该就不是使用的问题,大概率是配置的问题。我没有用过 UDP,我 ...

能否打包上传一下,不胜感激!udp比tcp容易很多。所以要现在出这样的问题,我都懵了

出100入113汤圆

发表于 2021-3-9 14:33:14 | 显示全部楼层
本帖最后由 saccapanna 于 2021-3-9 14:47 编辑
anhuicainong 发表于 2021-3-9 13:41
能否打包上传一下,不胜感激!udp比tcp容易很多。所以要现在出这样的问题,我都懵了 ...




LWIP配置

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出40入0汤圆

 楼主| 发表于 2021-3-9 22:57:30 来自手机 | 显示全部楼层
saccapanna 发表于 2021-3-9 14:33
LWIP配置

谢谢答复,我用下2.0.3的试试!

出0入59汤圆

发表于 2021-3-10 16:42:35 | 显示全部楼层
做产品,不是很熟的话,还是不要用LWIP,网上搜一搜,很多坑
mdk  ucos  threadx 里面的协议栈会更易用些
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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