搜索
bottom↓
回复: 41

关于lwip的问题,多次连接后连接不上,但是可以ping通

[复制链接]

出0入0汤圆

发表于 2009-9-14 09:09:59 | 显示全部楼层 |阅读模式
用ucosII+lwip 发现连接可以连上,但是多次连接然后断开,这样多次以后就连接不上了,但是ping ip可以ping通,这个是什么问题呢?
需要修改些什么地方呢?

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出215入118汤圆

发表于 2009-9-14 09:16:09 | 显示全部楼层
楼上的现像和我一样!不解中……
头像被屏蔽

出0入0汤圆

发表于 2009-9-14 10:08:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2009-9-14 10:23:12 | 显示全部楼层
这,lwip还是可以应用到实际项目中去的吧, 解决掉这些bug就应该可以了吧,不只是靠看门狗复位这样来做的方法吧

出0入0汤圆

 楼主| 发表于 2009-9-18 11:28:14 | 显示全部楼层
在做lwip的时候还发现了个问题,在局域网内部访问的时候,基本很稳定,
但是通过外网访问到内部局域网,(内部局域网通过路由的端口映射)。这样就会出现频繁的lwip的任务线程死掉的情况。

这个能分析下是什么原因吗?

出0入168汤圆

发表于 2009-9-18 11:45:19 | 显示全部楼层
spaceaky :
  你用的什么片子?

出0入0汤圆

 楼主| 发表于 2009-9-18 12:00:40 | 显示全部楼层
用的 lpc2148 +enc28j60

出0入0汤圆

发表于 2009-9-18 12:25:45 | 显示全部楼层
说说你的连接断开情况吧,我打算在RT-Thread + LwIP上也试试。

是TCP连接然后断开?大概多少次,或者多长时间后出问题?

出0入0汤圆

 楼主| 发表于 2009-9-18 12:42:33 | 显示全部楼层
这个要看你开辟的内存大小,我试过 大概开辟出15k的内存时候 大概通断50多次后就会再也连接不上去了。
这个是在局域网中试的

但是在广域网远程的时候 就不好说了。

出0入0汤圆

发表于 2009-9-18 12:55:29 | 显示全部楼层
【8楼】 spaceaky
你指的是TCP连接吗?如果是TCP连接,我估计是你的移植有些问题。TCP连接断开后会进入TIME_WAITING状态,控制块并不释放。所以这个时候如果有新的连接到达,它将连接不上(因为没有内存资源)。

出0入0汤圆

 楼主| 发表于 2009-9-18 13:33:44 | 显示全部楼层
恩  是tcp连接的。

我的意思是同一个连接 断开,然后连接

出0入0汤圆

 楼主| 发表于 2009-9-18 16:34:16 | 显示全部楼层
【8楼】 spaceaky  
你指的是TCP连接吗?如果是TCP连接,我估计是你的移植有些问题。TCP连接断开后会进入TIME_WAITING状态,控制块并不释放。所以这个时候如果有新的连接到达,它将连接不上(因为没有内存资源)。


这句是什么意思呢

出0入0汤圆

 楼主| 发表于 2009-9-18 17:01:29 | 显示全部楼层
我的enc28j60用的是查询模式

出0入0汤圆

发表于 2009-9-18 17:27:15 | 显示全部楼层
就是,此时要创建一个新的TCP连接,但没有内存块了,所以创建新的TCP连接失败。你可以把lwip的log打开看看,有时lwip出了问题分析它的log是十分有效的方法。

出0入0汤圆

 楼主| 发表于 2009-9-19 15:29:01 | 显示全部楼层
BYTE enc28j60ReadOp(BYTE op, BYTE address)
{
        // activate CS   
        CSACTIVE;   

        // issue read command O
                S0SPDR = op | (address & ADDR_MASK);      

        waitspi();   

        // read data   
        S0SPDR = 0x00;   

        waitspi();   

        // do dummy read if needed (for mac and mii, see datasheet page 29) E
        if (address & 0x80)   
        {   
                S0SPDR = 0x00;
                waitspi();    
        }   

        // release CS   
        CSPASSIVE; ?

        return (S0SPDR);}
