《LWIP協議棧》關於LWIP的pcb->next 指向pcb自身,造成死機問題的解決方法

       本人使用的LWIP版本號是LWIP 1.3.2 ,並且使用UCOSII  V2.89系統。

       在移植使用的過程中,使用LWIP只做客戶端或服務端是沒有問題的。後來客戶端和服務端都集合使用的時候,碰到了一個BUG,for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) , 在這個地方進入死循環了,即pcb 塊申請和釋放的時候出錯了,pcb->net指向自己本身了。後來在網上查了一大堆資料,說是LWIP1.3.2版本就有這個問題,而1.4.1版本沒有。爲了解決這個問題就嘗試去移植LWIP1.4.1這個版本,然後卻發現1.4.1與1.3.2版本的郵箱和信號量函數接口都不同了,在UCOSII,V2.8.9下已經不能滿足了。相當於之前移植的sys_arch.c已經不能適應了。LWIP1.4.1在網上的sys_arch.c例子基本都是基於UCOSIII-V3.0.x 來實現。所有如果更換LWIP1.4.1的話,最好也要去替換UCOSII。而又由於之前的工程中已有使用UCOSII,再去替換工作量又相當大,所有想找到一種方式,直接在LWIP1.3.2版本下解決LWIP的pcb->net指向自己本身的問題。

        後來發現這個問題是由於LWIP裏面的TCP塊在沒有接連的情況下,不用close就會自動釋放。如果LWIP自己釋放過了,而你自己又操作close或abort釋放一次,那麼TCP_PCB內存塊就出現問題了。那麼問題既然找到了,那就想辦法解決。本人想到了一個修改最少最簡便的方法來解決這個問題,僅需修改2個.c、1個.h文件即可解決這個問題。修改情況如下:

 

        只需要在,struct tcp_pcb中添加一個字段,再加上幾行代碼,就可以解決這個問題了。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 5203
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章