以太網(wǎng)通訊模組函數(shù)說明_第1頁
以太網(wǎng)通訊模組函數(shù)說明_第2頁
以太網(wǎng)通訊模組函數(shù)說明_第3頁
以太網(wǎng)通訊模組函數(shù)說明_第4頁
以太網(wǎng)通訊模組函數(shù)說明_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、發(fā)布日:2004-3-5: 86-10-62981668FAX : 86-10-62985972E-mai.ch.c大學(xué)計(jì)劃推廣中心市海淀區(qū)上地信息產(chǎn)業(yè)中黎科技園 1 號(hào)樓 6 層 C 段:100085Technology for Easy Living1.保留對(duì)此文件修改之權(quán)利且不另行通知信息相信為正確且可靠之信息, 但并不保證本文件中絕無錯(cuò)誤。請(qǐng)于向所提供之提出訂單前, 自行確定所使用之相關(guān)技術(shù)文件及規(guī)格為之版本。若因貴公司使用本公司之文件或產(chǎn)品,權(quán)之應(yīng)用及配合時(shí), 則應(yīng)由貴公司負(fù)責(zé)取得同意及, 非屬本公司應(yīng)為保證之責(zé)任。又, 本有限而涉及第三人之專利或著作權(quán)等智能公司僅單純販?zhǔn)郛a(chǎn)品, 上

2、述關(guān)于同意及,本公司之所有產(chǎn)品不得使用于醫(yī)療器材,公司之正式維持生命系統(tǒng)及飛航等相關(guān)設(shè)備。 Sunplus University Program第 2Technology for Easy Living1.目錄3..3unIP 簡(jiǎn)介4unIP Stack 的特性4unIP Stack 的硬件需求5協(xié)議棧的 API 說明5網(wǎng)絡(luò)接口層 API 函數(shù)列表5動(dòng)態(tài)內(nèi)存管理模塊 API 函數(shù)說明8模式化內(nèi)存管理模塊9緩沖區(qū)(pbuf)管理模塊9UDP 層 API 函數(shù)說明13TCP

3、 層 API 函數(shù)說明16網(wǎng)絡(luò)字節(jié)輔助函數(shù) API24unIP 參數(shù)配置說明27協(xié)議棧應(yīng)用舉例29Step by Step 建立自己的 WEB SERVER。29網(wǎng)頁的制作29HTTP 請(qǐng)求的處理以及動(dòng)態(tài)效果的實(shí)現(xiàn)29運(yùn)行 WEB SERVER30Web Server 的實(shí)現(xiàn)30Web Server 的初始化33接受客戶端的請(qǐng)求33頁面請(qǐng)求的處理(接收客戶端的數(shù)據(jù))以及頁面數(shù)據(jù)的傳送34 Sunplus University Program第 3Technology for Easy Living1unIP 簡(jiǎn)介unIP 是運(yùn)行在公司 UnSP 系列單片機(jī)上的一個(gè)精簡(jiǎn) TCP/IP 協(xié)議棧。協(xié)

4、議棧的初始版本由LwIP 移植而來,之所以不沿用 LwIP 的名字是因?yàn)橐浦补ぷ鞑粌H僅只是 LwIP 說明的 arch 目錄下的改動(dòng),core 部分也做了不少的修改以適應(yīng) UnSP 的 16bit 的特性(UnSP 并不具有 8bit 的數(shù)據(jù)類型,地址也是以 16bit 為),因此 unIP 與 LwIP 并不兼容,此外,增加了 DNS Cnt(客戶端)到協(xié)議棧中,以及部分應(yīng)用實(shí)例,例如 WEB SERVER 等等,綜合以上原因,給本協(xié)議棧重新命名為 unIP,特指是運(yùn)行于 UnSP 系列單片機(jī)之上的網(wǎng)絡(luò)協(xié)議棧。1.1 unIP Stack 的特性u(píng)nIP Stack 從資源消耗來說是一個(gè)精簡(jiǎn)

5、的協(xié)議棧,而協(xié)議棧的實(shí)現(xiàn)卻是是非常的完整,表 1 所示就是本協(xié)議棧所具有的所有特性:表1unIP Stack 特性表 Sunplus University Program第 4特性u(píng)nIP Stack多網(wǎng)絡(luò)接口(ethernet,slip)支持ARP支持IP (不支持 IP 分片與重組)支持ICMP(包括 ECHO,和 destination unreach)支持UDP(包括 UDP Checksum 的計(jì)算)支持,可選TCP 選項(xiàng)(只支持最大報(bào)文段長(zhǎng)度 MSS)支持TCP 滑動(dòng)窗口支持TCP 慢啟動(dòng)、擁塞避免支持TCP 快速重傳、快速恢復(fù)支持TCP 錯(cuò)序數(shù)據(jù)重組支持,可選TCP 緊急數(shù)據(jù)(u

6、rgent data)支持往返時(shí)間估計(jì)(RTT)支持DHCP 客戶端(可自動(dòng)獲取網(wǎng)絡(luò)設(shè)置)支持,可選DNS 客戶端(可普通以及郵件地址 mx)支持,可選模式化以及非模式化緩沖區(qū)存管理支持動(dòng)態(tài)內(nèi)存管理支持,可選原始 API(網(wǎng)絡(luò)編程)支持Technology for Easy Living的 SPCE061為了方便用戶的使用,本手冊(cè)也一并詳細(xì)介紹利用本協(xié)議棧在上實(shí)現(xiàn)的一個(gè)WEB SERVER 的全過程,并配套有硬件開發(fā)板,可供用戶實(shí)驗(yàn)之用。此開發(fā)實(shí)例以及源程序可以用來進(jìn)行二次開發(fā),用戶可以很方便的開發(fā)自己的網(wǎng)頁。1.2 unIP Stack 的硬件需求unIP Stack 運(yùn)行需要如下的硬件配置

7、:UnSP 系列 16 位單片機(jī)(目前支持需要以太網(wǎng)控制器(目前支持機(jī)聯(lián)網(wǎng)(串口會(huì)被占用)。的 SPCE061,SPL16256)公司的 Dm9000),或者利用串口直接通過 Slip 與 PC協(xié)議棧本身需求 ROM 空間為 21K Word,RAM 消耗可配置參見第 3 節(jié),RAM 的消耗依據(jù)配置的不同可以為 400Word 至 600Word 左右。2協(xié)議棧的 API 說明目前協(xié)議棧是以庫的形式提供給用戶,對(duì)協(xié)議棧的使用也就是對(duì)協(xié)議棧所提供的各種 API 的調(diào)用,掌握了這些 API 便是掌握了協(xié)議棧,也就能自己開發(fā)新的應(yīng)用層協(xié)議了。下面是本協(xié)議棧所有的 API函數(shù)的說明表,API 總共分