总是死在了waitspi(); 这块

出0入0汤圆

 楼主| 发表于 2009-9-22 15:42:47 | 显示全部楼层
我觉得这里死掉应该是网络数据丢包引起的,但是现在还没有找到解决的办法

出0入0汤圆

 楼主| 发表于 2009-9-24 11:45:11 | 显示全部楼层
还有 我在lwip里面使用信号量 也会导致lwip的线程死掉的情况,但是ucos的其他任务可以运行

出0入0汤圆

发表于 2010-5-29 17:16:04 | 显示全部楼层
请高人指点:::::

既然LWIP定位是简单的应用,那么在并不复杂的的应用中应该没有问题吧,
毕竟都发布了很多个版本了。。。
可能还是移植问题,毕竟大多数哥们都对LWIP不是完全了解,
我遇到的问题是:无论怎样断线》链接后,都能PING通。

但是,采用lwip的API(自己的测试程序)与外界通讯时,多次发送接收后就出错,return ERR_MEM;
err_t tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len,
  u8_t flags, u8_t copy,
  u8_t *optdata, u8_t optlen))
{
.
.
.

/* fail on too much data */
  if (len > pcb->snd_buf) {
    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", len, pcb->snd_buf));
    return ERR_MEM;
  }
.
.
.

}
但我跟踪了len并不大(我的测试程序中每次都是29)
关键是pcb->snd_buf 出问题,正常循环每次都减少29,所以多接收和发送后就进入上面的条件,报错。

我初始化时
/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF             1500

即使把TCP_SND_BUF加大也还是一样的问题。。。

我的“LWIPOPTS_H”如下:

#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__

/* ------------------------ Generic options ------------------------------- */
#undef  LWIP_NOASSERT

#define SYS_LIGHTWEIGHT_PROT    1
#define TCPIP_THREAD_PRIO       10

//#define LWIP_DEBUG            1
#define DBG_TYPES_ON            ( DBG_LEVEL_WARNING | DBG_LEVEL_SEVERE | DBG_LEVEL_SERIOUS )
#define FEC_DEBUG               ( DBG_LEVEL_WARNING | DBG_ON )

/* ------------------------ Memory options -------------------------------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
   lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
   byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT           4

/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE                2048

/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
   sends a lot of data out of ROM (or other static memory), this
   should be set high. */
#define MEMP_NUM_PBUF           16
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
   per active UDP "connection". */
#define MEMP_NUM_UDP_PCB        4
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
   connections. */
#define MEMP_NUM_TCP_PCB        8
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
   connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 8
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
   segments. */
#define MEMP_NUM_TCP_SEG        16
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
   timeouts. */
#define MEMP_NUM_SYS_TIMEOUT    4

/* The following four are used only with the sequential API and can be
   set to 0 if the application only will use the raw API. */
/* MEMP_NUM_NETBUF: the number of struct netbufs. */
#define MEMP_NUM_NETBUF         4
/* MEMP_NUM_NETCONN: the number of struct netconns. */
#define MEMP_NUM_NETCONN        4
/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
   communication between the TCP/IP stack and the sequential
   programs. */
#define MEMP_NUM_API_MSG        8
/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
   for sequential API communication and incoming packets. Used in
   src/api/tcpip.c. */
#define MEMP_NUM_TCPIP_MSG      8

/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE          16

/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE       512

/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
   link level header. */
#define PBUF_LINK_HLEN          14

/* ------------------------ TCP options ----------------------------------- */
#define LWIP_TCP                1
#define TCP_TTL                 255

/* Controls if TCP should queue segments that arrive out of
   order. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ         1

/* TCP Maximum segment size. */
#define TCP_MSS                 1500

/* TCP sender buffer space (bytes). */
#define TCP_SND_BUF             1500

/* TCP sender buffer space (pbufs). This must be at least = 2 *
   TCP_SND_BUF/TCP_MSS for things to work. */
