開源TCP/IP協議棧 lwIP
Lwip是一個非常優秀的開源TCP/IP協議棧。
lwip提供三種API:1)RAW API 2)lwip API 3)BSD API。
RAW API把協議棧和應用程序放到一個進程里邊,該接口基于函數回調技術,使用該接口的應用程序可以不用進行連續操作。不過,這會使應用程序編寫難度加大且代 碼不易被理解。為了接收數據,應用程序會向協議棧注冊一個回調函數。該回調函數與特定的連接相關聯,當該關聯的連接到達一個信息包,該回調函數就會被協議 棧調用。這即有優點也有缺點。優點是既然應用程序和TCP/IP協議棧駐留在同一個進程中,那么發送和接收數據就不再產生進程切換。主要缺點是應用程序不 能使自己陷入長期的連續運算中,這樣會導致通訊性能下降,原因是TCP/IP處理與連續運算是不能并行發生的。這個缺點可以通過把應用程序分為兩部分來克 服,一部分處理通訊,一部分處理運算。RAW API把接收與處理放在一個線程里面。這樣只要處理流程稍微被延遲,接收就會被阻塞,直接造成頻繁丟包、響應不及時等嚴重問題。因此,接收與協議處理必須 分開。LwIP的作者顯然已經考慮到了這一點,他為我們提供了tcpip_input()函數來處理這個問題,雖然他并沒有在rawapi一文中說明。講 到這里,讀者應該知道tcpip_input()函數投遞的消息從哪里來的答案了吧,沒錯,它們來自于由底層網絡驅動組成的接
收線程。我們在編寫網絡驅動時,其接收部分以任務的形式創建。數據包到達后,去掉以太網包頭得到IP包,然后直接調用tcpip_input()函數將其 投遞到mbox郵箱。投遞結束,接收任務繼續下一個數據包的接收,而被投遞得IP包將由TCPIP線程繼續處理。這樣,即使某個IP包的處理時間過長也不 會造成頻繁丟包現象的發生。這就是lwip API。
BSD API提供了基于open-read-write-close模型的UNIX標準API,它的最大特點是使應用程序移植到其它系統時比較容易,但用在嵌入式系統中效率比較低,占用資源多。這對于我們的嵌入式應用有時是不能容忍的。
項目主頁:http://www.baiduhome.net/lib/view/home/1325830818015
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!