8、7 部分,包括網(wǎng)絡(luò)接口層、動(dòng)態(tài)內(nèi)存管理模塊、緩沖區(qū)管理模塊(pbuf)、UDP 層、TCP 層、DHCP 模塊和 DNS 模塊。2.1 網(wǎng)絡(luò)接口層 API 函數(shù)列表網(wǎng)絡(luò)接口層的功能是建立、配置修改網(wǎng)絡(luò)接口,本層的 API 均以 netif 作為前綴,后綴說明其功能。本層的所有 API 函數(shù)為:netif_init()、netif_add()、netif_set_addr()、netif_remove()、netif_find()、netif_set_default()、netif_set_ipaddr()、netif_set_netmask()和 netif_set_gw ()。它們的詳細(xì)說明

9、見下表.netif_init ()netif_add () Sunplus University Program第 5函數(shù)原型struct netif *netif_add(struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw,void *se,err_t (* init)(struct netif *netif),err_t (* input)(struct pbuf *p, struct netif *netif)參數(shù)ipaddrip 地址指針指定新接口 ip 地址netmaskip 地址指針指定新接口子網(wǎng)掩

10、碼函數(shù)原型voidnetif_init (voidp)參數(shù)無返回值無功能說明網(wǎng)絡(luò)接口部分初始化。Technology for Easy Livingnetif_set_addr ()netif_remove () Sunplus University Program第 6函數(shù)原型void netif_remove(struct netif * netif)參數(shù)netif網(wǎng)絡(luò)接口指針返回值無功能說明刪除指定網(wǎng)絡(luò)接口,并回收該接口所占用所有資源。函數(shù)原型voidnetif_set_addr(struct netif *netif, struct ip_addr *ipaddr,struct ip_

11、addr *netmask,struct ip_addr *gw);參數(shù)netif 網(wǎng)絡(luò)接口指針 ipaddr新的 ip 地址指針 netmask新的子網(wǎng)掩碼指針gw新的網(wǎng)關(guān)指針返回值無功能說明設(shè)定網(wǎng)絡(luò)接口的 ip 地址,子網(wǎng)掩碼和網(wǎng)關(guān)為給定值。gwip 地址指針 指定新接口網(wǎng)關(guān)e無類型指針 用于傳遞參數(shù)至接口處理函數(shù)init回調(diào)函數(shù)指針 用于初始化本網(wǎng)絡(luò)接口包括網(wǎng)絡(luò)接口的名稱例如 eth0,lo0 等等。還要指定新接口最大傳輸單元,MTU, 新接口的數(shù)據(jù)發(fā)送回調(diào)函數(shù)。input回調(diào)函數(shù)指針 當(dāng)網(wǎng)絡(luò)接口層收到一個(gè)完整的鏈路層數(shù)據(jù)之后,會(huì)將鏈路信息去掉,然后把 packet 交由此回調(diào)函數(shù)處理。

12、在 tcp/ip 協(xié)議中,此函數(shù)應(yīng)該為ip 層的 input 函數(shù)指針。返回值成功,則返回網(wǎng)絡(luò)接口類型指針,失敗則返回 NULL。失敗原因: 內(nèi)存不夠。鏈路初始化出錯(cuò)。功能說明init 與 input 函數(shù)指針均是此網(wǎng)絡(luò)接口的硬件驅(qū)動(dòng)層的函數(shù)(由用戶根據(jù)實(shí)際使用的硬件而編寫),init 函數(shù)在此函數(shù)調(diào)用中會(huì)立即被調(diào)用,以初始化鏈路層硬件。input函數(shù)會(huì)在鏈路層有數(shù)據(jù)到達(dá)的時(shí)候被調(diào)用。此函數(shù)創(chuàng)建一個(gè)可用的網(wǎng)絡(luò)接口。并返回一個(gè) netif 指針。如果內(nèi)存不夠的話會(huì)返回一個(gè) NULL,用戶也應(yīng)該在 init 函數(shù)中加以判斷,以 有錯(cuò)誤發(fā)生的時(shí)候返回一個(gè) NULL 指針以通知應(yīng)用層鏈路不可用。Tec

13、hnology for Easy Livingnetif_find ()netif_set_default ()netif_set_ipaddr ()netif_set_netmask ()netif_set_gw () Sunplus University Program第 7函數(shù)原型void netif_set_gw(struct netif *netif, struct ip_addr *gw);參數(shù)netif網(wǎng)絡(luò)接口指針gw新的網(wǎng)關(guān)的 ip 地址指針返回值無功能說明設(shè)定指定接口的網(wǎng)關(guān)。函數(shù)原型void netif_set_netmask(struct netif *netif, str

14、uct ip_addr *netmast);參數(shù)netif網(wǎng)絡(luò)接口指針netmask新的子網(wǎng)掩碼指針返回值無功能說明設(shè)定指定接口的子網(wǎng)掩碼。 函數(shù)原型void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr);參數(shù)netif網(wǎng)絡(luò)接口指針ipaddr新的 ip 地址指針返回值無功能說明設(shè)定指定接口的 ip 地址,可以用本函數(shù)實(shí)現(xiàn)運(yùn)行期改變某接口的 ip 地址。函數(shù)原型void netif_set_default(struct netif *netif)參數(shù)netif網(wǎng)絡(luò)接口指針返回值無功能說明指定系統(tǒng)默認(rèn)網(wǎng)絡(luò)接口,當(dāng)沒有匹

15、配的接口時(shí),packet 均通過此接口發(fā)送至ernet。對(duì)于單網(wǎng)絡(luò)接口也應(yīng)該執(zhí)行此函數(shù),設(shè)定默認(rèn)接口。函數(shù)原型struct netif *netif_find(char *name)參數(shù)name字符串網(wǎng)絡(luò)接口的名字(例如 eth0,sl0 等)返回值網(wǎng)絡(luò)接口指針功能說明尋找指定名字的網(wǎng)絡(luò)接口,并返回其地址。若沒找到,則返回 0。網(wǎng)絡(luò)接口的名字是在函數(shù) netif_add 中設(shè)定的 init 函數(shù)中賦值的。Technology for Easy Living2.2 動(dòng)態(tài)內(nèi)存管理模塊 API 函數(shù)說明本模塊的功能是能夠動(dòng)態(tài)的分配和一段內(nèi)存區(qū)域,內(nèi)存分配算法有兩種可以選擇,一種是源自LwIP 自帶的

