毕业设计之路(6)——uip
生活随笔
收集整理的這篇文章主要介紹了
毕业设计之路(6)——uip
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很久沒有來博客了。
心情也不好,但是畢業設計還是要繼續的。
跟老師商量改了畢業設計的要求,MCU換了,TCP/IP協議棧也換了,換成STM32與UIP了。換的原因很蛋疼,之前的那個跟我用的WIN7兼容性很差,很多軟件出問題,所以放棄了。
先從uip看起,版本1.0,貌似很久沒有更新,這是最新的版本了吧。看看uip英文資料開始學習,還是為了防止忘記,順便為畢業論文準備,所以記下一些學習內容。
——————————————————————————————————————————————————分割線,上面是廢話
下面內容都是參考英文文檔
uip是一個開源的微型協議棧,主要用于8位,16位MCU,占用內存少,并且代碼少,容易移植。
它既可以用于多任務的操作系統中,如ucos。也能單獨存在,傳說中的裸奔。
uip的主循環
uip主循環中重復做著兩件事情。
- 查看是否收到數據包
- 查看周期性超時是否發生
uip的API接口 因為與uip協議棧的原因,它不使用傳統的BSD套接字API,它有兩種API用于應用編程,一種類似BSD套接字API,還有一種是基于事件的API,這種需要內存比前者更少。 基于事件的API的意思是有一個應用程序運行在uip之上,當處理發生的特定事件時,由uip調用處理相關事件。這些事件包括接收到或發送包,建立連接時,當數據需要重發時等等。 另外uip不同于其他TCP/IP協議棧的地方是需要手動處理重發數據,也就是要自己在應用程序里編寫代碼處理要重發的數據,其他協議棧都是自動處理。這樣做的理由也是為了節約內存。 應用程序事件 處理應用程序事件的函數是UIP_APPCALL(),當發生任何事件時都會調用此函數。每個事件都有特定的測試函數來區分是哪種事件,這個函數是一個宏實現,需要注意的是,事件可以同時發生。 連接指示器 當uip調用一個應用程序,全局變量uip_conn被設置成一個指向uip_conn結構體的指針,這個變量被稱作當前連接。唉這個結構體中有些變量是有用的,比如用來區分要連接的是何種服務或者是連接對方的IP地址。一個典型的應用就是通過結構體中的變量uip_conn->lport看連接端口來確定是何種服務,比如如果是80端口,就是HTTP服務器應用程序。 數據接收 如果測試函數uip_newdata()非零,那么說明接收到新數據。接收到數據的長度可以通過uip_datalen()函數獲得。數據不會被uip緩沖,但是當函數返回時數據會被覆蓋。所以應用程序必須及時處理該數據或者將數據放入另一個緩沖區中。 發送數據 發送數據時,uip通過接收者的TCP窗口大小和有效的緩沖區空間來調整發送數據的長度。緩沖空間的大小由內存配置決定,因此有可能不是所有發送的數據都會到達接收者一方。所以可以調用uip_mss()看實際到底有多少數據發送出去了。 發送數據的函數是uip_send(),這個函數需要兩個參數,一個是指向發送數據的指針和發送數據的長度。如果應用程序需要RAM空間來發送數據的話,那么包緩沖區(就是由uip_appdata指向的緩沖區)可以用于此目的。 在一個連接的同一時間只能有一塊數據被發送,在一次應用程序里調用多次uip_send()是不可能的,它只會把最后調用的數據包發出去。 數據重發 重發是由周期TCP定時器驅動的,每次超時定時器調用時,每個連接的重發定時器就會減少,如果重發定時器減少到0,那么重發就要重發數據。因為uip在發送數據包后不會保存數據,所以需要手動處理重發數據。當uip確定有一段需要重發時,應用程序調用uip_rexmit()設置標志,表明有重發要求。 應用程序會檢查重發標志然后產生重發數據,從應用程序角度來看,重發的數據和原來的數據沒有什么不同,所以這兩段代碼是一樣的。 關閉連接 應用程序通過調用uip_close()來關閉連接。這種關閉是正常的關閉連接。如果為了表示是嚴重錯誤而導致的關閉,那么應用程序應該調用uip_abort()來終止連接。 如果連接被關閉的話,那么uip_closed()會返回真,接著應用程序就可以繼續做必要的清理工作了。 報告錯誤 在一個連接中有兩種嚴重的錯誤會發生,一種是連接被異常終止或者數據多次重發無效而終止。uip會分別通過調用測試函數uip_aborted()和uip_timeout()來報告這些錯誤信息。 輪詢 當連接空閑時,uip就會在每次超時時間到達時進行輪詢。輪詢的函數是uip_poll()。 輪詢的目的有兩個,第一個目的是讓應用程序知道有空閑的連接,并讓空閑太久的連接關閉。第二個目的是讓應用程序發送新產生的數據。發送數據只能由uip來調用。因此輪詢是在空閑連接時發送數據的唯一方式。 監聽端口 監聽端口的函數是uip_listen()。當連接需要和端口綁定時,uip就會創建一個連接并調用此函數。如果應用程序調用此函數的話,uip_connected()就會返回真。 開始連接 打開一個新的連接的函數是uip_connect(),這個函數會返回一個指針指向uip_conn()結構體。如果沒有多余的空閑槽,那么函數返回NULL。 函數uip_ipaddr()用于將IP地址放入兩個16位的數組,用來表示IP地址。
總結
以上是生活随笔為你收集整理的毕业设计之路(6)——uip的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt系列文章之 QAbstractIte
- 下一篇: 基本数字运算