日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

毕业设计之路(6)——uip

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 毕业设计之路(6)——uip 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很久沒有來博客了。

心情也不好,但是畢業設計還是要繼續的。

跟老師商量改了畢業設計的要求,MCU換了,TCP/IP協議棧也換了,換成STM32與UIP了。換的原因很蛋疼,之前的那個跟我用的WIN7兼容性很差,很多軟件出問題,所以放棄了。

先從uip看起,版本1.0,貌似很久沒有更新,這是最新的版本了吧??纯磚ip英文資料開始學習,還是為了防止忘記,順便為畢業論文準備,所以記下一些學習內容。

——————————————————————————————————————————————————分割線,上面是廢話

下面內容都是參考英文文檔

uip是一個開源的微型協議棧,主要用于8位,16位MCU,占用內存少,并且代碼少,容易移植。

它既可以用于多任務的操作系統中,如ucos。也能單獨存在,傳說中的裸奔。

uip的主循環

uip主循環中重復做著兩件事情。

  • 查看是否收到數據包
  • 查看周期性超時是否發生
如果有數據包到達,則會在主循環中調用輸入處理函數,uip_input(),這個函數不會發生阻塞,而是立刻返回。它返回時,相應接收這個數據包的應用程序或協議棧會產生一個或多個將要被發送的回應數據包。如果是這樣的話,底層的網絡設備驅動會被調用去發送這些數據包。 周期性超時是用于驅動依靠定時器的TCP機制,比如延時確認,重發,估算往返時間。如果主循環中周期性定時發生,uip就會調用定時處理函數uip_periodic(). uip與具體平臺有關的函數 uip有幾個函數是跟具體平臺有關實現有關的。一個是校驗和計算,一個是32位I附加值運算。 校驗和計算 在接收和發送數據包過程,校驗和計算都是很重要的,且每次發送和接收時都要計算校驗和,所以校驗和函數必須很有效率。這在很多情況下就意味著校驗和計算必須針對于運行uip的不同平臺而做出一些手動調整。 雖然uip包含了通用的校驗和計算,但是也留了兩個函數來針對特定的平臺,這兩個函數是uip_ipchksum()和uip_tcpchksum(),在這兩個校驗和函數中,可以使用匯編語言高度優化來超過C語言的效率。 32位附加值運算 TCP中的32位運算也并不是在所有平臺上都有效,所以有一個針對特定平臺的關于32位附加值實現的函數uip_add32(). uip的內存管理 uip不使用動態分配內存。而是用一個單獨的全局緩沖區儲存數據包,還有一個固定的數組來儲存連接狀態。這個全局緩沖區足夠大可以儲存一個包的最大大小。當有個數據包被接收到,設備驅動就會把這個包放在這個全局緩沖區里然后調用TCP/IP棧。如果這個包包含數據的話,那么TCP/IP協議棧就會通知相應的應用程序。因為這個在這個緩沖區的數據會被接下來到達的數據覆蓋,所以應用程序不得不立即處理這些數據或者把這些數據放到第二緩沖區以便接下來處理。在應用程序處理這些數據之前這個全局緩沖區不會被新來的數據包覆蓋。在處理當前數據包時新來的數據包必須排隊。許多單片以太網控制器都有足夠大的片內緩沖區來包含至少4個最大大小的以太網幀。如果緩沖區滿了,接下來的數據就會被丟棄。這會導致性能降低,但只是發生在多重連接的情況下。這是因為uip建議一個非常小的接收窗口,這意味著每次連接時僅僅只有一個TCP段在網絡中。 在uip中,用于接收數據包的全局緩沖區也用于TCP/IP頭部的傳出數據。如果應用程序發送動態數據,它會使用全局緩沖區的部分來作為臨時緩沖區。為了傳送這些數據,應用程序會傳遞一個指針和數據的長度到棧中。TCP/IP的頭部被寫入全局緩沖區,并且一旦產生頭部數據,設備驅動就會發送頭部信息和應用程序數據到網絡中。這個數據不是排隊需要重發的數據。而是應用程序重新產生數據如果需要重發的話。 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。