16、內(nèi)存管理模塊;另一種是的 Buddy System 算法。前者相對(duì)簡(jiǎn)單,但是隨著管理的內(nèi)存區(qū)域變大,性能會(huì)顯著下降,后者較為復(fù)雜,但是當(dāng)管理大片內(nèi)存的時(shí)候,效率并不會(huì)下降很多,但是在管理小片內(nèi)存時(shí),可能會(huì)存在比較大的浪費(fèi)。根據(jù)需要可以選擇兩種內(nèi)存管理算法中的一種。根據(jù) 061 的考慮,本協(xié)議棧目前選擇的是第一種分配算法。無論選擇何種算法,應(yīng)用程序的 API都是一致的,本層的 API:mem_init ()、mem_malloc()、mem_free()、mem_realloc()和 mem_reallocm()。詳細(xì)說明如下:mem_init ()mem_malloc ()mem_free (

17、)mem_realloc () Sunplus University Program第 8函數(shù)原型void *mem_realloc(void *mem, mem_size_t size)參數(shù)mem 為無類型指針,值為需要調(diào)整大小的內(nèi)存塊的首地址。函數(shù)原型void mem_free(void *mem) 參數(shù)mem 為無類型指針,值為需要內(nèi)存塊的首地址。返回值無功能說明指定內(nèi)存區(qū)域,將標(biāo)志位置為未使用,若前后有相鄰的未使用內(nèi)存區(qū)域,則執(zhí)行內(nèi)存空洞合并操作。函數(shù)原型void *mem_malloc(mem_size_t size)參數(shù)size 類型為無符號(hào) 16 位整形數(shù),值為需要申請(qǐng)的內(nèi)存塊的

18、以字為的大小返回值返回一個(gè)無類型指針。若分配成功則指向分配內(nèi)存塊的起始地址,分配失敗則為一個(gè)NULL 指針。功能說明在動(dòng)態(tài)內(nèi)存區(qū)域中尋找長(zhǎng)度大于或等于 size 的內(nèi)存塊,若存在則將該內(nèi)存塊的前 size個(gè)單元?jiǎng)澐殖鰜?,交由調(diào)用函數(shù)使用。函數(shù)原型voidmem_init (void)參數(shù)無返回值無功能說明初始化動(dòng)態(tài)內(nèi)存區(qū)域,是以 ram 為起始地址,長(zhǎng)度為 MEMSIZE words 的區(qū)域。由于協(xié)議棧的其它模塊大多使用了內(nèi)存管理模塊,所以此函數(shù)應(yīng)該在所有模塊初始化之前初始化。Technology for Easy Livingmem_reallocm ()2.3 模式化內(nèi)存管理模塊由于協(xié)議棧

19、的特殊性,有些數(shù)據(jù)結(jié)構(gòu)具有固定的大小,而且會(huì)在協(xié)議棧的運(yùn)行過程中頻繁使用,對(duì)于這一部分?jǐn)?shù)據(jù)結(jié)構(gòu),協(xié)議棧采用了固定的內(nèi)存分配模式。采用這種分配模式的一共有一下幾種數(shù)據(jù)結(jié)構(gòu):ROM 模式的 pbuf,UDP 協(xié)議控制塊,TCP 協(xié)議控制塊,狀態(tài)的 TCP 協(xié)議控制塊(用來實(shí)現(xiàn)服務(wù)器程序),TCP 收發(fā) Packet 的隊(duì)列。用戶根據(jù)實(shí)際應(yīng)用需要,可以配置這些固定結(jié)構(gòu)數(shù)組的大小。具體的配置方法將會(huì)在本手冊(cè)后續(xù)的 Lib 配置中敘述。本模塊的 API 均為API,在協(xié)議棧實(shí)現(xiàn)之用,用戶不需要了解,在此就不細(xì)述了。2.4 緩沖區(qū)(pbuf)管理模塊unIP 中,所有的 Packet 均用同一種結(jié)構(gòu)來封裝

20、,那就是 pbuf。pbuf 是一個(gè)鏈表,用來一個(gè) packetbuf 結(jié)的各個(gè)組成部分,類似于 Linux 下的 sk_buff 一樣的結(jié)構(gòu),只是 pbuf 的設(shè)計(jì)更加節(jié)省 R構(gòu)的如下:struct pbuf struct pbuf *next; void *payload; u16_t tot_len; u16_t len;u16_t flags; u16_t ref;/有效數(shù)據(jù)的指針/整個(gè) pbuf 鏈表的有效數(shù)據(jù)長(zhǎng)度總和,以 byte 為/本 pbuf 中的有效數(shù)據(jù)的長(zhǎng)度,以 byte 為/本 pbuf 的類型/本 pbuf 的次數(shù)具體的 unIP 下的 pbuf 一共有以下三種(根據(jù)

21、 flags 來區(qū)分): Sunplus University Program第 9函數(shù)原型void *mem_reallocm(void *mem, mem_size_t size)參數(shù)mem 為無類型指針,值為需要內(nèi)存塊的首地址。size 為 16 位整型數(shù),值為需要調(diào)整到的大?。ㄒ宰譃椋┓祷刂禑o類型指針,值為調(diào)整完畢以后的內(nèi)存區(qū)域的首地址功能說明本函數(shù)優(yōu)先另外申請(qǐng)一段區(qū)域大小為size *Word,然后拷貝源區(qū)域數(shù)據(jù)前 size 個(gè) Word的數(shù)據(jù),最后源區(qū)域。若在第一步分配時(shí)失敗則調(diào)用 mem_realloc()函數(shù)來處理,并返回 mem_realloc()的返回值給調(diào)用者。size

