TCP IP 協(xié)議棧分析與實現(xiàn)_第1頁
TCP IP 協(xié)議棧分析與實現(xiàn)_第2頁
TCP IP 協(xié)議棧分析與實現(xiàn)_第3頁
TCP IP 協(xié)議棧分析與實現(xiàn)_第4頁
TCP IP 協(xié)議棧分析與實現(xiàn)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗報告課程名稱:TCP/IP 協(xié)議棧分析與實現(xiàn)學(xué)生姓名:郭勇 專業(yè):信息工程學(xué)號:201005010718 同組學(xué)生姓名:無實驗地點 :6C601 指導(dǎo)老師: 劉飚實驗日期: 2013年3月25日實驗一:實驗項目名稱:Linux 內(nèi)核通用鏈表的使用一、實驗?zāi)康暮鸵?學(xué)習(xí) Linux 內(nèi)核的通用鏈表的設(shè)計原理,熟練掌握 Linux 內(nèi)核通用鏈表的使用。二、實驗內(nèi)容1. 掌握 Linux 通用鏈表的創(chuàng)建2. 掌握通用鏈表增加元素、刪除元素和遍歷鏈表的方法。三、實驗要求1. 待創(chuàng)建的鏈表頭變量名為 user_queue。2. 作為鏈表的宿主節(jié)點類型定義如下:struct user int id;

2、/* user id */struct list_head list;3.針對上述 user_queue 鏈表,要求以隊列方式向其中依次添加 10 個類型為 struct user的宿主節(jié)點,并要求這 10 個宿主節(jié)點的 id 依次為 1-104. 依次遍歷輸出這 10 個宿主節(jié)點的 id5. 從隊列中刪除首個宿主節(jié)點,然后依次遍歷該隊列并輸出余下各宿主節(jié)點的 id 值四、實現(xiàn)原理Linux 的內(nèi)核源文件 list.h 提供了所有的鏈表定義、各類操作接口及其實現(xiàn)。其中創(chuàng)建鏈表的方法如下:LIST_HEAD(my_list);內(nèi)核源文件 list.h 中定義了以下若干接口,用于對通用鏈表進(jìn)行各類

3、操作:1)在指定的 head 后插入新節(jié)點,常用于堆棧數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)/ new: 即將添加的新鏈表節(jié)點/ head: 在此節(jié)點后添加list_add(struct list_head *new, struct list_head *head);2)在指定的 head 前插入新節(jié)點,常用于隊列數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)/ new: 即將添加的新鏈表節(jié)點/ head: 在此節(jié)點前添加list_add_tail(struct list_head *new, struct list_head *head)3)從鏈表中刪除一個指定節(jié)點/ entry: 要從鏈表中刪除的鏈表節(jié)點list_del(struct list

4、_head *entry)4)根據(jù)當(dāng)前鏈表節(jié)點指針 ptr 獲得宿主節(jié)點指針/ * ptr:struct list_head 類型的指針/ * type: 鏈表節(jié)點所在的宿主節(jié)點的類型/ * member: 嵌入宿主的鏈表節(jié)點的變量名list_entry(ptr, type, member)5)遍歷鏈表/ pos: 遍歷鏈表時用于指示正在遍歷的鏈表節(jié)點的指針/ head: 鏈表頭list_for_each(pos, head)五、實現(xiàn)代碼和運行結(jié)果#include#include#include list.hLIST_HEAD(user_quene);struct userint id;/*u

5、ser id*/struct list_head list;int main()struct user uid10;struct list_head *pos;int i;for(i=0;iid);printf(n);list_del(&(uid0.list);list_for_each(pos,&user_quene)printf(%d ,list_entry(pos,struct user,list)-id);printf(n);return 0;實驗二、實驗項目名稱:Linux 內(nèi)核通用哈希鏈表的使用一、實驗?zāi)康暮鸵?學(xué)習(xí) Linux 內(nèi)核的通用哈希鏈表的設(shè)計原理,熟練掌握 Linux

6、 內(nèi)核通用哈希鏈表的使用。二、實驗內(nèi)容1. 掌握 Linux 通用哈希鏈表的創(chuàng)建2. 掌握通用哈希表增加元素、查找元素的方法。三、1.實驗要求待創(chuàng)建的哈希表頭數(shù)組為 struct hlist_head user_hash16,要求對哈希表宿主元素的name 成員的值進(jìn)行散列,并將散列值作為哈希表宿主元素的 key。2.作為哈希表元素的宿主節(jié)點類型定義如下:struct usermap struct hlist_node hlist;unsigned char name8;3.針對上述 user_hash 哈希表,要求向其中添加 3 個類型為 struct usermap 的宿主元素,并要求這