#define TCP_SND_QUEUELEN        ( 16 * TCP_SND_BUF/TCP_MSS )

/* TCP receive window. */
#define TCP_WND                 1500

/* Maximum number of retransmissions of data segments. */
#define TCP_MAXRTX              12

/* Maximum number of retransmissions of SYN segments. */
#define TCP_SYNMAXRTX           4

/* ------------------------ ARP options ----------------------------------- */
#define ARP_TABLE_SIZE          10
#define ARP_QUEUEING            1

/* ------------------------ IP options ------------------------------------ */
/* Define IP_FORWARD to 1 if you wish to have the ability to forward
   IP packets across network interfaces. If you are going to run lwIP
   on a device with only one network interface, define this to 0. */
#define IP_FORWARD              0

/* If defined to 1, IP options are allowed (but not parsed). If
   defined to 0, all packets with IP options are dropped. */
#define IP_OPTIONS              1

/* ------------------------ ICMP options ---------------------------------- */
#define ICMP_TTL                255


/* ------------------------ DHCP options ---------------------------------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration of
   interfaces. DHCP is not implemented in lwIP 0.5.1, however, so
   turning this on does currently not work. */
#define LWIP_DHCP               0

/* 1 if you want to do an ARP check on the offered address
   (recommended). */
#define DHCP_DOES_ARP_CHECK     1

/* ------------------------ UDP options ----------------------------------- */
#define LWIP_UDP                1
#define UDP_TTL                 255

/* ------------------------ Statistics options ---------------------------- */
#define STATS

#ifdef STATS
#define LINK_STATS              1
#define IP_STATS                1
#define ICMP_STATS              1
#define UDP_STATS               1
#define TCP_STATS               1
#define MEM_STATS               1
#define MEMP_STATS              1
#define PBUF_STATS              1
#define SYS_STATS               1
#endif /* STATS */

#define LWIP_PROVIDE_ERRNO      1

#endif /* __LWIPOPTS_H__ */

出0入0汤圆

发表于 2010-6-24 17:22:15 | 显示全部楼层
LS的问题解决了么?

出0入0汤圆

发表于 2010-6-29 09:45:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-21 10:38:25 | 显示全部楼层
我在ECOS下用的LWIP也碰到了armecos说的这个问题。同一个SOCKET,连接,发送,接受,关闭;用的是GPRS拨号;如果不出问题可以一直重复几百次没问题,但一旦出现连续两次连接不上,后面就会再也连接不上。

出0入0汤圆

发表于 2010-8-4 17:38:49 | 显示全部楼层
回复【20楼】xzhao86
-----------------------------------------------------------------------

也许是PPP的问题。

出0入0汤圆

发表于 2010-8-4 17:46:01 | 显示全部楼层
回复【14楼】spaceaky
-----------------------------------------------------------------------


你提到“总是死在了waitspi(); ”,该问题似乎和LWIP没关系?

出0入0汤圆

发表于 2010-12-30 16:56:44 | 显示全部楼层
回复【2楼】armecos
-----------------------------------------------------------------------

你说的正宗的BSD协议栈是指的哪个?

出0入0汤圆

发表于 2011-3-12 00:16:41 | 显示全部楼层
讨论的很火嘛

出0入0汤圆