22、為 16 位整型數(shù),值為需要調(diào)整到的大小(以字為)返回值無類型指針,值為調(diào)整完畢以后的內(nèi)存區(qū)域的首地址功能說明將 mem 的長(zhǎng)度縮小為 size 指定的大小,mem 的首地址維持不變,也不進(jìn)行拷貝操作。此函數(shù)只能將指定內(nèi)存區(qū)域縮小,而無法增大。Technology for Easy LivingPBUF_ROM:對(duì)應(yīng) flag 為 PBUF_FLAG_ROM,此類 pbuf 在分配的時(shí)候不會(huì)分配任何RAM 區(qū)域給payload 指針,而 payload 一般應(yīng)該由用戶設(shè)定指向一片 ROM 區(qū)域中。這種數(shù)據(jù)結(jié)構(gòu)多半用來保存不變的數(shù)據(jù),例如不需要拷貝到協(xié)議棧的 TCP 數(shù)據(jù)。PBUF_REF也屬于

23、此類 pbuf,對(duì)應(yīng)的 flag 為 PBUF_FLAG_REF,同的是它指向的數(shù)據(jù)區(qū)域未必是 ROM區(qū)域,也可能是 RAM 中,一般用來不同的 pbuf 中的數(shù)據(jù)。由于并不會(huì)分外的內(nèi)存給 payload,因此此類 PBUF 有一個(gè)特點(diǎn)就是 pbuf 的大小固定,因此這類 pbuf 可以以模式化內(nèi)存來分配。用戶可以自行配置系統(tǒng)中所需要的此類 pbuf 的數(shù)量。一般來說如果有大量的數(shù)據(jù)位于 ROM 中需要傳送的話,這類 pbuf 的數(shù)量就應(yīng)該設(shè)置得適當(dāng)多一些。PBUF_RAM:對(duì)應(yīng)于 flag 為 PBUF_FLAG_RAM,此類 pbuf 在分配的時(shí)候會(huì)一并分配指定大小的 RAM 區(qū)域給 pa

24、yload 指針。因此 payload 一定是指向 RAM 區(qū)域。這類 pbuf 用來存放動(dòng)態(tài)生成的 packet,例如頁數(shù)據(jù),等等。由于大小都是由調(diào)用者指定,因此這類pbuf 不能以模式化來處理,只能完全靠動(dòng)態(tài)內(nèi)存分配來得到。PBUF_POOL:對(duì)應(yīng)于 flag 為 PBUF_FLAG_ POOL,此類 pbuf 的數(shù)據(jù)指針也是指向一片RAM區(qū)域,不過所指向區(qū)域的大小是預(yù)先固定的。此類 pbuf 很顯然也可以用模式化內(nèi)存來分配, pool 的大小以及 pool 的數(shù)量都可以由用戶在編譯期配置好。此類 pbuf 的用途一般是用于存放鏈路層接收到的 packet,由于鏈路層的 packet 的長(zhǎng)

25、度會(huì)有一個(gè)不太大的上限值,例如以太網(wǎng)鏈路層的 Packet 就不會(huì)大于 1500Byte(除去以太包頭和校驗(yàn)和),因此此 pool 的長(zhǎng)度不用超過 750 個(gè) word。當(dāng)然如果主要是用 TCP 層來做應(yīng)用,那么 TCP 層的 MSS 設(shè)定好以后,此處的 pool size 救只用設(shè)置為(MSS40)/2 個(gè) word 就可以了。在清楚了以上三類 pbuf 以后就可以來看看本層提供的 API 函數(shù)了,要編寫好應(yīng)用層的協(xié)議,這些 API是需要好好運(yùn)用的。本層 API 一共有以下這些:pbuf_init()、pbuf_alloc ()、pbuf_realloc()、pbuf_header()、pb

26、uf_ref()、pbuf_free()、pbuf_clen ()、pbuf_chain()和 pbuf_cat()。下面是所有函數(shù)的詳細(xì)說明表。pbuf_init ()pbuf_alloc () Sunplus University Program第 10函數(shù)原型struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pbuf_flag flag)參數(shù)l枚舉類型 pbuf_layer,包括以下數(shù)值 PBUF_TRANSPORT,傳輸層的 packet PBUF_IP, IP 層的 packetPBUF_LINK,鏈路層的 packetPBUF_RA

27、W原始 packetsize申請(qǐng)的 pbuf 管理的數(shù)據(jù)區(qū)域的長(zhǎng)度(以字節(jié)為?。ゝlag枚舉類型 pbuf_flag,包括以下數(shù)值 PBUF_RAM,數(shù)據(jù)區(qū)域在 RAM 中函數(shù)原型void pbuf_init(void)參數(shù)無返回值無功能說明初始化 pbuf 區(qū)域必須在所有其它 pbuf 類函數(shù)運(yùn)行前被調(diào)用Technology for Easy Livingpbuf_realloc ()pbuf_header () Sunplus University Program第 11函數(shù)原型u8_t pbuf_header(struct pbuf *p, s16_t header_size)參數(shù)p目標(biāo)

28、 pbuf 指針header_size有符號(hào)數(shù),header 頭的大小。(以字節(jié)為)。返回值成功返回 0,失敗返回 1功能說明調(diào)整 pbuf 的 payload 指針,使 payload 指向原來 payloadheader_size 的位置。當(dāng) header_size 為正數(shù)的時(shí)候,是將 payload 增加,從 packet 中去除一部分?jǐn)?shù)據(jù),例如tcp 頭等等,在拆包的時(shí)候運(yùn)用。當(dāng) header_size 為負(fù)數(shù)的時(shí)候,實(shí)際上是將 payload 減少,以向 packet 增加一些內(nèi)容,例如 ip 頭等,在封包的時(shí)候運(yùn)用。函數(shù)原型void pbuf_realloc(struct pbuf

29、 *p, u16_t size)參數(shù)p準(zhǔn)備調(diào)整的 pbuf 類型指針sizep 準(zhǔn)備調(diào)整到的新長(zhǎng)度(指數(shù)據(jù)長(zhǎng)度)返回值無功能說明主要是用來去除在分配了不必要的 pbuf 鏈的沒有用到的單元例如,事先分配了一個(gè) pbuf 鏈P1 - P2 - P3后來調(diào)整了數(shù)據(jù)的長(zhǎng)度,使得 P3 中的數(shù)據(jù)沒有用到,那么通過調(diào)整 P1 的 total_len域,然后調(diào)用本函數(shù),就可以回收 P3 了。PBUF_ROM,數(shù)據(jù)區(qū)域在 ROM 中(不修改)PBUF_REF,用來其它packet 的 pbufPBUF_POOL在 pbuf_pool 中,為靜態(tài)內(nèi)存區(qū)域返回值pbuf 類型指針,或空指針功能說明四種枚舉類型的