7、3 個宿主元素的 name 成員分別為smith, john, bob。4.向哈希表 user_hash 中添加第 4 個宿主元素。若新宿主元素的 name 成員已經(jīng)存在(例如john),則提示已經(jīng)存在該用戶,否則向哈希表中添加該宿主元素。四、實現(xiàn)原理Linux 的內(nèi)核源文件 list.h 提供了哈希表各類操作接口及其實現(xiàn)。其中創(chuàng)建具有 16個 key 值的哈希表的方法如下:struct hlist_head user_hash16;在上述 user_hash 數(shù)組的 16 個元素中存放的哈希表頭元素定義如下:struct hlist_head struct hlist_node *first

8、;哈希表節(jié)點元素定義如下:struct hlist_node struct hlist_node *next, *pprev;本實驗對哈希表宿主元素節(jié)點的 name 值進(jìn)行散列的算法如下:unsigned int BKDRHash(unsigned char *str)unsigned int seed = 131;unsigned int hash = 0;while(*str)hash = hash * seed + (*str+);return (hash & 0x7FFFFFFF);/ 返回此*str 所對應(yīng)的哈希值于是,本實驗中對一個字符串 name 求最終哈希值 hash 的方法如

9、下:unsigned int hash = BKDRHash(name) & 15內(nèi)核源文件 list.h 中定義了以下若干接口,用于對哈希表進(jìn)行各類操作:1)在指定的哈希表頭 h 所指向的鏈表頭插入新節(jié)點/ n: 要添加的新哈希表節(jié)點/ h: 在此哈希表頭節(jié)點后添加hlist_add_head(struct hlist_node *n, struct hlist_head *h);2)根據(jù)當(dāng)前哈希表節(jié)點指針 ptr 獲得哈希表宿主節(jié)點指針/ * ptr:struct hlist_node 類型的指針/ * type: 哈希表節(jié)點所在的宿主節(jié)點的類型/ * member: 嵌入宿主的哈希表節(jié)點

10、的變量名hlist_entry(ptr, type, member)3)遍歷哈希表中某個 key 所對應(yīng)的鏈表/ tpos: 哈希表宿主節(jié)點指針/ pos: 哈希表節(jié)點指針/ head: 哈希表中某 key 所對應(yīng)的鏈表的頭指針/ member: 嵌在哈希表宿主節(jié)點中哈希表節(jié)點的變量名hlist_for_each_entry(tpos, pos, head, member)五、實現(xiàn)代碼和運行結(jié)果#include#include#include#include list.hstruct hlist_head user_hash16;struct usermap struct hlist_node

11、 hlist;unsigned char name8;unsigned int BKDRHash(unsigned char *str)unsigned int seed = 131;unsigned int hash = 0;while(*str)hash = hash * seed + (*str+);return (hash & 0x7FFFFFFF);/ 返回此*str 所對應(yīng)的哈希值int main()struct usermap u_name16,*tpos;struct hlist_node *pos;unsigned int hash;unsigned char name8,

12、*sname;int flag=0;strncpy(u_,bob,8); hash = BKDRHash(u_) & 15;hlist_add_head(&(u_name0.hlist), &(user_hashhash);/printf(%s %un,u_,hash);hlist_for_each_entry(tpos,pos,&(user_hashhash),hlist)printf(%s,hlist_entry(pos, struct usermap, hlist)-name);printf(n);strncpy(u_name1

13、.name,smith,8);hash = BKDRHash(u_) & 15;hlist_add_head(&(u_name1.hlist), &(user_hashhash); /printf(%s %un,u_,hash);hlist_for_each_entry(tpos,pos,&(user_hashhash),hlist)printf(%s,hlist_entry(pos, struct usermap, hlist)-name);printf(n);strncpy(u_,john,8);hash = BKDRHash(u

14、_) & 15;hlist_add_head(&(u_name2.hlist), &(user_hashhash);/printf(%s %un,u_,hash);hlist_for_each_entry(tpos,pos,&(user_hashhash),hlist)printf(%s,hlist_entry(pos, struct usermap, hlist)-name);printf(n);printf(please input namen);scanf(%s,name);hash = BKDRHash(name) & 15;/printf(%dn,hash);hlist_for_each_entry(tpos,pos,&(user_hashhash),hlist)if(

溫馨提示

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

評論

0/150

提交評論