版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
插口選setsockopt和getsockopt系統(tǒng)調(diào)用已在第8.8節(jié)中介紹過(guò),主要描述IP特點(diǎn)的選項(xiàng)。在本章中,介紹這兩個(gè)系統(tǒng)調(diào)用的實(shí)現(xiàn)以及通過(guò)它們來(lái)控制的插口級(jí)選項(xiàng)。ioctl函數(shù)在第4.4節(jié)中已介紹過(guò),在第4.4節(jié)中,我們描述了用于網(wǎng)絡(luò)接口配置的與協(xié)議無(wú)關(guān)的ioctl命令。在第6.7節(jié)中,我們描述了用來(lái)分配網(wǎng)絡(luò)掩碼以及單播、多播和目的地址的的 命令。本章介紹 的實(shí)現(xiàn)和tl函數(shù)的相關(guān)特點(diǎn)。最后,我們介紹getsockname和getpeername系統(tǒng)調(diào)用,它們用來(lái)返回插口和連接的地址信息。
本章中涉及的源代碼來(lái)自于圖17-2文件 圖17-2圖8-29列出了函數(shù)setsockopt(和getsockopt)能夠的各種不同的協(xié)議層。本章主要集中在SOL_SOCKET級(jí)的選項(xiàng),這些選項(xiàng)在圖17-3optval SO_SNDBUSO_RCVBUSO_SNDLOWASO_RCVLOWASO_SNDTIMEstructtimevaSO_RCVTIMEstructtimevaSO_DEBUSO_REUSEADDSO_REUSEPORSO_KEEPALIVSO_DONTROUTSO_BROADCASSO_USELOOPBASO_OOBINLISO_LINGEstructlingerSO_SO_TYPintsetsockopt(ints,intlevel,intoptname,void*optval,int565-597返回插口描述符的結(jié)構(gòu)。如果非空,則將數(shù)據(jù)從進(jìn)程到用t分配的mbuf中。與選項(xiàng)對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度過(guò)N個(gè)字節(jié),所以,如果e大于,則返回。調(diào)用圖17-4(續(xù)圖17-5(續(xù)752-764如果選項(xiàng)不是插口級(jí)的(SOL_SOCKET)選項(xiàng),則給底層協(xié)議發(fā)送PRCO_SETOPT請(qǐng)求。注意:調(diào)用的是協(xié)議的pr_ctloutput函數(shù),而不是它的pr_usrreq函數(shù)。圖17-6說(shuō) 原始765switch841-844對(duì)于不認(rèn)識(shí)的選項(xiàng),在保存它的mbuf被釋放后返回ENOPROTOOPT845-855如果沒(méi)有出現(xiàn)差錯(cuò),則控制總是會(huì)執(zhí)行到switch。在switch語(yǔ)句中,如果協(xié)議層需要響應(yīng)請(qǐng)求或插口層,則將選項(xiàng)傳送給相應(yīng)的協(xié)議。Internet協(xié)議中沒(méi)有一個(gè)預(yù)期處理插口注意,如果協(xié)議收到不預(yù)期的選項(xiàng),則直接將其pr_ctloutput函數(shù)的返回值丟棄。并766-772linger選項(xiàng)要求進(jìn)程傳入lingerstructlingerint /*optionon/offintl_linger;/*lingertimeinseconds確保進(jìn)程已傳入長(zhǎng)度為linger結(jié)構(gòu)大小的數(shù)據(jù)后,將結(jié)構(gòu)成員l_linger到so_linger中。在下一組case語(yǔ)句后決定是使能還是關(guān)閉該選項(xiàng)。so_linger和close系統(tǒng)調(diào)用在第15.15節(jié)中已介紹過(guò)。773-789當(dāng)進(jìn)程傳入一個(gè)非0值時(shí),設(shè)置選項(xiàng)對(duì)應(yīng)的布爾標(biāo)志;當(dāng)進(jìn)程傳入的是0時(shí),將對(duì)應(yīng)標(biāo)志清除。第一次檢查確保一個(gè)整數(shù)大小(或更大)的對(duì)象在mbuf中,然后設(shè)置或清除對(duì)應(yīng)的790815if語(yǔ)句確保提供給四個(gè)選項(xiàng)816-824 進(jìn)程在timeval結(jié)構(gòu)中設(shè)置SO_SNDTIMEO和SO_RCVTIMEO選項(xiàng)的超時(shí)值。如果傳入的數(shù)值不正確,則返回EINVAL。825-830 在timeval結(jié)構(gòu)中的時(shí)間間隔值不能太大,因?yàn)閟b_timeo是一個(gè)短整數(shù),當(dāng)時(shí)間間隔值的單位為一個(gè)時(shí)鐘滴答時(shí),時(shí)間間隔值的大小就過(guò)一個(gè)短整數(shù)的最大值。
其中,ticck1000000hSHRT_MAXtv_usecSHRT_MAX
tick
100000等式的最后一項(xiàng)不是代碼指明的hzif(tv->tv_sec*hz+tv->tv_usec/tick>SHRT_MAX)831840valsb_timeo限制了進(jìn)程等待接收緩存中的數(shù)據(jù)或發(fā)送緩存中的閑置空間的時(shí)間。詳細(xì)討論參考第16.7和16.11節(jié)。 intgetsockopt(ints,intlevel,intname,caddr_tval,int該調(diào)用的源代碼如圖17-10598-633這段代碼現(xiàn)在看上去應(yīng)該很熟悉了。getsock獲取插口的file結(jié)構(gòu),將選項(xiàng)緩存的大小到內(nèi)核,調(diào)用sogetopt來(lái)獲取選項(xiàng)的值。將sogetopt返回的數(shù)據(jù)到進(jìn)程提供的緩存,可能還需修改緩存長(zhǎng)度。如果進(jìn)程提供的緩存不夠大,則返回的數(shù)據(jù)可能會(huì)被截掉。通常情況下,選項(xiàng)數(shù)據(jù)的mbuf在函數(shù)返回后被釋放。同sosetoptsogetopt函數(shù)處理所有插口級(jí)的選項(xiàng),并將其他的選項(xiàng)傳給與插口關(guān)聯(lián)的協(xié)議。圖17-1列出了sogetopt函數(shù)的開(kāi)始和結(jié)束部分的代碼。856-871同sosetopt一樣,函數(shù)將那些與插口級(jí)選項(xiàng)無(wú)關(guān)的選即通過(guò)PRCO_GETOPT協(xié)議請(qǐng)求傳遞給相應(yīng)的協(xié)議級(jí)。協(xié)議將被請(qǐng)求的選項(xiàng)保存在mp指向的mbuf中。對(duì)于插口級(jí)的選項(xiàng),分配一塊標(biāo)準(zhǔn)的mbuf緩存來(lái)保存選項(xiàng)值,選項(xiàng)值通常是一個(gè)整數(shù),所以將m_len設(shè)成整數(shù)大小。相應(yīng)的選項(xiàng)值通過(guò)switch語(yǔ)句到mbuf中918-925如果執(zhí)行的是switch中的default情況下的語(yǔ)句,則釋放mbuf,并返回ENOPROTOOPTswitch語(yǔ)句執(zhí)行完成后,將指向mbuf的指針賦給*mp。當(dāng)函數(shù)返回后,getsockopt從該mbuf將數(shù)據(jù)到進(jìn)提的緩存并放mbuf。872-877 SO_LINGER選項(xiàng)請(qǐng)求返回兩個(gè)值:一個(gè)是標(biāo)志值,賦給l_onoff;另一個(gè)是拖878-88 其余的選項(xiàng)作為布爾標(biāo)志實(shí)現(xiàn)。將so_options和optname00。注意:標(biāo)志被打開(kāi)并不表示返回值sogetopt的下一部分代碼(圖17-13)將整型值選項(xiàng)的值到mbuf中888-906將每一個(gè)選項(xiàng)作為一個(gè)整數(shù)到mbuf中。注意:有些選項(xiàng)在內(nèi)核中是作為一個(gè)短整數(shù)的(如緩存高低水位標(biāo)記),但是作為整數(shù)返回。一旦將so_error到mbuf中90791 將發(fā)送或接收緩存中的sb_timeo值賦給var?;趘almbuf中構(gòu)造一個(gè)timeval計(jì)算tv_usec"(val%h)*tick" 。關(guān)于ioctl命令,我們已經(jīng)討論了很多。我們也幾次提到fcntl。 intioctl(intfd,unsignedlongresult,char*argp);intfcntl(intfd,intcmd,.../*intarg*/);圖17-16總結(jié)了這兩個(gè)系統(tǒng)調(diào)用與插口有關(guān)的特點(diǎn)。我們?cè)趫D17-16中還列出了一些傳統(tǒng)的 通過(guò)打開(kāi)或關(guān)閉sb_flags中的 列出 圖17-17fcntl133-153驗(yàn)證完指向打開(kāi)文件的描述符的正確性后,switch語(yǔ)句處理請(qǐng)求令253-257對(duì)于不認(rèn)識(shí)令,fcntl返回EINVAL。 168-185F_GETFLF_SETFL設(shè)置狀態(tài)標(biāo)志。通過(guò)調(diào)用fo_ioctl將FNONBLOCK和FASYNC的新設(shè)置傳遞給對(duì)應(yīng)的插口,而插口的新設(shè)置是通過(guò)圖17-20中描述的soo_ioctl函數(shù)來(lái)傳遞的。只有在第二個(gè)fo_ioctl調(diào)用失敗后,才第三次調(diào)用fo_ioctl。該調(diào)用的功能是清除FNONBLOCK標(biāo)志,但是應(yīng)該改為將這個(gè)標(biāo)志恢復(fù)186-194F_GETOWN返回與插口相關(guān)聯(lián)的進(jìn)程或進(jìn)程組的標(biāo)識(shí)符,so_pgid。對(duì)于非插口描述符,將TIOCGPGRPioctfo_ioctl函數(shù)。F_SETOWN的功能是給我們跳過(guò)ioctl系統(tǒng)調(diào)用本身而先從soo_ioctl開(kāi)始討論,如圖17-20所示,因?yàn)閕octl的代碼中的大部分是從圖17-17所代中。已經(jīng),soo_ioctl函數(shù)將選路命令發(fā)送給rtioctl,接口命令發(fā)送給ifioctl,任何其他令發(fā)送給底層協(xié)議的pr_usrreq函數(shù)。55-68 有幾個(gè)命令是由soo_ioctl直接處理的。如果*data空,則FIONBIO開(kāi)非阻塞方式,否則關(guān)閉非阻塞方式。正于我們已經(jīng)了解的,這個(gè)標(biāo)志將影響到 acceptconnect和close系統(tǒng)調(diào)用,也包括其他的讀和寫(xiě)系統(tǒng)調(diào)用。69-79 FIOASYNC使能或異步I/O通知功能。如果設(shè)置了SS_ASYNC,則無(wú)論什么時(shí)候插口上有活動(dòng),就調(diào)用sowakeup,將信號(hào)SIGIO發(fā)送給相應(yīng)的進(jìn)程或進(jìn)程組。80-88FIONREAD返回接收緩存中的可讀字節(jié)數(shù)。SIOCSPGRP設(shè)置與插口相關(guān)的進(jìn)程組,SIOCGPGRPso_pgidSIGIO信號(hào)的目標(biāo)進(jìn)程或進(jìn)程組,當(dāng)89-92如果插口正處于帶外數(shù)據(jù)的同步標(biāo)記,則SIOCATMARK返回真;否則返回假。ioctl命令,F(xiàn)IOxxx和SIOxxx常量,有一個(gè)內(nèi)部結(jié)構(gòu),如圖17-19所示???qǐng)D17-19ioctl圖17-20(續(xù)宏 返回cmd中的lengthlength設(shè)為0令如果將ioctl的第三個(gè)參數(shù)作為輸入,則設(shè)置input。如果該參數(shù)作為輸出,則output被置位。如果不用該參數(shù),則 void被置位。length是參數(shù)的大小(字節(jié))。相關(guān)宏 返回cmd中的lengthlength設(shè)為0令
圖17-21ioctl93104宏IOCGROUP從命令中得到8bit的group。接口命令由ifioctl正如我們?cè)诘?9,Net2定義了一個(gè)新的路由選擇表接口,在該接口中,報(bào)文是通過(guò)一個(gè)在E域中產(chǎn)生的插口傳遞給路由選擇子系統(tǒng)。用這種方法來(lái)代替這里討論的總是返回。intgetsockname(intfd,caddr_tasa,int*getsockname得到綁定在插口fd上的本地地址,并將它存入asa指向的緩存中。當(dāng)在一bind調(diào)用中進(jìn)程指定了一個(gè)通配符地址682-715getsock返回描述符的file結(jié)構(gòu)。將進(jìn)程指定的緩存的長(zhǎng)度賦給len。這是我們第一次看到對(duì)m_getclr的調(diào)用:該函數(shù)分配一個(gè)標(biāo)準(zhǔn)的mbuf,并調(diào)用bzero。當(dāng)協(xié)議收到PRU_SOCKADDRm。如果地址長(zhǎng)度大于進(jìn)程提供的緩存的長(zhǎng)度,則返回的地址將被截掉。*alen等于實(shí)際返回intgetpeername(intfd,caddr_tasa,int*getpeernameaccept的進(jìn)程通過(guò)fork和exec啟動(dòng)一個(gè)服務(wù)器時(shí)(即,任何被inetd啟動(dòng)的服務(wù)器),經(jīng)常要調(diào)用這個(gè)函數(shù)。服務(wù)器不能得到acceptgetpeername。通常,要在應(yīng)用的訪問(wèn)地址表查找返回地址,如果返回地址不在表中,則連接將被關(guān)閉。某些協(xié)議,如TP4,利用這個(gè)函數(shù)來(lái)確定是否或證實(shí)一個(gè)進(jìn)入的連接。在 TP4中,accept返回的插口上的連接是不完整的,必須經(jīng)證實(shí)之后才算連接成功?;趃etpeername返回的地址,服務(wù)器能夠關(guān)閉連接或通過(guò)發(fā)送或接收數(shù)據(jù)來(lái)間接證實(shí)連接。這一特點(diǎn)與TCP無(wú)關(guān),因?yàn)門(mén)CP必須在三次握手完成之后,accept才能建立連接。圖17-23列出了getpeername函數(shù)的代碼。719-753圖中列出的代碼與getsockname的代碼是一樣的。getsock獲取插口對(duì)應(yīng)的file結(jié)構(gòu),如果插口還沒(méi)有同對(duì)方建立連接或連接還沒(méi)有證實(shí)(如,TP4),則返回ENOTCONN。如果已建立連接,則從進(jìn)程那里得到緩存的大小,并分配一塊 mbuf來(lái)地址。發(fā)送PRU_PEE
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度專業(yè)籃球館場(chǎng)地租賃合同3篇
- 2024年茶館經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同3篇
- 2025版戶外廣告安裝與戶外廣告策劃、設(shè)計(jì)、安裝與廣告效果監(jiān)測(cè)合同3篇
- 2024年軟件開(kāi)發(fā)外包合同
- 2025年度消防安全培訓(xùn)與服務(wù)合同3篇
- 2024版房屋建筑工程承包合同范本
- 2025年度海綿城市排水系統(tǒng)工程質(zhì)量監(jiān)管協(xié)議3篇
- 2025年度版權(quán)代理合同:作者與版權(quán)代理公司之間的版權(quán)代理協(xié)議3篇
- 2025園林工程合同范本
- 2024年金融產(chǎn)品銷售代理框架3篇
- 寵物養(yǎng)護(hù)與經(jīng)營(yíng)專業(yè)《寵物解剖生理》課程標(biāo)準(zhǔn)
- 滬教2011課標(biāo)版三年級(jí)起點(diǎn)五年級(jí)下冊(cè)《Buying Clothes》說(shuō)課稿
- 幼兒園教職工教代會(huì)會(huì)議記錄
- 車輛移交安全協(xié)議書(shū)
- 《涑水記聞》2021年江蘇鎮(zhèn)江中考文言文閱讀真題(含答案與翻譯)
- 家庭家教家風(fēng)·家庭美德·文明家庭主題班會(huì)
- 廬山云霧閱讀答案千姿百態(tài)
- 個(gè)人營(yíng)業(yè)執(zhí)照注銷委托書(shū)范文
- 影像敘事語(yǔ)言智慧樹(shù)知到答案章節(jié)測(cè)試2023年中國(guó)傳媒大學(xué)
- 鋼筋工具箱實(shí)訓(xùn)任務(wù)指導(dǎo)課件項(xiàng)目三整體框架角柱構(gòu)造
- 流體力學(xué)(清華大學(xué)張兆順54講) PPT課件 1
評(píng)論
0/150
提交評(píng)論