30、唯一區(qū)別在于在 payload 指針前預(yù)留了不同大小的空閑空間:傳輸層 202014網(wǎng)絡(luò)層 2014鏈路層 14原始型 0用戶使用的是 payload 之后的區(qū)域,大小依然是 size。這里的 均為字節(jié)。在應(yīng)用層編程的時(shí)候,基本用不著網(wǎng)絡(luò)層與鏈路層的 pbuf,一般純用戶數(shù)據(jù)就用原始型,而需要利用 UDP 的時(shí)候,就需要選擇傳輸層的 pbuf,用戶使用的是 payload 后的數(shù)據(jù),而 payload 前的數(shù)據(jù)就預(yù)留給封裝 packet 之用。Technology for Easy Livingpbuf_ref ()pbuf_ref_chain ()pbuf_free ()pbuf_cat (

31、)pbuf_chain () Sunplus University Program第 12函數(shù)原型void pbuf_cat(struct pbuf *h, struct pbuf *t)參數(shù)hpbuf 指針tpbuf 指針返回值無功能說明將兩個(gè) pbuf 鏈表連接起來,成為一個(gè)新的 pbuf。新的 pbuf 所包含的數(shù)據(jù)是兩者的順序聯(lián)合。多用于同層的數(shù)據(jù)的聯(lián)合。按照 pbuf_free 的算法,t 與 h 會(huì)一同被掉。函數(shù)原型u8_t pbuf_free (struct pbuf *p)參數(shù)p目標(biāo) pbuf 指針返回值8 位整型數(shù)功能說明將 p 指向的 pbuf 鏈表中的所有單元的 ref

32、域減一,若減至零,則該單元。返回值為改鏈表的單元總數(shù)。函數(shù)原型void pbuf_ref_chain (struct pbuf *p)參數(shù)p目標(biāo) pbuf 鏈的首指針返回值無功能說明將 p 指向的 pbuf 鏈中所有的 pbuf 的域 ref 加 1意味著該鏈表下所有單元被次數(shù)加一函數(shù)原型void pbuf_ref(struct pbuf *p)參數(shù)p目標(biāo) pbuf 指針返回值無功能說明將目標(biāo) pbuf 域的 ref 域加 1意味著被次數(shù)加一,只有關(guān)當(dāng) ref 域?yàn)?0 的時(shí)候,該 pbuf 才可能被。當(dāng)給出的 header_size 的時(shí)候(例如超出范圍或者為奇數(shù)等),會(huì)返回 0 并保持原來

33、的 payload 指針不變。Technology for Easy Livingpbuf_clen ()2.5 UDP 層 API 函數(shù)說明unIP 提供了 UDP 層的 API 函數(shù),用戶可以用其來編寫客戶端和服務(wù)器端的應(yīng)用程序,例如 TFTP 以及 DNS Cnt 和 DHCP Cudp_init ()nt。下面是本層 API 的詳細(xì)說明:udp_new ()udp_remove () Sunplus University Program第 13函數(shù)原型void udp_remove(struct udp_pcb *pcb)函數(shù)原型struct udp_pcb * udp_new(voi

34、d)參數(shù)無返回值UDP 協(xié)議控制塊指針,若無空閑協(xié)議控制塊,則返回 NULL。UDP 協(xié)議控制塊的個(gè)數(shù),可由 UDP_NUM 設(shè)定。功能說明本函數(shù)初始化 udp 層相關(guān)的數(shù)據(jù)結(jié)構(gòu),必須在所有 udp 層應(yīng)用之前被調(diào)用。函數(shù)原型udp_init ()參數(shù)無返回值無功能說明本函數(shù)初始化 udp 層相關(guān)的數(shù)據(jù)結(jié)構(gòu),必須在所有 udp 層應(yīng)用之前被調(diào)用。函數(shù)原型u8_tpbuf_clen (struct pbuf *p)參數(shù)p目標(biāo) pbuf 鏈的首指針返回值無功能說明返回值為該鏈表的單元總數(shù)。函數(shù)原型void pbuf_chain(struct pbuf *h, struct pbuf *t)參數(shù)hp

35、buf 指針tpbuf 指針返回值無功能說明將兩個(gè) pbuf 鏈表連接起來,成為一個(gè)新的 pbuf。新的 pbuf 所包含的數(shù)據(jù)是兩者的順序聯(lián)合。此外 t 的 ref 域會(huì)被加一。多用于不同層的數(shù)據(jù)的聯(lián)合。h 為低層的 pbuf,而 t 為 的 pbuf。因?yàn)?t 的 ref 值會(huì)加一,按照 pbuf_free 的算法,它不會(huì)與 h 一同被 掉,這正好適合分層處理的原則。Technology for Easy Livingudp_bind ()udp_connect ()udp_send () Sunplus University Program第 14函數(shù)原型err_tudp_send(st

36、ruct udp_pcb *pcb, struct pbuf *p);參數(shù)pcbUDP 協(xié)議控制塊指針,需要連接的協(xié)議控制塊p存放需要發(fā)送的應(yīng)用層數(shù)據(jù)的 pbuf 指針,此 pbuf 應(yīng)該為傳輸層 pbuf。返回值目前一定返回 ERR_OK函數(shù)原型err_t udp_connect (struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port);參數(shù)pcbUDP 協(xié)議控制塊指針,需要連接的協(xié)議控制塊ipaddrremote host 的 ip 地址portremote host 的端返回值目前一定返回 ERR_OK功能說明本函數(shù)并不發(fā)起實(shí)際的

37、網(wǎng)絡(luò)通信,只是將 pcb 的 remote ip 和 remote port 設(shè)定為參數(shù)中的值。函數(shù)原型err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)參數(shù)pcbUDP 協(xié)議控制塊指針需要綁定的協(xié)議控制塊ipaddr綁定到本地的 ip 地址,與某個(gè)網(wǎng)絡(luò)接口匹配,若為 IP_ADDR_ANY,則是綁定到本地的所有網(wǎng)絡(luò)接口port綁定到本地的端口,若為 0 則表示可隨機(jī)選取一個(gè)端口返回值成功則返回 ERR_OK出錯(cuò)可能返回 ERR_USE,表示無可用端口。功能說明將 udp 塊綁定到本地 ip 地址以及