发表于 2012-8-13 17:16:35 | 显示全部楼层
spaceaky 发表于 2009-9-18 11:28
在做lwip的时候还发现了个问题,在局域网内部访问的时候,基本很稳定,
但是通过外网访问到内部局域网,( ...

spaceaky: 问题解决了吗?怎么整个问题都没有结果啊。我也遇到了同样的问题。网络截包发现,在外网访问时,路由器没有转发TCP的RST包,导致lwip一直重发(大概10分钟左右),内存不能释放,如果等到最后lwip释放此PCB,还是能够恢复正常访问的。但如果连续访问会导致内存不够而死机。目前还没找到解决办法。有谁解决过这个问题吗?

出0入0汤圆

发表于 2012-8-13 17:37:25 | 显示全部楼层
我也有同样的问题,LwIP本身有问题,我发现LwIP建立TCP连接后,如果一直向外发数据,大约跑上24小时,程序会断开连接,并且再也连不上。

出0入0汤圆

发表于 2012-8-14 12:04:40 | 显示全部楼层
kingreat 发表于 2012-8-13 17:37
我也有同样的问题,LwIP本身有问题,我发现LwIP建立TCP连接后,如果一直向外发数据,大约跑上24小时,程序 ...

怎么解决的?我目前在研究这个协议栈。

出0入0汤圆

发表于 2012-8-14 13:18:44 | 显示全部楼层
paxtony 发表于 2012-8-14 12:04
怎么解决的?我目前在研究这个协议栈。

还没解决的,其他高手出现呢。

出0入0汤圆

发表于 2012-8-14 13:24:55 | 显示全部楼层
客户快把我逼疯了,已经快3个月了,刚查出问题。外网下路由器没有转发TCP的RST包,导致TCP一直重发,我把重发次数改为最大1次,长时间考机后还是有tcp包的资源没有释放问题。求高手解答

出0入0汤圆

发表于 2013-2-4 11:12:50 | 显示全部楼层
mark                        

出0入0汤圆

发表于 2013-2-4 13:50:11 | 显示全部楼层
kingreat 发表于 2012-8-13 17:37
我也有同样的问题,LwIP本身有问题,我发现LwIP建立TCP连接后,如果一直向外发数据,大约跑上24小时,程序 ...


你的板子提供lwip协议栈?

我用着还没发现大问题。

出0入0汤圆

发表于 2013-2-4 14:14:44 | 显示全部楼层
没有好的调试环境和对操作系统的深入理解,是不能解决这个问题的

出0入0汤圆

发表于 2013-2-5 10:59:31 | 显示全部楼层
目前也没有找到根本的解决途径,采用的临时解决方案是:加软件看门狗,监控tcp收发任务(5s),同时在主任务中或者系统tick中监控网络通讯状况(10min),这样两级监控(可根据实际情况定监控周期),任意一级出现问题,只能软件复位系统了,这不是一个好方法,只能临时解决问题(对于特殊系统不能复位的不适合用)。这个方式实际测试效果还可以。

出0入0汤圆

发表于 2013-12-2 14:40:53 | 显示全部楼层
MARK MARK

出0入0汤圆

发表于 2013-12-5 10:45:54 | 显示全部楼层
MEMP_NUM_SYS_TIMEOUT设置多大好呢?

出100入101汤圆

发表于 2013-12-5 11:39:08 | 显示全部楼层
lwip,想要用好不容易。

出0入0汤圆

发表于 2014-2-12 18:05:03 | 显示全部楼层
mark,用起来确实BUG多多,大数据量连续跑上一天就是出现LWIP_ASSERT()

出0入0汤圆

发表于 2014-2-19 22:09:38 | 显示全部楼层
mark。。。。。。。。。。。。

出100入101汤圆

发表于 2014-4-3 15:13:24 | 显示全部楼层
songzi2018 发表于 2013-2-5 10:59
目前也没有找到根本的解决途径,采用的临时解决方案是:加软件看门狗,监控tcp收发任务(5s),同时在主任 ...

是加了个上下位机的心跳机制?长时间没有收到数据,重启一次?

出100入101汤圆

发表于 2014-4-3 15:16:15 | 显示全部楼层
xuehui869 发表于 2014-2-12 18:05
mark,用起来确实BUG多多,大数据量连续跑上一天就是出现LWIP_ASSERT()

“大数据量连续跑上一天”,是一般的tcp通信?还是http?看到有人说反复刷新一个80k的网页,很容易刷死,看来也是“大数据量问题”。

出0入0汤圆

发表于 2014-9-23 11:08:49 | 显示全部楼层
ffxz 发表于 2009-9-18 17:27
就是,此时要创建一个新的TCP连接,但没有内存块了,所以创建新的TCP连接失败。你可以把lwip的log打开看看 ...

hi!怎么察看lwip的log文件啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 23:16

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

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