![網(wǎng)絡(luò)編程與分層協(xié)議設(shè)計(jì)部分習(xí)題答案_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-5/2/602e38cf-05b8-4a09-808a-c49921841b6f/602e38cf-05b8-4a09-808a-c49921841b6f1.gif)
![網(wǎng)絡(luò)編程與分層協(xié)議設(shè)計(jì)部分習(xí)題答案_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-5/2/602e38cf-05b8-4a09-808a-c49921841b6f/602e38cf-05b8-4a09-808a-c49921841b6f2.gif)
![網(wǎng)絡(luò)編程與分層協(xié)議設(shè)計(jì)部分習(xí)題答案_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-5/2/602e38cf-05b8-4a09-808a-c49921841b6f/602e38cf-05b8-4a09-808a-c49921841b6f3.gif)
![網(wǎng)絡(luò)編程與分層協(xié)議設(shè)計(jì)部分習(xí)題答案_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-5/2/602e38cf-05b8-4a09-808a-c49921841b6f/602e38cf-05b8-4a09-808a-c49921841b6f4.gif)
![網(wǎng)絡(luò)編程與分層協(xié)議設(shè)計(jì)部分習(xí)題答案_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-5/2/602e38cf-05b8-4a09-808a-c49921841b6f/602e38cf-05b8-4a09-808a-c49921841b6f5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第2章 Linux下C編程環(huán)境習(xí)題4信號(hào)忽略是指不對(duì)該信號(hào)做出任何響應(yīng),就猶如該信號(hào)沒(méi)有發(fā)生過(guò)一樣,進(jìn)程不對(duì)其做任何處理.信號(hào)阻塞是指若在某一時(shí)刻該信號(hào)發(fā)生了,此時(shí)內(nèi)核不會(huì)將該信號(hào)發(fā)送給進(jìn)程,而是將該信號(hào)保存起來(lái),待到該函數(shù)解除對(duì)該信號(hào)的阻塞之后,再發(fā)送給該進(jìn)程進(jìn)行處理.在信號(hào)受到阻塞和進(jìn)程解除對(duì)該信號(hào)的阻塞,但信號(hào)還未到達(dá)進(jìn)程之間的時(shí)間段,進(jìn)程可以任意改變對(duì)該信號(hào)的處理.當(dāng)然如果到該進(jìn)程結(jié)束之時(shí)如果還沒(méi)有解除阻塞的話對(duì)則該信號(hào)的處理和忽略差不多習(xí)題5參見(jiàn)程序2_5.c習(xí)題6參見(jiàn)程序2_6.c習(xí)題7參見(jiàn)程序2_7.c和程序2_7_withmutex.c習(xí)題8此處第8行和第10行是可以交換的.當(dāng)
2、將其交換以后,首先執(zhí)行pthread_cond_signal(&mqlock_ready),此時(shí)對(duì)于另一個(gè)之前因條件不滿足的線程thread2_run感知到條件變量的變化,開(kāi)始獲取鎖.類似于調(diào)用pthread_mutex_lock(&mqlock),而此時(shí)線程thread1_run尚未解除鎖,因此前一個(gè)線程thread2_run因無(wú)法獲取鎖而阻塞.隨后線程thread1_run調(diào)用thread_mutex_unlock(&mqlock)釋放鎖.此時(shí)線程thread2_run得到鎖,繼續(xù)執(zhí)行.當(dāng)然對(duì)于其他的程序環(huán)境是否能夠交換視具體環(huán)境而定.總得來(lái)說(shuō)都對(duì),不過(guò)都有缺陷(參看Unix環(huán)境高級(jí)編程P
3、697-11.4)。習(xí)題9參見(jiàn)程序2_9.c第3章 網(wǎng)絡(luò)編程中常用的典型知識(shí)習(xí)題2參見(jiàn)程序3_2.c習(xí)題4struct len_and_flag unsigned short reserved:4, hlen:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;習(xí)題5可以將鏈表節(jié)點(diǎn)置于宿主的固定位置,例如宿主的首個(gè)元素位置,然后通過(guò)將指向鏈表節(jié)點(diǎn)的指針強(qiáng)制類型轉(zhuǎn)換為宿主節(jié)點(diǎn)的地址。習(xí)題6參見(jiàn)程序3_6.c習(xí)題7先分析為什么要使用雙向鏈表,而不使用單鏈表:考慮普通的單鏈表,如下:struct nodestruct node*next
4、;假定a是某個(gè)單鏈表中的節(jié)點(diǎn)(struct node a),而b是剛定義的節(jié)點(diǎn)(struct node b)對(duì)于這樣的鏈表,在指定的節(jié)點(diǎn)a后插入b很容易:b.next=a.next;a.next=&b;然而在指定的節(jié)點(diǎn)a前插入b卻很麻煩;struct node head; 設(shè)head為頭結(jié)點(diǎn)struct node *temp;temp=&head;while(temp-next!=&a)temp=temp-next;得到a的前一個(gè)節(jié)點(diǎn)temp-next=&b;b.next=&a;將b插入temp與a之間這就花費(fèi)了一定的時(shí)間來(lái)搜索a的前一個(gè)節(jié)點(diǎn),而linux要節(jié)省這部分時(shí)間.因此使用雙向鏈表,這
5、就決定一個(gè)節(jié)點(diǎn)應(yīng)該含有兩個(gè)指針(一個(gè)向前,一個(gè)向后)然后分析為什么prev要是用二級(jí)指針,而不使用一級(jí)指針:Linux內(nèi)核中,除了有通用了雙向鏈表,還有通用的哈希鏈表。后者定義與前者有些不同。因?yàn)橥ǔR粋€(gè)哈希表的表頭要占用很大空間,而如果每個(gè)表頭都用一個(gè)雙向鏈表來(lái)做的話,就顯得太浪費(fèi)了。只用一個(gè)指針可以實(shí)現(xiàn)相同的功能,并且可以節(jié)省一半的表頭存儲(chǔ)空間.因此這就決定表頭只含有一個(gè)指針(向前)哈希鏈表定義如下:struct hlist_head struct hlist_node *first; struct hlist_node struct hlist_node *next, *pprev;由于
6、表頭結(jié)構(gòu)體hlist_head與節(jié)點(diǎn)結(jié)構(gòu)體hlist_node的定義不一樣,將使得我們的pprev指針無(wú)法直接指向hlist_head,那我們可以讓其指向first。而要指向first則pprev必定為二級(jí)指針.習(xí)題8參見(jiàn)程序3_8.c習(xí)題9為了讓notifier_chain_register函數(shù)的實(shí)參能夠向主程序返回該函數(shù)的處理后結(jié)果,該函數(shù)在設(shè)計(jì)上使用了2級(jí)指針。如果使用1級(jí)指針則無(wú)法通過(guò)實(shí)參帶回改變后的結(jié)果。習(xí)題10在3.2中的程序可以按8比特進(jìn)行加運(yùn)算,這兩種運(yùn)算在邏輯上都是可行的,但是按8bit進(jìn)行加運(yùn)算,其加的次數(shù)差不多是按16bit的2倍,浪費(fèi)了時(shí)間第4章 基礎(chǔ)套接字習(xí)題1參見(jiàn)程
7、序4_1.c習(xí)題2參見(jiàn)程序4_2.c習(xí)題3參見(jiàn)程序4_3.c習(xí)題4參見(jiàn)程序4_4.c習(xí)題5參見(jiàn)程序4_5.c習(xí)題6fprintf(stdout,Server got connection from %s portnumber %un, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port);習(xí)題7第二個(gè)客戶端可以連接到服務(wù)器,但是客戶端程序?qū)⒆枞趓ead函數(shù),直到第一個(gè)客戶端請(qǐng)求結(jié)束,因?yàn)榉?wù)器程序?yàn)榈模⒎遣⑿械?,accept函數(shù)接收第一個(gè)連接請(qǐng)求后,沒(méi)有fork出子進(jìn)程來(lái)處理客戶端請(qǐng)求,因此套接口一直被占用,直到客戶
8、端關(guān)閉連接,服務(wù)器才執(zhí)行close關(guān)閉連接,這是服務(wù)器端才能接收第二個(gè)新的連接。所以,若第二個(gè)客戶端也發(fā)出請(qǐng)求,則必須等到第一個(gè)客戶端請(qǐng)求處理完成,才能夠獲得服務(wù)器的應(yīng)答。習(xí)題8注釋掉程序第6566行后,3次使用4.2節(jié)的客戶端訪問(wèn)此服務(wù)器后,退出客戶端,執(zhí)行ps -a命令后會(huì)出現(xiàn)如下現(xiàn)象; 3912 pts/0 00:00:00 4.3 3926 pts/0 00:00:00 4.3 4006 pts/0 00:00:00 4.3 這表明三個(gè)子進(jìn)程仍作為僵死進(jìn)程存在著。其所占的內(nèi)存空間和其他資源沒(méi)有被回收。這是由于注釋掉6566行后,程序?qū)⒉辉诓蹲絊IGCHLD信號(hào),而內(nèi)核對(duì)此信號(hào)的默認(rèn)動(dòng)作
9、是忽略。由此可以看出,對(duì)并發(fā)服務(wù)器進(jìn)行SIGCHLD信號(hào)捕捉是必要的,因?yàn)槲覀儾辉缚吹浇┧肋M(jìn)程的出現(xiàn)。習(xí)題9用set follow-fork-mode child進(jìn)入gdb調(diào)試工具后,在160行處設(shè)置斷點(diǎn)后,如題所述,啟動(dòng)第一個(gè)客戶端無(wú)法立刻得到回答,當(dāng)啟動(dòng)第二個(gè)客戶端時(shí),可以看到,發(fā)出的請(qǐng)求立刻就得到了服務(wù)器的應(yīng)答。這是由于,fork后,父進(jìn)程關(guān)閉套接口描述符后,又返回到主循環(huán)執(zhí)行,并阻塞于accept函數(shù),等待接收新的連接請(qǐng)求。當(dāng)?shù)诙€(gè)客戶端發(fā)來(lái)連接請(qǐng)求后,服務(wù)器接收,并fork一個(gè)新的子進(jìn)程來(lái)處理客戶端的請(qǐng)求。這個(gè)子進(jìn)程不會(huì)阻塞于write。因此,第二個(gè)客戶端可以立刻得到服務(wù)器的應(yīng)答。習(xí)
10、題10不啟動(dòng)服務(wù)器,而單獨(dú)執(zhí)行客戶端程序時(shí),會(huì)發(fā)現(xiàn)客戶端程序永遠(yuǎn)阻塞于它的recvfrom調(diào)用。即鍵入格式化要求后不會(huì)收到任何應(yīng)答。程序也不會(huì)退出。該錯(cuò)誤由sendto引起,但是sendto本身卻成功返回,該ICMP錯(cuò)誤直到后來(lái)才返回,因此稱其為異步錯(cuò)誤。要使客戶端能夠發(fā)現(xiàn)該錯(cuò)誤而退出,有兩個(gè)方法。第一個(gè)方法是為recvfrom設(shè)置一個(gè)超時(shí),調(diào)用函數(shù)alarm就可實(shí)現(xiàn)超時(shí)的設(shè)置。第二個(gè)方法是為UDP使用connect函數(shù),使其成為連接的UDP套接口,但是使用connect后的UDP套接口,不能給輸出操作指定目的ip和端口號(hào),也就是說(shuō),我們不再使用sendto,而改用write或send。寫(xiě)到已
11、連接的UDP套接口上的內(nèi)容都會(huì)自動(dòng)發(fā)送到由connect函數(shù)指定的協(xié)議地址。同時(shí),我們也不必使用recvfrom函數(shù),而是改用read或recv。此時(shí)由內(nèi)核為輸入操作返回的數(shù)據(jù)報(bào)僅僅是那些來(lái)自connect所指定的協(xié)議地址的數(shù)據(jù)報(bào)。 因此我們可以將4.5的客戶端程序作如下修改。首先注釋掉8691行和107113行。然后在第85行后添加以下代碼 if(connect(s,(struct sockaddr *)&adr_srvr,len_inet)=-1) printf(connect errorn); exit(1);然后再在114行前添加z=read(s,dgram,sizeof dgram)
12、;最后重新編譯,運(yùn)行(仍然不啟動(dòng)服務(wù)器)程序就不會(huì)永遠(yuǎn)阻塞于recvfrom調(diào)用,而是返回一個(gè)“Connection refused: recvfrom()”錯(cuò)誤后退出。第5章 高級(jí)套接字習(xí)題1對(duì)套接口設(shè)置了SO_KEEPALIVE選項(xiàng)后,即使任何?;钐綔y(cè)分段均無(wú)響應(yīng),我們也不能肯定對(duì)端主機(jī)已經(jīng)崩潰。因而TCP可能會(huì)終止一個(gè)有效連接。考慮以下情況:某個(gè)中間路由崩潰15分鐘是可能的,而這段時(shí)間又正好與主機(jī)的11分又15秒的保持存活探測(cè)周期完全重疊。因而它可能終止存活的連接。(主機(jī)的11分15秒的保持存活連接是指:第一個(gè)對(duì)端保持連接存活探測(cè)分段沒(méi)有任何響應(yīng),源自Berkeley 的TCP將另外發(fā)送
13、8個(gè)探測(cè)分段,相隔75秒一個(gè),試圖得到響應(yīng)。TCP在發(fā)出第一個(gè)探測(cè)分段后11分又15秒(75*9)內(nèi)沒(méi)有得到任何響應(yīng)則放棄。)習(xí)題2從原理上說(shuō),可以使用SO_REUSEADDR選項(xiàng)來(lái)保證客戶端立刻再次使用之前用過(guò)的端口。但是我們一般都不這么做,因?yàn)榭蛻舳瞬幌穹?wù)器那樣綁定在眾所周知的端口,客戶端發(fā)起連接時(shí),一般由內(nèi)核臨時(shí)分配一個(gè)端口,因此兩個(gè)不同的客戶端使用兩個(gè)不同的臨時(shí)端口。習(xí)題4參見(jiàn)程序5_4.c習(xí)題5參見(jiàn)程序5_5.c習(xí)題6參見(jiàn)程序5_6.c第6章 網(wǎng)絡(luò)協(xié)議習(xí)題2參見(jiàn)教材P194-P196介紹的函數(shù)append_data和msg_fragment的處理過(guò)程習(xí)題3參見(jiàn)教材P235-P237
14、介紹的函數(shù)msg_forward和append_frag_head的處理過(guò)程習(xí)題40xf9ca習(xí)題5在NAT環(huán)境下,通常不能使用FTP的主動(dòng)模式,除非NAT服務(wù)進(jìn)行專門的應(yīng)用層網(wǎng)關(guān)的設(shè)置,允許外網(wǎng)訪問(wèn)內(nèi)網(wǎng)習(xí)題7參見(jiàn)程序6_7c.c, 6_7s.c習(xí)題8對(duì)齊在4字節(jié)邊界第7章 ICMP協(xié)議程序設(shè)計(jì)習(xí)題1由7.2的分析我們知道,ICMP的查詢請(qǐng)求的應(yīng)答消息就是之前發(fā)送的ICMP查詢請(qǐng)求消息內(nèi)容的直接拷貝,也就是說(shuō)被ping的目的主機(jī)不對(duì)數(shù)據(jù)做任何處理。舉個(gè)例子來(lái)說(shuō),假設(shè)發(fā)送時(shí)的id字段內(nèi)容為a04c,sequence內(nèi)容字段為0001以下為數(shù)據(jù)發(fā)送過(guò)程中在內(nèi)存中的存儲(chǔ)方式。icmp中的數(shù): a04
15、c 0001小端機(jī)內(nèi)存: 4ca0 0100發(fā)送到對(duì)端大端機(jī)內(nèi)存: 4ca0 0100 (如果大端機(jī)要對(duì)數(shù)據(jù)處理,該數(shù)據(jù)則被解釋為4ca0 0100,但是此處不做任何處理,直接回射)回射到主機(jī) 小端機(jī)內(nèi)存: 4ca0 0100由此可見(jiàn),回射回來(lái)的值在內(nèi)存中的存儲(chǔ)方式?jīng)]有發(fā)生改變,其值仍是a04c 0001 因此程序的72行和73行對(duì)id和sequence字段進(jìn)行賦值時(shí)沒(méi)有進(jìn)行字節(jié)序的轉(zhuǎn)換。另外從校驗(yàn)和的角度來(lái)看,如果發(fā)送時(shí)進(jìn)行了字節(jié)序轉(zhuǎn)換,那么在接受時(shí),為了保證得到正確的校驗(yàn)和,也必須再轉(zhuǎn)換回來(lái)。所以,為了簡(jiǎn)單,不進(jìn)行轉(zhuǎn)換。習(xí)題2在填入檢驗(yàn)和之前對(duì)checksum字段進(jìn)行清零是必須的,因?yàn)槿舨?/p>
16、清零,則該字段中的值為一隨機(jī)值,發(fā)送數(shù)據(jù)方在進(jìn)行校驗(yàn)和計(jì)算的時(shí)候該值也被加入計(jì)算,因此其結(jié)果包含了未清零的那部分值。而接收方在接收到數(shù)據(jù)后進(jìn)行校驗(yàn)和的計(jì)算時(shí)不會(huì)包含該隨機(jī)值,因此其結(jié)果一般不會(huì)為負(fù)0,即一般都不會(huì)得到正確結(jié)果,除非清零前的值剛好為0。(其實(shí)最終checksum的結(jié)果為未清零前checksum字段值的反。但是該值是個(gè)隨機(jī)值,所以將無(wú)法進(jìn)行驗(yàn)證。)習(xí)題3為了很明顯地看到該處代碼被執(zhí)行,添加如下代碼/*156157行改為*/if(icmp-icmp_id!=pid) printf(icmp_id errnon); return -1;/*102行-103行*/if(handle_pkt() printf(handle_pkt errnon); continue;如果在程序執(zhí)行過(guò)程中,有打印以上兩句則可以驗(yàn)證return -1被執(zhí)行首先運(yùn)行系統(tǒng)自帶的ping程序,比如執(zhí)行如下命令:然后
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB 45186-2024限制快遞過(guò)度包裝要求
- PB-22-7-Hydroxyquinoline-isomer-生命科學(xué)試劑-MCE-6693
- 9-Keto-tafluprost-生命科學(xué)試劑-MCE-9653
- 二零二五年度未簽勞動(dòng)合同員工勞動(dòng)仲裁應(yīng)對(duì)與勞動(dòng)權(quán)益保障協(xié)議
- 2025年度文化創(chuàng)意產(chǎn)業(yè)計(jì)件工資與創(chuàng)意成果量化勞動(dòng)合同
- 2025年度二零二五年度化妝品銷售提成獎(jiǎng)勵(lì)合同
- 科技孵化器創(chuàng)新創(chuàng)業(yè)者的搖籃
- 跨學(xué)科視角下的小學(xué)生音樂(lè)素養(yǎng)培養(yǎng)研究
- 小學(xué)心理健康教育的實(shí)踐與思考
- 校園體育活動(dòng)安全與防護(hù)措施
- 全面解讀新能源法律風(fēng)險(xiǎn)與應(yīng)對(duì)措施
- 彩鋼瓦架子施工方案
- 民法學(xué)詳細(xì)教案
- 浙江省杭州市2023年中考一模語(yǔ)文試題及答案
- 上海市楊浦區(qū)2022屆初三中考二模英語(yǔ)試卷+答案
- 高中英語(yǔ)原版小說(shuō)整書(shū)閱讀指導(dǎo)《奇跡男孩》(wonder)-Part one 講義
- GB/T 4745-2012紡織品防水性能的檢測(cè)和評(píng)價(jià)沾水法
- 國(guó)家綜合性消防救援隊(duì)伍消防員管理規(guī)定
- 2023年全國(guó)各地高考英語(yǔ)試卷:完形填空匯編(9篇-含解析)
- 五年級(jí)上冊(cè)數(shù)學(xué)習(xí)題課件 簡(jiǎn)便計(jì)算專項(xiàng)整理 蘇教版 共21張
- 疼痛科的建立和建設(shè)
評(píng)論
0/150
提交評(píng)論