38、port 端。參數(shù)UDP 協(xié)議控制塊指針返回值無功能說明刪除并該 udp 控制塊Technology for Easy Livingudp_recv ()recv () Sunplus University Program第 15函數(shù)原型void (* recv)(void *arg, struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr, u16_t port)函數(shù)原型voidudp_recv(struct udp_pcb *pcb,void (* recv)(void *arg, struct udp_pcb *upcb, str

39、uct pbuf *p,struct ip_addr *addr, u16_t port),void *recv_arg);參數(shù)pcbUDP 協(xié)議控制塊指針需要綁定的協(xié)議控制塊recv回調(diào)函數(shù)指針。recv_arg回調(diào)參數(shù)返回值成功則返回 ERR_OK出錯(cuò)可能返回 ERR_USE,表示無可用端口。功能說明設(shè)定回調(diào)函數(shù)指針 recv.以及回調(diào)參數(shù) recv_arg該函數(shù)指針?biāo)赶虻暮瘮?shù)會(huì)在有新的 udp 層數(shù)據(jù)到達(dá)的時(shí)候被調(diào)用。功能說明發(fā)送 p 中所包含的數(shù)據(jù)到 UDP 層,最終由鏈路層送出到網(wǎng)。UDP 層發(fā)送數(shù)據(jù)就是通過本函數(shù)進(jìn)行的,參數(shù) p 必須申請(qǐng)為傳輸層 pbuf,否則會(huì)出錯(cuò)。示例/一系

40、列初始化過程p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct nserver), PBUF_RAM);./填充 p 的 payload 域的數(shù)據(jù)upcb = udp_new();udp_connect(upcb, (struct ip_addr *)&nserv, NS_PORT);/連接 dns 服務(wù)器udp_send(upcb, p); pbuf_free(p);Technology for Easy Living2.6 TCP 層 API 函數(shù)說明unIP 具有完整的 TCP 層的實(shí)現(xiàn),利用本層提供的 API 可以實(shí)現(xiàn)各種基于 TCP 協(xié)議的應(yīng)用層

41、協(xié)議,例如 HTTP,POP3 和 SMTP 等等。下面是本層 API 函數(shù)的詳細(xì)說明。tcp_init ()tcp_new () Sunplus University Program第 16函數(shù)原型struct tcp_pcb * tcp_new (void);參數(shù)無返回值若成功則 TCP 協(xié)議控制塊指針若無空閑 TCP 協(xié)議控制塊,則返回 NULL。系統(tǒng)可用 TCP 協(xié)議控制塊的個(gè)數(shù),可以通過宏 TCP_NUM 配置。功能說明新建 TCP 協(xié)議控制塊;新建接之前調(diào)用此函數(shù)獲取一個(gè)可用的協(xié)議控制塊。此函數(shù)給協(xié)議控制塊默認(rèn)優(yōu)先級(jí)為 TCP_PRIO_NORMAL 64函數(shù)原型voidtcp_i

42、nit(void);參數(shù)無返回值無功能說明tcp 初始化函數(shù),應(yīng)該在所有的 tcp 應(yīng)用之前被調(diào)用,初始化 tcp 模塊。參數(shù)arg回調(diào)參數(shù)upcbUDP 協(xié)議控制塊指針p存放接收到的數(shù)據(jù)的 pbuf 指針addrremote host 的 ip 地址portremote host 的端返回值成功則返回 ERR_OK,繼續(xù)這次 UDP 通信。若出錯(cuò)則可以返回相應(yīng)的錯(cuò)誤編碼,以中止 UDP 通信。功能說明本函數(shù)當(dāng) udp 層有新的數(shù)據(jù)到來的時(shí)候會(huì)被調(diào)用。新的數(shù)據(jù)就在 p 中存放,addr 和port 為 remote ip addr 和 remote port。udp 層的協(xié)議的接收處理部分就在

43、此函數(shù)中進(jìn)行。利用 UDP 層實(shí)現(xiàn)的應(yīng)用層協(xié)議的實(shí)現(xiàn),主體部分一般在 recv 函數(shù)中進(jìn)行。Technology for Easy Livingtcp_alloc ()tcp_arg ()tcp_bind ()tcp_listen () Sunplus University Program第 17函數(shù)原型struct tcp_pcb * tcp_listen(struct tcp_pcb *pcb);參數(shù)pcb函數(shù)原型err_ttcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr,u16_t port);參數(shù)pcbTCP 協(xié)議控制塊指針ipa

44、ddr需要綁定的本地網(wǎng)絡(luò)接口的 ip 地址port綁定的本地端口,若為 0 則由協(xié)議棧隨機(jī)選取一個(gè)端口。返回值成功則返回 ERR_OK出錯(cuò)可能返回 ERR_USE,表示端口已經(jīng)被別的 pcb 綁定。功能說明將指定 pcb 綁定到本地的 ip 地址和 port 端;若 ipaddr 若為 IP_ADDR_ANY,則是綁定到本地所有 ip 地址(當(dāng)有多網(wǎng)絡(luò)接口時(shí),就是綁定到所有的接口)。若有其它 pcb 已經(jīng)綁定該 ip 以及 port 口,則返回 ERR_USE,否則返回 ERR_OK 表示綁定成功函數(shù)原型voidtcp_arg(struct tcp_pcb *pcb, void *arg);參

45、數(shù)pcbTCP 協(xié)議控制塊指針arg回調(diào)參數(shù)返回值無功能說明設(shè)置有 PCB 所確定的 TCP 連接中使用的回調(diào)參數(shù)。該參數(shù)會(huì)在該 PCB 塊對(duì)應(yīng)的回調(diào)函數(shù)中被。函數(shù)原型struct tcp_pcb * tcp_alloc(u8_t prio);參數(shù)prio協(xié)議控制塊的優(yōu)先級(jí)返回值若成功則 TCP 協(xié)議控制塊指針若無空閑 TCP 協(xié)議控制塊,則返回 NULL。系統(tǒng)可用 TCP 協(xié)議控制塊的個(gè)數(shù),可以通過宏 TCP_NUM 配置。功能說明功能同 tcp_new(),額外的功能是可以指定 PCB 的優(yōu)先級(jí)。Technology for Easy Livingtcp_accept ()accept (

46、) Sunplus University Program第 18函數(shù)原型err_t (* accept)(void *arg, struct tcp_pcb *newpcb,err_t err);參數(shù)arg回調(diào)參數(shù)newpcb此連接的協(xié)議控制塊err連接過程中的錯(cuò)誤碼返回值無功能說明回調(diào)函數(shù)(函數(shù)名稱可以由程序員自己指定):當(dāng)客戶端發(fā)起連接請(qǐng)求時(shí)會(huì)被調(diào)用。此函數(shù)在 tcp 連接由 SYN_RECV 狀態(tài)轉(zhuǎn)換到 ESTABLISED 之間被調(diào)用。應(yīng)用層可以在此函數(shù)中做一些初始化動(dòng)作以及 filter 的動(dòng)作,若通過所有檢查則返回ERR_OK,通知協(xié)議棧接受此連接。否則返回其它錯(cuò)誤碼,通知協(xié)議棧重

47、置客戶端連函數(shù)原型voidtcp_accept(struct tcp_pcb *pcb,err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err);參數(shù)pcbTCP 協(xié)議控制塊指針accept接受連接回調(diào)函數(shù)指針返回值無功能說明設(shè)定接受連接回調(diào)函數(shù)。當(dāng)有 cnt 連接到pcb 中的相應(yīng)端口時(shí),accept 所指向的函數(shù)將被調(diào)用。TCP 協(xié)議控制塊指針返回值成功則返回 pcb 指針(實(shí)際為 listeb *)功能說明將 pcb 所指定的連接置于 隊(duì)列中。在此操作之前,必須已經(jīng)執(zhí)行完綁定動(dòng)作。置于 隊(duì)列以后,若有客戶端連接已經(jīng)綁定的

48、端口,則會(huì)調(diào)用接下來由函數(shù) tcp_accept()所指定的回調(diào)函數(shù),來服務(wù)該連接。此函數(shù)是用來實(shí)現(xiàn) tcp 服務(wù)器程序的。由于處于listen 狀態(tài)的tcp 協(xié)議控制塊所需的ram 較小,因此本函數(shù)將 的pcb,并另外申請(qǐng)一個(gè)小一些的 pcb 以供 狀態(tài)之用。若 mem 過少,則可能返回 NULL。Technology for Easy Livingtcp_connect ()connected () Sunplus University Program第 19函數(shù)原型err_t (* connected)(void *arg,struct tcp_pcb *tpcb, err_t err)

49、;參數(shù)arg回調(diào)函數(shù)指針tpcbTCP 協(xié)議控制塊指針err連接建立過程中的錯(cuò)誤碼返回值操作成功返回 ERR_OK,否則返回錯(cuò)誤碼函數(shù)原型err_ttcp_connect (struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, err_t (* connected)(void *arg,struct tcp_pcb *tpcb,err_t err);參數(shù)pcbTCP 協(xié)議控制塊指針ipaddrremote host 的 ip 地址portremote host 的端connected連接建立回調(diào)函數(shù)指針。返回值操作成功返回 ERR_O

50、K,否則返回錯(cuò)誤碼功能說明建立到服務(wù)器的 接。并指定一個(gè)回調(diào)函數(shù)指針 connected,當(dāng)連接被服務(wù)器接受,連接最終建立的時(shí)候,協(xié)議棧會(huì)自動(dòng)調(diào)用該指針?biāo)赶虻暮瘮?shù)。本函數(shù)執(zhí)行中會(huì)送出一個(gè) SYN,并不會(huì)等服務(wù)器回應(yīng)就立刻返回,后續(xù)的動(dòng)作是在協(xié)議棧中完成的,直到連接建立的時(shí)候,應(yīng)用層才有機(jī)會(huì)在 connected 函數(shù)中做一些操作。本函數(shù)執(zhí)行成功后會(huì)返回 ERR_OK,若返回 ERR_MEM 則表示沒有 RAM 來發(fā)送SYN。本函數(shù)用來實(shí)現(xiàn)客戶端對(duì)服務(wù)器端發(fā)起一次連接。接(RST)。Technology for Easy Livingtcp_write ()tcp_sent () Sunplu

51、s University Program第 20函數(shù)原型voidtcp_sent(struct tcp_pcb *pcb,err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len);參數(shù)pcbTCP 協(xié)議控制塊指針sent發(fā)送數(shù)據(jù)回調(diào)函數(shù)返回值無功能說明設(shè)定回調(diào)函數(shù)指針 sent此函數(shù)設(shè)定回調(diào)函數(shù) sent。函數(shù)原型err_ttcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len,u8_t copy);參數(shù)pcbTCP 協(xié)議控制塊指針dataptr待發(fā)送數(shù)據(jù)首地址len

52、待發(fā)送數(shù)據(jù)的長(zhǎng)度(以字節(jié)為)copy不拷貝到協(xié)議棧發(fā)送拷貝到協(xié)議棧發(fā)送返回值操作成功返回 ERR_OK,否則返回錯(cuò)誤碼功能說明應(yīng)用層傳輸 TCP 數(shù)據(jù)函數(shù)。此函數(shù)一般在 ESTABLISED 狀態(tài)下調(diào)用。用來發(fā)送以 dataptr 為首地址,長(zhǎng)度為 len(by ength)的數(shù)據(jù)。copy 為 0 表示不需要在協(xié)議棧 拷貝一份該數(shù)據(jù),多用于發(fā)送 rom 或不會(huì)變動(dòng)的靜態(tài)數(shù)據(jù)。若是動(dòng)態(tài)數(shù)據(jù)則 copy 應(yīng)該置為 1,讓協(xié)議??截愐环菰摂?shù)據(jù)發(fā)送。本函數(shù)返回 ERR_OK 則表示數(shù)據(jù)成功 到發(fā)送隊(duì)列之中,否則表示 失敗,一般會(huì)返回 ERR_MEM。功能說明回調(diào)函數(shù)(函數(shù)名稱可以由程序員自己指定):

53、當(dāng)收到服務(wù)器的 SYN ACK 后會(huì)調(diào)用此函數(shù)。此函數(shù)在 tcp 由 SYN Sent 狀態(tài)轉(zhuǎn)換到 ESTABLISED 之間被調(diào)用,讓應(yīng)用層可以處理一個(gè)剛被服務(wù)器接受的接。參數(shù) err 代表了是否是一次正確地連接建立。Technology for Easy Livingsent ()tcp_recv ()recv () Sunplus University Program第 21函數(shù)原型err_t (* recv)(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err);參數(shù)arg回調(diào)參數(shù)tpcbTCP 協(xié)議控制塊指針p存放收到的

54、數(shù)據(jù)的 pbuf函數(shù)原型voidtcp_recv(struct tcp_pcb *pcb,err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);參數(shù)pcbTCP 協(xié)議控制塊指針recv接受數(shù)據(jù)回調(diào)函數(shù)指針返回值無功能說明設(shè)定回調(diào)函數(shù) recv。該函數(shù)在收到新的數(shù)據(jù)后會(huì)被調(diào)用。函數(shù)原型err_t (* sent)(void *arg, struct tcp_pcb *tpcb,u16_t len);參數(shù)arg回調(diào)參數(shù)tpcbTCP 協(xié)議控制塊指針lenremote host 新收到的數(shù)據(jù)長(zhǎng)度,以字節(jié)為

55、返回值操作成功返回 ERR_OK,讓連接繼續(xù)。否則返回錯(cuò)誤碼,通知協(xié)議棧中止該連接,并資源。功能說明此回調(diào)函數(shù)在 remote host 收到新的數(shù)據(jù)后會(huì)被調(diào)用。len 表示新被收到的字節(jié)數(shù)。此函數(shù)用來續(xù)發(fā)應(yīng)用層未發(fā)送完的數(shù)據(jù)。函數(shù)指針 sent 指向的函數(shù)將在 tcp 層得知有新的數(shù)據(jù)被 remote 端收到的時(shí)候被調(diào)用。用來繼續(xù)發(fā)送應(yīng)用層未發(fā)送完畢的數(shù)據(jù)。Technology for Easy Livingtcp_recved ()tcp_poll ()poll () Sunplus University Program第 22函數(shù)原型err_t (* poll)(void *arg, s

56、truct tcp_pcb *tpcb),u8_terval);參數(shù)arg回調(diào)參數(shù)函數(shù)原型voidtcp_poll(struct tcp_pcb *pcb,err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_terval);參數(shù)pcbTCP 協(xié)議控制塊指針poll輪詢回調(diào)函數(shù)指針erval輪詢周期返回值無功能說明設(shè)定一個(gè)周期調(diào)用的函數(shù)指針 poll。周期典型值為erval *0.5secs。函數(shù)原型voidtcp_recved(struct tcp_pcb *pcb, u16_t len);參數(shù)pcbTCP 協(xié)議控制塊指針len應(yīng)用層收到的數(shù)

57、據(jù)長(zhǎng)度,以字節(jié)為返回值無功能說明應(yīng)用層用來通知底層協(xié)議成功收到的字節(jié)數(shù),在接收到新的數(shù)據(jù)后必須調(diào)用此函數(shù),否則窗口將不會(huì)更新,窗口將很快塞滿而無法接收新的數(shù)據(jù)。err協(xié)議棧拋出的錯(cuò)誤編碼返回值一切操作成功則返回 ERR_OK,讓連接繼續(xù)進(jìn)行。否則返回錯(cuò)誤碼通知協(xié)議棧中止連接。功能說明本回調(diào)函數(shù)用來接收新的數(shù)據(jù)。應(yīng)用層協(xié)議主體在本函數(shù)中實(shí)現(xiàn),所有的應(yīng)用層輸入數(shù)據(jù)均來源于此函數(shù)中 pbuf 指針 p。處理完畢后返回 ERR_OK 表示繼續(xù)連接,否則協(xié)議棧會(huì)終止連接。Technology for Easy Livingtcp_err ()err ()tcp_close () Sunplus Univ

58、ersity Program第 23函數(shù)原型err_ttcp_close(struct tcp_pcb *pcb);參數(shù)pcbTCP 協(xié)議控制塊返回值操作成功返回 ERR_OK函數(shù)原型void (* err)(void *arg, err_t err);參數(shù)arg回調(diào)參數(shù)err協(xié)議棧扔出的錯(cuò)誤編碼返回值無功能說明錯(cuò)誤處理回調(diào)函數(shù),當(dāng)連接發(fā)生某些錯(cuò)誤的時(shí)候會(huì)調(diào)用,例如接收到 RST 或者發(fā)出RST 等,用戶應(yīng)該在此函數(shù)中進(jìn)行一些資源回收的處理,因?yàn)榇撕瘮?shù)被調(diào)用意味著該連接將馬上被刪除,若此時(shí)不回收一些資源將會(huì)造成資源泄漏。函數(shù)原型voidtcp_err(struct tcp_pcb *pcb,v

59、oid (* err)(void *arg, err_t err);參數(shù)pcbTCP 協(xié)議控制塊指針 err錯(cuò)誤處理函數(shù)指針返回值無功能說明設(shè)定錯(cuò)誤處理回調(diào)函數(shù),當(dāng)連接發(fā)生某些錯(cuò)誤的時(shí)候會(huì)調(diào)用,例如接收到 RST 或者發(fā)出 RST 等,用戶應(yīng)該在此函數(shù)中進(jìn)行一些資源回收的處理,因?yàn)榇撕瘮?shù)被調(diào)用意味著該連接將馬上被刪除,若此時(shí)不回收一些資源將會(huì)造成資源泄漏。tpcbTCP 協(xié)議控制塊指針 poll輪詢回調(diào)函數(shù)指針返回值無功能說明位于應(yīng)用層的周期調(diào)用的函數(shù),當(dāng)一次連接長(zhǎng)期處于 idle 狀態(tài)時(shí),此函數(shù)可以用來處理一些事務(wù),例如超時(shí)斷線回收資源等等。Technology for Easy Livin

60、gtcp_abort ()tcp_tmr ()2.7 網(wǎng)絡(luò)字節(jié)輔助函數(shù) API由于網(wǎng)絡(luò)字節(jié)序是 big endian,而 UnSP 單片機(jī)為 little endian,所以在從網(wǎng)絡(luò)字節(jié)流中獲取數(shù)據(jù)的以及送數(shù)據(jù)到網(wǎng)絡(luò)鏈路中去的時(shí)候都應(yīng)該做一下轉(zhuǎn)換。還有, UnSP 單片機(jī)的一個(gè)字節(jié)在物理上是 16bit的數(shù)據(jù),而網(wǎng)絡(luò)字節(jié)流的為字節(jié),因此也不能直接利用數(shù)組下標(biāo)的模式來取數(shù),而需要用別的方法來處理。本節(jié)就是介紹用于處理以上兩類情形的 API 函數(shù)。下面就是詳細(xì)說明:htons() Sunplus University Program第 24函數(shù)原型u16_t htons(u16_t n)參數(shù)n16

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論