unixos教學(xué)課件第九章 unix網(wǎng)絡(luò)程序設(shè)計(jì)_第1頁(yè)
unixos教學(xué)課件第九章 unix網(wǎng)絡(luò)程序設(shè)計(jì)_第2頁(yè)
unixos教學(xué)課件第九章 unix網(wǎng)絡(luò)程序設(shè)計(jì)_第3頁(yè)
unixos教學(xué)課件第九章 unix網(wǎng)絡(luò)程序設(shè)計(jì)_第4頁(yè)
unixos教學(xué)課件第九章 unix網(wǎng)絡(luò)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩111頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第13章章 unix網(wǎng)絡(luò)程序設(shè)計(jì)網(wǎng)絡(luò)程序設(shè)計(jì)v掌握:網(wǎng)絡(luò)體系結(jié)構(gòu)、地址標(biāo)識(shí)等基礎(chǔ)掌握:網(wǎng)絡(luò)體系結(jié)構(gòu)、地址標(biāo)識(shí)等基礎(chǔ)v理解:套接字的基本功能和作用理解:套接字的基本功能和作用v掌握:基本的套接字函數(shù)編程方法掌握:基本的套接字函數(shù)編程方法v掌握:客戶端程序設(shè)計(jì)方法掌握:客戶端程序設(shè)計(jì)方法v掌握:并行服務(wù)器程序的設(shè)計(jì)方法掌握:并行服務(wù)器程序的設(shè)計(jì)方法v通信子網(wǎng)通信子網(wǎng) 信息傳輸控制信息傳輸控制 信息流量控制信息流量控制 信息傳遞路徑控制信息傳遞路徑控制v資源子網(wǎng)資源子網(wǎng) 軟件信息和數(shù)據(jù)信息的共享軟件信息和數(shù)據(jù)信息的共享 硬件資源的共享硬件資源的共享 負(fù)載均衡的管理負(fù)載均衡的管理v計(jì)算機(jī)網(wǎng)絡(luò):把分布

2、計(jì)算機(jī)網(wǎng)絡(luò):把分布在不同地理位置上的,在不同地理位置上的,具有具有獨(dú)立功能的獨(dú)立功能的,用,用連接起來(lái),連接起來(lái),再配以相應(yīng)的再配以相應(yīng)的,以實(shí)現(xiàn)計(jì)算機(jī),以實(shí)現(xiàn)計(jì)算機(jī)。應(yīng)用層表示層會(huì)話層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層物理層應(yīng)用層ipv4, ipv6網(wǎng)絡(luò)介質(zhì)層tcpudposi模型tcp/ip模型ftp客戶tcpip以太網(wǎng)驅(qū)動(dòng)程序ftp服務(wù)器tcpip以太網(wǎng)驅(qū)動(dòng)程序以太網(wǎng)驅(qū)動(dòng)程序以太網(wǎng)驅(qū)動(dòng)程序ipftp協(xié)議tcp協(xié)議ip協(xié)議ip協(xié)議以太網(wǎng)客戶服務(wù)器用戶數(shù)據(jù)用戶數(shù)據(jù)app頭部用戶數(shù)據(jù)tcp頭部用戶數(shù)據(jù)tcp頭部ip頭部用戶數(shù)據(jù)tcp頭部ip頭部以太網(wǎng)頭部以太網(wǎng)尾部以太網(wǎng)幀401500字節(jié)ftp客戶tcpi

3、p以太網(wǎng)驅(qū)動(dòng)程序tcp段ip分組掌握掌握ip地址與域名地址的關(guān)系地址與域名地址的關(guān)系v48位:位:24位位oui,24位由廠商分配位由廠商分配v平面地址,無(wú)結(jié)構(gòu)平面地址,無(wú)結(jié)構(gòu)v全球唯一全球唯一v局部范圍尋址局部范圍尋址v存在于數(shù)據(jù)鏈路層存在于數(shù)據(jù)鏈路層局域網(wǎng)中,各個(gè)主機(jī)是以局域網(wǎng)中,各個(gè)主機(jī)是以mac地址進(jìn)行數(shù)據(jù)遞交地址進(jìn)行數(shù)據(jù)遞交v ip地址標(biāo)識(shí)著網(wǎng)絡(luò)一個(gè)主機(jī)的位置。每個(gè)地址標(biāo)識(shí)著網(wǎng)絡(luò)一個(gè)主機(jī)的位置。每個(gè)ip地址都是由地址都是由32位(或位(或128位)組成,分成兩部分:網(wǎng)絡(luò)號(hào)、主機(jī)號(hào)。位)組成,分成兩部分:網(wǎng)絡(luò)號(hào)、主機(jī)號(hào)。全球唯一,尋址容易全球唯一,尋址容易兩種表示形式:二進(jìn)制(計(jì)算機(jī)內(nèi)

4、部)、兩種表示形式:二進(jìn)制(計(jì)算機(jī)內(nèi)部)、點(diǎn)分十進(jìn)制點(diǎn)分十進(jìn)制a類(lèi)地址a類(lèi)地址18162432b類(lèi)地址b類(lèi)地址c類(lèi)地址c類(lèi)地址d類(lèi)地址d類(lèi)地址e類(lèi)地址e類(lèi)地址主機(jī)地址范圍到到5555到到5555到到5555到到5555到

5、到55550網(wǎng)絡(luò)地址(7 位 )主機(jī)地址(2 4 位)10網(wǎng)絡(luò)地址(1 4 位)主機(jī)地址(1 6 位)110網(wǎng)絡(luò)地址(2 1 位)主機(jī)地址(8 位 )1110多目的廣播地址(2 8 位)11110保留用于實(shí)驗(yàn)和將來(lái)使用processprocessprocessprocessprocessprocessip地址平面vtcp和和udp使用使用16位的端口號(hào)(用無(wú)符號(hào)整型表位的端口號(hào)(用無(wú)符號(hào)整型表示)示)v為防止端口使用的混亂,將端口分為以下三類(lèi):為防止端口使用的混亂,將端口分為以下三類(lèi):“ “眾所周知眾所周知”的端口:的端口:01023,由,由

6、iana統(tǒng)一統(tǒng)一控制控制 注冊(cè)的端口:注冊(cè)的端口:102449151,這些端口雖不由,這些端口雖不由iana控制,但控制,但iana登記這些端口的使用登記這些端口的使用 動(dòng)態(tài)或私有的端口:動(dòng)態(tài)或私有的端口:4915265535v層次名字空間層次名字空間v便于記憶和使用便于記憶和使用v計(jì)算機(jī)通信時(shí)無(wú)法使用計(jì)算機(jī)通信時(shí)無(wú)法使用v域名地址解析:域名地址解析: 名字到名字到ip地址的解析(地址的解析(gethostbyname) ip地址到域名的解析(地址到域名的解析(gethostbyaddr)v網(wǎng)絡(luò)中通信雙方由以下五元組唯一確定:網(wǎng)絡(luò)中通信雙方由以下五元組唯一確定:( 本地(本地ip地址、本地端口

7、號(hào)、遠(yuǎn)程地址、本地端口號(hào)、遠(yuǎn)程ip地址、遠(yuǎn)程地址、遠(yuǎn)程端口號(hào)、協(xié)議類(lèi)型)端口號(hào)、協(xié)議類(lèi)型)vudp:用戶數(shù)據(jù)報(bào)協(xié)議:用戶數(shù)據(jù)報(bào)協(xié)議 udp提供無(wú)連接服務(wù)提供無(wú)連接服務(wù) udp缺乏可靠性支持,應(yīng)用程序必須實(shí)現(xiàn)確缺乏可靠性支持,應(yīng)用程序必須實(shí)現(xiàn)確認(rèn)、超時(shí)、重傳、流控等功能認(rèn)、超時(shí)、重傳、流控等功能 udp面向記錄服務(wù)面向記錄服務(wù)源端口目的端口長(zhǎng)度校驗(yàn)和數(shù)據(jù)01531#ifdef _favor_bsdstruct udphdr u_int16_t uh_sport; /* source port */ u_int16_t uh_dport; /* destination port */ u_int1

8、6_t uh_ulen; /* udp length */ u_int16_t uh_sum; /* udp checksum */;#elsestruct udphdr u_int16_t source; u_int16_t dest; u_int16_t len; u_int16_t check;#endifvtcp:傳輸控制協(xié)議:傳輸控制協(xié)議hlen窗口序列號(hào)確認(rèn)號(hào)源端口目的端口保留碼位校驗(yàn)和緊急指針選項(xiàng)填充字節(jié)數(shù)據(jù)urgackpshrstsynfin015317首部數(shù)據(jù)區(qū)struct tcphdr word sourport;word destport;dword seqno;dwor

9、d ackno;byte hlen;byte flag;word window;word chksum;word urgptr;/* put options here. */; vtcp連接的過(guò)程:連接的過(guò)程:n服務(wù)器必須準(zhǔn)備好接受外來(lái)的連接。通過(guò)調(diào)用服務(wù)器必須準(zhǔn)備好接受外來(lái)的連接。通過(guò)調(diào)用socket, bind, listen函數(shù)完成。稱為函數(shù)完成。稱為被動(dòng)打開(kāi)被動(dòng)打開(kāi)。n客戶通過(guò)調(diào)用客戶通過(guò)調(diào)用connect進(jìn)行主動(dòng)打開(kāi)。這引起客戶進(jìn)行主動(dòng)打開(kāi)。這引起客戶tcp發(fā)送一個(gè)發(fā)送一個(gè)syn分組,告訴分組,告訴客戶將在連客戶將在連接中發(fā)送的數(shù)據(jù)的初始序列號(hào)。接中發(fā)送的數(shù)據(jù)的初始序列號(hào)。n服務(wù)器必

10、須確認(rèn)客戶的服務(wù)器必須確認(rèn)客戶的syn,同時(shí)自己也得發(fā)送,同時(shí)自己也得發(fā)送一個(gè)一個(gè)syn分組。服務(wù)器以單個(gè)分節(jié)向客戶發(fā)送分組。服務(wù)器以單個(gè)分節(jié)向客戶發(fā)送syn和對(duì)客戶的和對(duì)客戶的syn的的ack。n客戶必須確認(rèn)服務(wù)器的客戶必須確認(rèn)服務(wù)器的syn。客戶服務(wù)器socketconnect(阻塞)(主動(dòng)打開(kāi))socket,bind,listen(被動(dòng)打開(kāi))syn jsyn k, ack j+1ack k+1accept返回read阻塞connect返回客戶客戶服務(wù)器服務(wù)器close主動(dòng)關(guān)閉主動(dòng)關(guān)閉被動(dòng)關(guān)閉被動(dòng)關(guān)閉read返回返回0fin mack n+1closeack m+1fin nv系統(tǒng)調(diào)用:應(yīng)

11、用程序和操作系統(tǒng)傳遞控制權(quán)系統(tǒng)調(diào)用:應(yīng)用程序和操作系統(tǒng)傳遞控制權(quán)(函數(shù)調(diào)用)(函數(shù)調(diào)用) 目的是從操作系統(tǒng)獲得服務(wù)目的是從操作系統(tǒng)獲得服務(wù) 一定的權(quán)限控制一定的權(quán)限控制應(yīng)用程序應(yīng)用程序1包括包括tcp/ip協(xié)議軟件的操作系統(tǒng)內(nèi)核協(xié)議軟件的操作系統(tǒng)內(nèi)核應(yīng)用程序應(yīng)用程序2應(yīng)用程序應(yīng)用程序3在用戶地址空間在用戶地址空間中的應(yīng)用程序中的應(yīng)用程序系統(tǒng)調(diào)用接口系統(tǒng)調(diào)用接口系統(tǒng)地址中的協(xié)系統(tǒng)地址中的協(xié)議軟件議軟件v使用新的系統(tǒng)調(diào)用來(lái)訪問(wèn)使用新的系統(tǒng)調(diào)用來(lái)訪問(wèn)tcp/ip 對(duì)于每個(gè)概念性的操作實(shí)現(xiàn)一個(gè)系統(tǒng)調(diào)用對(duì)于每個(gè)概念性的操作實(shí)現(xiàn)一個(gè)系統(tǒng)調(diào)用 創(chuàng)建新的系統(tǒng)調(diào)用并不明智創(chuàng)建新的系統(tǒng)調(diào)用并不明智v使用一般的使用

12、一般的i/o調(diào)用來(lái)訪問(wèn)調(diào)用來(lái)訪問(wèn)tcp/ip 使用一般的使用一般的i/o調(diào)用,但是進(jìn)行了擴(kuò)充,既可以用調(diào)用,但是進(jìn)行了擴(kuò)充,既可以用于于i/o,又可以用于網(wǎng)絡(luò)協(xié)議,又可以用于網(wǎng)絡(luò)協(xié)議v混合方法混合方法 盡可能使用基本的盡可能使用基本的i/o功能功能 增加一些函數(shù)來(lái)實(shí)現(xiàn)其它操作增加一些函數(shù)來(lái)實(shí)現(xiàn)其它操作v理解基本理解基本i/o如何擴(kuò)展功能,六個(gè)基本的系統(tǒng)函如何擴(kuò)展功能,六個(gè)基本的系統(tǒng)函數(shù):數(shù):操作操作含義含義openclosereadwritelseekioctl為輸入或輸出操作準(zhǔn)備一個(gè)設(shè)備或者文件為輸入或輸出操作準(zhǔn)備一個(gè)設(shè)備或者文件終止使用以前已打開(kāi)的設(shè)備或者文件終止使用以前已打開(kāi)的設(shè)備或者文

13、件從輸入設(shè)備或者文件中得到數(shù)據(jù)從輸入設(shè)備或者文件中得到數(shù)據(jù)數(shù)據(jù)從應(yīng)用程序存儲(chǔ)器傳到設(shè)備或文件中數(shù)據(jù)從應(yīng)用程序存儲(chǔ)器傳到設(shè)備或文件中轉(zhuǎn)到文件或者設(shè)備中的某個(gè)指定位置轉(zhuǎn)到文件或者設(shè)備中的某個(gè)指定位置控制設(shè)備或者用于訪問(wèn)該設(shè)備的軟件控制設(shè)備或者用于訪問(wèn)該設(shè)備的軟件int descdesc=open(“filename”, o_rdwr, 0)read(desc,buffer,128)close(desc)v擴(kuò)展文件描述符:可以用于網(wǎng)絡(luò)通信擴(kuò)展文件描述符:可以用于網(wǎng)絡(luò)通信v擴(kuò)展擴(kuò)展read和和write:可以用于網(wǎng)絡(luò)接收:可以用于網(wǎng)絡(luò)接收/發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)v額外功能的處理,增加新系統(tǒng)調(diào)用:額外功能的處

14、理,增加新系統(tǒng)調(diào)用: 指明本地和遠(yuǎn)端的端口,遠(yuǎn)程指明本地和遠(yuǎn)端的端口,遠(yuǎn)程ip地址地址 使用使用tcp還是還是udp 啟動(dòng)傳輸還是等待傳入連接啟動(dòng)傳輸還是等待傳入連接 可以接受多少傳入連接可以接受多少傳入連接vtcp/ip協(xié)議存在于協(xié)議存在于os中,網(wǎng)絡(luò)服務(wù)通過(guò)中,網(wǎng)絡(luò)服務(wù)通過(guò)os提供提供v在在os中增加支持中增加支持tcp/ip的的系統(tǒng)調(diào)用系統(tǒng)調(diào)用berkeley套接字套接字v如如socket,connect,send,recv等函數(shù)等函數(shù)v1981提出提出bsd4.1 unix,本書(shū)基于,本書(shū)基于bsd4.4 版本版本processtcp withbuffers,variablessock

15、et由應(yīng)用程序由應(yīng)用程序開(kāi)發(fā)者控制開(kāi)發(fā)者控制由操作系統(tǒng)控制由操作系統(tǒng)控制host orserverprocesstcp withbuffers,variablessocketcontrolled byapplicationdevelopercontrolled byoperatingsystemhost orserverinternetv來(lái)自來(lái)自u(píng)nix系統(tǒng)系統(tǒng)vberkeley套接字套接字 arpa要求伯克利分校將要求伯克利分校將tcp/ip移植到移植到unix中中 需要?jiǎng)?chuàng)建一個(gè)接口,便于應(yīng)用程序使用這個(gè)接口需要?jiǎng)?chuàng)建一個(gè)接口,便于應(yīng)用程序使用這個(gè)接口 進(jìn)行網(wǎng)絡(luò)通信進(jìn)行網(wǎng)絡(luò)通信 盡可能使用現(xiàn)有

16、的系統(tǒng)調(diào)用,同時(shí)添加新的系統(tǒng)盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,同時(shí)添加新的系統(tǒng)調(diào)用支持調(diào)用支持tcp/ip 這個(gè)系統(tǒng)被稱為這個(gè)系統(tǒng)被稱為bsd unix 套接字,成為事實(shí)上套接字,成為事實(shí)上的標(biāo)準(zhǔn)的標(biāo)準(zhǔn)v考慮:接口是專門(mén)針對(duì)考慮:接口是專門(mén)針對(duì)tcp/ip, 還是可以為其它還是可以為其它協(xié)議所用呢協(xié)議所用呢? 方法一:定義專門(mén)支持方法一:定義專門(mén)支持tcp/ip通信的一些函數(shù)通信的一些函數(shù) 方法二:定義支持一般網(wǎng)絡(luò)通信的函數(shù),用參數(shù)是方法二:定義支持一般網(wǎng)絡(luò)通信的函數(shù),用參數(shù)是tcp/ip通信作為一種特例通信作為一種特例 berkeley套接字使用第二種辦法,具有通用性,套接字使用第二種辦法,具有通用

17、性,tcp/ip是一個(gè)族是一個(gè)族 pf_inetv爭(zhēng)論:爭(zhēng)論: 通用性沒(méi)有必要,使應(yīng)用程序難以閱讀通用性沒(méi)有必要,使應(yīng)用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)vos將文件描述符實(shí)現(xiàn)為一個(gè)指針數(shù)組,指向一將文件描述符實(shí)現(xiàn)為一個(gè)指針數(shù)組,指向一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu):進(jìn)程描述符表的下標(biāo)個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu):進(jìn)程描述符表的下標(biāo)v套接字和文件類(lèi)似,每個(gè)活動(dòng)套接字使用一個(gè)套接字和文件類(lèi)似,每個(gè)活動(dòng)套接字使用一個(gè)小整數(shù)標(biāo)識(shí),進(jìn)程的文件描述符和套接字描述小整數(shù)標(biāo)識(shí),進(jìn)程的文件描述符和套接字描述符值不能相同符值不能相同vsocket函數(shù):創(chuàng)建套接字描述符(不是函數(shù):創(chuàng)

18、建套接字描述符(不是creat函函數(shù))數(shù))0:1:2:3: 進(jìn)程的文件描述符表進(jìn)程的文件描述符表用于文件用于文件0的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文件1的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文件2的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文件3的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(一個(gè)進(jìn)程一張表)(一個(gè)進(jìn)程一張表)v調(diào)用調(diào)用socket將創(chuàng)建一個(gè)新的描述符條目將創(chuàng)建一個(gè)新的描述符條目v結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來(lái)填結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來(lái)填0:1:2:3:4: 描述符表描述符表(一個(gè)進(jìn)程一張)(一個(gè)進(jìn)程一張)family: pf_inetservice: sock_streamlo

19、cal ip:remote ip:local port:remote port:v創(chuàng)建方式相同,使用方式不同創(chuàng)建方式相同,使用方式不同v等待傳入連接的套接字等待傳入連接的套接字被動(dòng)被動(dòng),如服務(wù)器套接字如服務(wù)器套接字v發(fā)起連接的套接字發(fā)起連接的套接字主動(dòng)主動(dòng),如客戶套接字如客戶套接字v指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指明指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指明tcp/ip需要指明協(xié)議端口號(hào)和需要指明協(xié)議端口號(hào)和ip地址地址tcp/ip協(xié)議族:協(xié)議族:pf_inettcp/ip的地址族:的地址族:af_inetv套接字系統(tǒng)定義的一般化的地址結(jié)構(gòu)套接字系統(tǒng)定義的一般化的地址結(jié)構(gòu)( 地址族,該族的端點(diǎn)

20、地址)(地址族,該族的端點(diǎn)地址)套接字的普通套接字的普通c定義結(jié)定義結(jié)構(gòu)構(gòu)struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;/14b通用的地址結(jié)構(gòu)(只是很通用的地址結(jié)構(gòu)(只是很適用于適用于af_inet族中的地族中的地址)址)tcp/ip的地址定義的地址定義struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2bstruct in_addr sin_addr;/4bchar sin_zero8;/8b未使用未使用 ip專用的結(jié)構(gòu)專

21、用的結(jié)構(gòu)v套接字調(diào)用分為兩組:套接字調(diào)用分為兩組:主調(diào)用:提供對(duì)下層功能的訪問(wèn)主調(diào)用:提供對(duì)下層功能的訪問(wèn)實(shí)用例程:提供幫助實(shí)用例程:提供幫助v套接字帶有參數(shù),允許以多種方式來(lái)使用它們。套接字帶有參數(shù),允許以多種方式來(lái)使用它們。 可被客戶或服務(wù)器使用可被客戶或服務(wù)器使用 可被可被tcp或或udp使用使用 可被特定或非特定的遠(yuǎn)程端點(diǎn)地址所使用可被特定或非特定的遠(yuǎn)程端點(diǎn)地址所使用v功能:功能:創(chuàng)建一個(gè)新的套接字,返回套接字描述符創(chuàng)建一個(gè)新的套接字,返回套接字描述符v參數(shù)說(shuō)明:參數(shù)說(shuō)明: domain:域類(lèi)型,指明使用的協(xié)議棧,如:域類(lèi)型,指明使用的協(xié)議棧,如tcp/ip使用的是使用的是 pf_in

22、et; type: 指明需要的服務(wù)類(lèi)型:指明需要的服務(wù)類(lèi)型: sock_dgram: 數(shù)據(jù)報(bào)服務(wù),數(shù)據(jù)報(bào)服務(wù),udp協(xié)協(xié) sock_stream: 流服務(wù),流服務(wù),tcp協(xié)議協(xié)議 protocol:一般都取一般都取0舉例:舉例:int socket( int domain, int type, int protocol)v功能:功能: 同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)返回同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)返回0,若連接失敗返回,若連接失敗返回-1。v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 server_addr:指明遠(yuǎn)程端點(diǎn):指明

23、遠(yuǎn)程端點(diǎn):ip地址和端口號(hào)地址和端口號(hào) sockaddr_len :地址長(zhǎng)度地址長(zhǎng)度舉例舉例:int connect(int sockfd, struct sockaddr *server_addr, int sockaddr_len)v功能:功能: 在在tcp連接上發(fā)送數(shù)據(jù)連接上發(fā)送數(shù)據(jù),返回成功傳送數(shù)據(jù)的長(zhǎng)度,出返回成功傳送數(shù)據(jù)的長(zhǎng)度,出錯(cuò)時(shí)返回錯(cuò)時(shí)返回-1。 send會(huì)將外發(fā)數(shù)據(jù)復(fù)制到會(huì)將外發(fā)數(shù)據(jù)復(fù)制到os內(nèi)核中,也可以使用內(nèi)核中,也可以使用send發(fā)送面向連接的發(fā)送面向連接的udp報(bào)文。報(bào)文。v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符套接字描述符 data:指向要發(fā)送數(shù)據(jù)的指針

24、指向要發(fā)送數(shù)據(jù)的指針 data_len:數(shù)據(jù)長(zhǎng)度數(shù)據(jù)長(zhǎng)度 flags:一直為一直為0舉例舉例int send(int sockfd, const void * data, int data_len, unsigned int flags)v功能:基于功能:基于udp發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)返回長(zhǎng)度,出錯(cuò)時(shí)返回-1v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符套接字描述符 data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針 data_len:數(shù)據(jù)長(zhǎng)度數(shù)據(jù)長(zhǎng)度 flags:一直為一直為0 remaddr:遠(yuǎn)端地址:遠(yuǎn)端地址:ip地址和端口號(hào)地址和

25、端口號(hào) remaddr_len :地址長(zhǎng)度地址長(zhǎng)度舉例:舉例:sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address, sizeof(address);int sendto(int sockfd, const void * data, int data_len, unsigned int flags, struct sockaddr *remaddr,int remaddr_len)v 功能:功能: 從從tcp接收數(shù)據(jù),返回實(shí)際接收的數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)接收數(shù)據(jù),返回實(shí)際接收的數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)返回返回-1。如果沒(méi)有數(shù)據(jù),將阻塞

26、。如果沒(méi)有數(shù)據(jù),將阻塞,如果收到的數(shù)據(jù)大如果收到的數(shù)據(jù)大于緩存的大小,多余的數(shù)據(jù)將丟棄。于緩存的大小,多余的數(shù)據(jù)將丟棄。v 參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符套接字描述符 buf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針 buf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位 flags:一般為一般為0 舉例:舉例:int recv(int sockfd, void *buf, int buf_len,unsigned int flags);v 功能:從功能:從udp接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)返回返回-1.v 參數(shù)說(shuō)明:參數(shù)說(shuō)明

27、: sockfd:套接字描述符套接字描述符 buf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針 buf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位 flags:一般為一般為0 from:遠(yuǎn)端的地址,遠(yuǎn)端的地址,ip地址和端口號(hào)地址和端口號(hào) fromlen:遠(yuǎn)端地址長(zhǎng)度遠(yuǎn)端地址長(zhǎng)度舉例:舉例:recvfrom(sockfd, buf, 8192, 0, (struct sockaddr *)&address, sizeof(address); int recvfrom(int sockfd, void *buf, int buf_len, unsigned int flags, st

28、ruct sockaddr *from, int fromlen)v功能:功能: 撤銷(xiāo)套接字撤銷(xiāo)套接字; 如果只有一個(gè)進(jìn)程使用,立即終止連接并撤銷(xiāo)如果只有一個(gè)進(jìn)程使用,立即終止連接并撤銷(xiāo)該套接字,如果多個(gè)進(jìn)程共享該套接字,將引該套接字,如果多個(gè)進(jìn)程共享該套接字,將引用數(shù)減一,如果引用數(shù)降到零,則撤銷(xiāo)它。用數(shù)減一,如果引用數(shù)降到零,則撤銷(xiāo)它。v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符套接字描述符舉例:舉例:close(socket_descriptor)int close (int sockfd)int bind(int sockfd, struct sockaddr * my_addr

29、, int addrlen)v功能:為套接字指明一個(gè)本地端點(diǎn)地址功能:為套接字指明一個(gè)本地端點(diǎn)地址 tcp/ip協(xié)議使用協(xié)議使用sockaddr_in結(jié)構(gòu),包含結(jié)構(gòu),包含ip地址和端地址和端口號(hào);服務(wù)器使用它來(lái)指明熟知的端口號(hào),然后等口號(hào);服務(wù)器使用它來(lái)指明熟知的端口號(hào),然后等待連接。待連接。v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 my_addr:本地地址,本地地址,ip地址和端口號(hào)地址和端口號(hào) addrlen :地址長(zhǎng)度地址長(zhǎng)度v舉例:舉例:bind(sockfd, (struct sockaddr *)&addre

30、ss, sizeof(address); v功能:面向連接的服務(wù)器使用它將一個(gè)套接字置功能:面向連接的服務(wù)器使用它將一個(gè)套接字置為被動(dòng)模式,并準(zhǔn)備接收傳入連接。用于服務(wù)器,為被動(dòng)模式,并準(zhǔn)備接收傳入連接。用于服務(wù)器,指明某個(gè)套接字連接是被動(dòng)的指明某個(gè)套接字連接是被動(dòng)的v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd: 指明創(chuàng)建連接的套接字指明創(chuàng)建連接的套接字 input_queue_size: 該套接字使用的隊(duì)列長(zhǎng)度該套接字使用的隊(duì)列長(zhǎng)度, 指指定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù)定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù) v舉例:舉例:listen(sockfd,20)int listen(int sockfd,int

31、input_queue_size)v功能:獲取傳入連接請(qǐng)求,返回新的連接的套接功能:獲取傳入連接請(qǐng)求,返回新的連接的套接字描述符。字描述符。 為每個(gè)新的連接請(qǐng)求創(chuàng)建了一個(gè)新的套接字,服務(wù)器為每個(gè)新的連接請(qǐng)求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對(duì)新的連接使用該套接字,原來(lái)的監(jiān)聽(tīng)套接字接受只對(duì)新的連接使用該套接字,原來(lái)的監(jiān)聽(tīng)套接字接受其他的連接請(qǐng)求。其他的連接請(qǐng)求。 新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務(wù)器將關(guān)閉這個(gè)套接字。務(wù)器將關(guān)閉這個(gè)套接字。v參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:套接字描述符,指明正在監(jiān)聽(tīng)的套接字套接字描述符,指明正在監(jiān)聽(tīng)的套接

32、字 addr:提出連接請(qǐng)求的主機(jī)地址提出連接請(qǐng)求的主機(jī)地址 addrlen:地址長(zhǎng)度地址長(zhǎng)度v舉例:舉例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address);int accept(int sockfd, void *addr, int addrlen)vread和和write函數(shù)函數(shù) 在在unix和和linux中,可以代替中,可以代替recv和和send。v小結(jié):小結(jié):socket*connect*send(write)*recv(read)*close*bindlistenacceptrec

33、vmsgsendmsgrecvfromsendtoshutdowngetpeernamegetsockoptsetsockoptv使用使用tcp的客戶和服務(wù)器套接字函數(shù)調(diào)用序列的客戶和服務(wù)器套接字函數(shù)調(diào)用序列socket客戶端客戶端connectsendrecvclosesocket服務(wù)器端服務(wù)器端bindlistenacceptclosesendrecvv網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前v有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。如如sockaddr_inv需要網(wǎng)絡(luò)字節(jié)順序和本地主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換的需要網(wǎng)絡(luò)字節(jié)順序和本地

34、主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換的函數(shù),堅(jiān)持使用,便于移植。函數(shù),堅(jiān)持使用,便于移植。v分為短(分為短(short 16位位)和長(zhǎng)(和長(zhǎng)(long 32位位)兩種兩種 htons():將一個(gè)短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為網(wǎng)將一個(gè)短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序;絡(luò)字節(jié)順序; ntohs():將一個(gè)短整數(shù)從網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為本將一個(gè)短整數(shù)從網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為本地字節(jié)順序;地字節(jié)順序; htonl()和和ntohl():類(lèi)似如上:類(lèi)似如上vunix系統(tǒng)提供了預(yù)定義的符號(hào)常量和數(shù)據(jù)結(jié)構(gòu)來(lái)系統(tǒng)提供了預(yù)定義的符號(hào)常量和數(shù)據(jù)結(jié)構(gòu)來(lái)聲明數(shù)據(jù)和指明參數(shù):聲明數(shù)據(jù)和指明參數(shù):v使用何種服務(wù):使用何種服務(wù): sock_dg

35、ram: 數(shù)據(jù)報(bào)服務(wù),數(shù)據(jù)報(bào)服務(wù),udp協(xié)議協(xié)議 sock_stream: 流服務(wù),流服務(wù),tcp協(xié)議協(xié)議 pf_inet:使用:使用tcp/ip協(xié)議族協(xié)議族 af_inet: 使用使用tcp/ip地址結(jié)構(gòu)地址結(jié)構(gòu)v需要需要include,引用出現(xiàn)這些定義的文本,引用出現(xiàn)這些定義的文本# include # include v應(yīng)用程序如何發(fā)起通信成為客戶應(yīng)用程序如何發(fā)起通信成為客戶v如何使用如何使用tcp或或udp與服務(wù)器聯(lián)系與服務(wù)器聯(lián)系v如何使用套接字調(diào)用與協(xié)議交互如何使用套接字調(diào)用與協(xié)議交互v 初始化期望與之通信的服務(wù)器初始化期望與之通信的服務(wù)器ip地址和協(xié)議地址和協(xié)議端口號(hào)端口號(hào)v 分配

36、套接字分配套接字socket()v 指明此連接需要在本地機(jī)器中的、任意的、指明此連接需要在本地機(jī)器中的、任意的、未使用的協(xié)議端口,并允許未使用的協(xié)議端口,并允許tcp選擇一個(gè)這選擇一個(gè)這樣的端口樣的端口v 將這個(gè)套接字連接到服務(wù)器將這個(gè)套接字連接到服務(wù)器connect()v 使用應(yīng)用級(jí)協(xié)議與服務(wù)器通信使用應(yīng)用級(jí)協(xié)議與服務(wù)器通信send()/recv() v 關(guān)閉連接關(guān)閉連接close()v應(yīng)用程序必須指明的細(xì)節(jié)應(yīng)用程序必須指明的細(xì)節(jié)v只需要概念性地了解套接字只需要概念性地了解套接字apiv需要詳細(xì)了解構(gòu)造通信程序的各種方法,便于迅需要詳細(xì)了解構(gòu)造通信程序的各種方法,便于迅速作出設(shè)計(jì)決策。速作出

37、設(shè)計(jì)決策。v客戶應(yīng)用程序比較簡(jiǎn)單客戶應(yīng)用程序比較簡(jiǎn)單 不必明顯地處理并發(fā)性不必明顯地處理并發(fā)性 不需要特權(quán),和常規(guī)的應(yīng)用程序一樣執(zhí)行不需要特權(quán),和常規(guī)的應(yīng)用程序一樣執(zhí)行 不需要強(qiáng)行保護(hù),依賴操作系統(tǒng)自動(dòng)強(qiáng)迫執(zhí)不需要強(qiáng)行保護(hù),依賴操作系統(tǒng)自動(dòng)強(qiáng)迫執(zhí)行保護(hù)行保護(hù)v在編譯程序時(shí),將服務(wù)器的域名或者在編譯程序時(shí),將服務(wù)器的域名或者ip地址說(shuō)地址說(shuō)明為常量明為常量 執(zhí)行快,但是服務(wù)器移動(dòng)后不便執(zhí)行快,但是服務(wù)器移動(dòng)后不便v要求用戶在啟動(dòng)程序時(shí)標(biāo)定服務(wù)器要求用戶在啟動(dòng)程序時(shí)標(biāo)定服務(wù)器v從穩(wěn)定的存儲(chǔ)設(shè)備中獲得關(guān)于服務(wù)器的信息從穩(wěn)定的存儲(chǔ)設(shè)備中獲得關(guān)于服務(wù)器的信息 如果文件不存在,客戶軟件就不能執(zhí)行如果文件不

38、存在,客戶軟件就不能執(zhí)行v使用某個(gè)單獨(dú)的協(xié)議來(lái)找到服務(wù)器使用某個(gè)單獨(dú)的協(xié)議來(lái)找到服務(wù)器 只能在本地小環(huán)境下應(yīng)用只能在本地小環(huán)境下應(yīng)用v根據(jù)實(shí)際情況,綜合標(biāo)識(shí)服務(wù)器地址根據(jù)實(shí)際情況,綜合標(biāo)識(shí)服務(wù)器地址v初始化服務(wù)器的地址結(jié)構(gòu)初始化服務(wù)器的地址結(jié)構(gòu)tcp/ip的地址定義的地址定義struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2bstruct in_addr sin_addr;/4bchar sin_zero8;/8b未使用未使用 ip專用的結(jié)構(gòu)專用的結(jié)構(gòu)l地址結(jié)構(gòu)長(zhǎng)度地址結(jié)構(gòu)長(zhǎng)度l地址的協(xié)議地址的協(xié)議a

39、f_inetl端口號(hào)端口號(hào)lip地址地址v參數(shù)由字符串構(gòu)成,客戶使用參數(shù)語(yǔ)法參數(shù)由字符串構(gòu)成,客戶使用參數(shù)語(yǔ)法: 域名方式(或域名方式(或ip地址)方式地址)方式v域名和域名和ip地址的確定:掃描參數(shù),看是否含有字地址的確定:掃描參數(shù),看是否含有字母。母。v全參數(shù)化的客戶軟件允許用戶指明協(xié)議端口號(hào)和全參數(shù)化的客戶軟件允許用戶指明協(xié)議端口號(hào)和機(jī)器機(jī)器 使用兩個(gè)參數(shù):使用兩個(gè)參數(shù): smtp 使用單個(gè)參數(shù):使用單個(gè)參數(shù)::smtpv遵循本地系統(tǒng)的約定:遵循本地系統(tǒng)的約定:linux使用單獨(dú)參數(shù)指明使用單獨(dú)參數(shù)指明服務(wù)器的機(jī)器地址和協(xié)議端口服務(wù)器的機(jī)器地址和協(xié)議端口v使用使用sockaddr_in結(jié)

40、構(gòu)指明服務(wù)器的地址結(jié)構(gòu)指明服務(wù)器的地址 需要二進(jìn)制表示的需要二進(jìn)制表示的32bit ip地址地址v套接字對(duì)地址轉(zhuǎn)換的支持套接字對(duì)地址轉(zhuǎn)換的支持(兩個(gè)(兩個(gè)庫(kù)例程庫(kù)例程) inet_addr: ip地址點(diǎn)分十進(jìn)制到二進(jìn)制的轉(zhuǎn)換地址點(diǎn)分十進(jìn)制到二進(jìn)制的轉(zhuǎn)換 接受一個(gè)點(diǎn)分十進(jìn)制表示的字符串地址,返回一個(gè)接受一個(gè)點(diǎn)分十進(jìn)制表示的字符串地址,返回一個(gè)等價(jià)的二進(jìn)制地址等價(jià)的二進(jìn)制地址 gethostbyname: 主機(jī)域名到二進(jìn)制的轉(zhuǎn)換主機(jī)域名到二進(jìn)制的轉(zhuǎn)換 接受一個(gè)機(jī)器域名字符串,返回一個(gè)接受一個(gè)機(jī)器域名字符串,返回一個(gè)hostent結(jié)構(gòu),結(jié)構(gòu),內(nèi)含一個(gè)二進(jìn)制表示的主機(jī)內(nèi)含一個(gè)二進(jìn)制表示的主機(jī)ip地址地

41、址struct hostentchar *h_name;char *h_aliases;int h_addrtype;int h_length;char ;#define h_addr h_addr_list0struct hostent *hptr;char *examplenam=””;if(hptr=gethostbyname(examplenam)/*ip address is now in */else /*error in name-handle it*/vgetservbyname: 兩個(gè)參數(shù)指明期望的服務(wù)和協(xié)兩個(gè)參數(shù)指明期望的服務(wù)和協(xié)議。

42、返回議。返回servent類(lèi)型的結(jié)構(gòu)指針;類(lèi)型的結(jié)構(gòu)指針;v注意網(wǎng)絡(luò)字節(jié)順序和本地機(jī)器的表示方法;注意網(wǎng)絡(luò)字節(jié)順序和本地機(jī)器的表示方法;struct serventchar *s_name;char *s_aliases;int s_port;char *s_proto;vgetprotobyname: 由協(xié)議名返回協(xié)議號(hào);返回一個(gè)由協(xié)議名返回協(xié)議號(hào);返回一個(gè)protoent類(lèi)型結(jié)構(gòu)的地址類(lèi)型結(jié)構(gòu)的地址struct protoentchar *p_name;char *p_aliases;char *p_proto;struct protoent *pptr;if (pptr = getpro

43、tobyname(“udp”) /* official protocol number is now in pptr -p_proto*/else /* error occurred-handle it */v使用使用socket函數(shù)函數(shù)v將協(xié)議和服務(wù)分別說(shuō)明為將協(xié)議和服務(wù)分別說(shuō)明為pf_inet和和sock_streamvinclude語(yǔ)句包含一些定義常量的文件語(yǔ)句包含一些定義常量的文件v對(duì)于對(duì)于tcp/ip,第三個(gè)參數(shù)沒(méi)有用。,第三個(gè)參數(shù)沒(méi)有用。#include #include int s; /* socket descriptor */s = socket ( pf_inet, soc

44、k_stream, 0);v服務(wù)器運(yùn)行于熟知的端口上,客戶不是服務(wù)器運(yùn)行于熟知的端口上,客戶不是v客戶使用端口的規(guī)則:客戶使用端口的規(guī)則: 該端口不與該機(jī)器其他進(jìn)程使用端口沖突該端口不與該機(jī)器其他進(jìn)程使用端口沖突 該端口沒(méi)有被分配給某個(gè)熟知服務(wù)該端口沒(méi)有被分配給某個(gè)熟知服務(wù)v客戶允許客戶允許tcp自動(dòng)選擇本地端口自動(dòng)選擇本地端口 connect調(diào)用的一個(gè)效果就是所選擇的本地端口調(diào)用的一個(gè)效果就是所選擇的本地端口能夠滿足上述準(zhǔn)則能夠滿足上述準(zhǔn)則v對(duì)于只掛在一個(gè)網(wǎng)絡(luò)上的主機(jī)是簡(jiǎn)單的對(duì)于只掛在一個(gè)網(wǎng)絡(luò)上的主機(jī)是簡(jiǎn)單的v正確的選擇依賴于選路信息,但應(yīng)用程序很少使正確的選擇依賴于選路信息,但應(yīng)用程序很少

45、使用選路信息,實(shí)際中存在的問(wèn)題:用選路信息,實(shí)際中存在的問(wèn)題: 一個(gè)主機(jī)可能具有多個(gè)一個(gè)主機(jī)可能具有多個(gè)ip地址地址 如果應(yīng)用程序如果應(yīng)用程序隨機(jī)選擇一個(gè)隨機(jī)選擇一個(gè)ip地址地址,可能選擇,可能選擇了一個(gè)與了一個(gè)與ip地址的接口并不匹配的地址。地址的接口并不匹配的地址。 可能能夠正確的工作。但是網(wǎng)絡(luò)管理會(huì)困難和可能能夠正確的工作。但是網(wǎng)絡(luò)管理會(huì)困難和混亂,可靠性降低。混亂,可靠性降低。v一般本地地址字段不填,允許客戶自動(dòng)選取本地一般本地地址字段不填,允許客戶自動(dòng)選取本地ip地址地址vconnect函數(shù):允許函數(shù):允許tcp套接字發(fā)起連接套接字發(fā)起連接 強(qiáng)迫執(zhí)行下層的三次握手強(qiáng)迫執(zhí)行下層的三次握

46、手 超時(shí)或者建立連接后返回超時(shí)或者建立連接后返回 三個(gè)參數(shù):三個(gè)參數(shù): retcode = connect(s, remaddr, remaddrlen); s: 套接字的描述符套接字的描述符 remaddr:一個(gè)一個(gè)sockaddr_in類(lèi)型結(jié)構(gòu)的地址類(lèi)型結(jié)構(gòu)的地址 remaddrlen:第二個(gè)參數(shù)的長(zhǎng)度第二個(gè)參數(shù)的長(zhǎng)度vconnect的四項(xiàng)任務(wù)的四項(xiàng)任務(wù) 對(duì)指明的套接字進(jìn)行檢測(cè):有效,沒(méi)有連接對(duì)指明的套接字進(jìn)行檢測(cè):有效,沒(méi)有連接 將第二個(gè)參數(shù)給出的端點(diǎn)地址填入套接字中將第二個(gè)參數(shù)給出的端點(diǎn)地址填入套接字中 為此套接字選擇一個(gè)本地端點(diǎn)地址為此套接字選擇一個(gè)本地端點(diǎn)地址 發(fā)起一個(gè)發(fā)起一個(gè)tc

47、p連接,并返回一個(gè)值連接,并返回一個(gè)值v客戶發(fā)送請(qǐng)求,等待響應(yīng)客戶發(fā)送請(qǐng)求,等待響應(yīng) 發(fā)送請(qǐng)求:發(fā)送請(qǐng)求:send; 等待響應(yīng):等待響應(yīng):recv;vtcp不保持記錄的邊界,面向流的概念不保持記錄的邊界,面向流的概念send(s, req, strlen(req), 0);while (n = recv (s, bptr, buflen, 0) 0) bptr +=n;buflen -=n;vclose:從容關(guān)閉連接釋放該套接字:從容關(guān)閉連接釋放該套接字 常常需要在客戶服務(wù)器之間協(xié)調(diào)關(guān)閉事宜常常需要在客戶服務(wù)器之間協(xié)調(diào)關(guān)閉事宜 服務(wù)器不能關(guān)閉連接,不知客戶請(qǐng)求是否完成服務(wù)器不能關(guān)閉連接,不知客

48、戶請(qǐng)求是否完成 客戶不知道服務(wù)器發(fā)出的數(shù)據(jù)是否全部到達(dá)客戶不知道服務(wù)器發(fā)出的數(shù)據(jù)是否全部到達(dá)v允許應(yīng)用程序在一個(gè)方向關(guān)閉允許應(yīng)用程序在一個(gè)方向關(guān)閉tcp連連 shutdown(s, direction); direction:0不允許輸入不允許輸入; 1不允許輸出不允許輸出; 2雙向關(guān)閉雙向關(guān)閉 部分關(guān)閉可以讓服務(wù)器發(fā)送完最后一個(gè)響應(yīng)后,部分關(guān)閉可以讓服務(wù)器發(fā)送完最后一個(gè)響應(yīng)后,關(guān)閉連接。關(guān)閉連接。vdaytime服務(wù)服務(wù) 功能:只要連接到來(lái),服務(wù)器就構(gòu)造包含當(dāng)前日功能:只要連接到來(lái),服務(wù)器就構(gòu)造包含當(dāng)前日期時(shí)間的期時(shí)間的文本字符串文本字符串發(fā)送,然后關(guān)閉連接。客戶發(fā)送,然后關(guān)閉連接??蛻舨挥?/p>

49、發(fā)送任何數(shù)據(jù),發(fā)送了也會(huì)忽略。不用發(fā)送任何數(shù)據(jù),發(fā)送了也會(huì)忽略。 周知端口:周知端口:13while( (n = read(s, buf, linelen) 0) bufn = 0;(void) fputs( buf, stdout );參考例子參考例子daytime.cv初始化期望與之通信的服務(wù)器初始化期望與之通信的服務(wù)器ip地址和協(xié)議端口號(hào)地址和協(xié)議端口號(hào)v分配套接字分配套接字socket()v指明這種通信需要本地機(jī)器中的、任意的、未使用指明這種通信需要本地機(jī)器中的、任意的、未使用的協(xié)議端口,并允許的協(xié)議端口,并允許udp選擇一個(gè)這樣的端口選擇一個(gè)這樣的端口connect()v指明報(bào)文所要

50、發(fā)往的服務(wù)器指明報(bào)文所要發(fā)往的服務(wù)器sendto()v使用應(yīng)用級(jí)協(xié)議與服務(wù)器通信使用應(yīng)用級(jí)協(xié)議與服務(wù)器通信sendto()/recvform()v關(guān)閉連接關(guān)閉連接close()v連接的連接的udp通信通信 客戶使用客戶使用connect調(diào)用指明遠(yuǎn)程端點(diǎn)地址調(diào)用指明遠(yuǎn)程端點(diǎn)地址 使用使用sock_dgram類(lèi)型的套接字類(lèi)型的套接字 不發(fā)起任何分組交換,不檢查遠(yuǎn)程端點(diǎn)合法性不發(fā)起任何分組交換,不檢查遠(yuǎn)程端點(diǎn)合法性 只是在套接字的數(shù)據(jù)結(jié)構(gòu)記錄遠(yuǎn)程端點(diǎn)的信息只是在套接字的數(shù)據(jù)結(jié)構(gòu)記錄遠(yuǎn)程端點(diǎn)的信息 只和一個(gè)服務(wù)器交互比較方便只和一個(gè)服務(wù)器交互比較方便v非連接的非連接的udp通信通信 在每次發(fā)送報(bào)文的時(shí)

51、候指明遠(yuǎn)程目的地在每次發(fā)送報(bào)文的時(shí)候指明遠(yuǎn)程目的地 使用靈活,便于同不同的服務(wù)器通信使用靈活,便于同不同的服務(wù)器通信v對(duì)于連接的對(duì)于連接的udp套接字套接字 使用使用send發(fā)送報(bào)文發(fā)送報(bào)文 使用使用recv接收?qǐng)?bào)文接收?qǐng)?bào)文 每次每次send發(fā)送一個(gè)完整的報(bào)文發(fā)送一個(gè)完整的報(bào)文 每次每次recv接收一個(gè)完整的報(bào)文,足夠大緩存接收一個(gè)完整的報(bào)文,足夠大緩存 不需要重復(fù)使用不需要重復(fù)使用recv獲得單個(gè)報(bào)文獲得單個(gè)報(bào)文v對(duì)于非連接的對(duì)于非連接的udp套接字套接字 sendto: 發(fā)送報(bào)文,含有地址信息發(fā)送報(bào)文,含有地址信息 recvfrom: 接收一個(gè)含有源地址的數(shù)據(jù)報(bào)接收一個(gè)含有源地址的數(shù)據(jù)報(bào)v

52、close: 關(guān)閉套接字,釋放與之關(guān)聯(lián)的資源關(guān)閉套接字,釋放與之關(guān)聯(lián)的資源 拒絕以后到達(dá)的報(bào)文拒絕以后到達(dá)的報(bào)文 沒(méi)有通知遠(yuǎn)程端點(diǎn)沒(méi)有通知遠(yuǎn)程端點(diǎn)vshutdown: 在某個(gè)方向上終止進(jìn)一步傳輸在某個(gè)方向上終止進(jìn)一步傳輸 不向另外一方發(fā)送任何報(bào)文,只是在本地套接不向另外一方發(fā)送任何報(bào)文,只是在本地套接字標(biāo)明不期望在指定的方向傳輸數(shù)據(jù)字標(biāo)明不期望在指定的方向傳輸數(shù)據(jù) 客戶關(guān)閉輸出以后,服務(wù)器并不知道客戶關(guān)閉輸出以后,服務(wù)器并不知道vudp提供的是不可靠的交互提供的是不可靠的交互 必須自己設(shè)計(jì)協(xié)議實(shí)現(xiàn)可靠性必須自己設(shè)計(jì)協(xié)議實(shí)現(xiàn)可靠性vtime服務(wù):允許一臺(tái)機(jī)器從另外一臺(tái)機(jī)器獲得日服務(wù):允許一臺(tái)機(jī)器

53、從另外一臺(tái)機(jī)器獲得日期和時(shí)間。由于存在不同的時(shí)區(qū),所有的時(shí)間日期和時(shí)間。由于存在不同的時(shí)區(qū),所有的時(shí)間日期信息必須用國(guó)際標(biāo)準(zhǔn)時(shí)間:期信息必須用國(guó)際標(biāo)準(zhǔn)時(shí)間:uct或或ut 服務(wù)器應(yīng)答前將本地時(shí)間轉(zhuǎn)化為標(biāo)準(zhǔn)時(shí)間服務(wù)器應(yīng)答前將本地時(shí)間轉(zhuǎn)化為標(biāo)準(zhǔn)時(shí)間 客戶收到應(yīng)答時(shí),將國(guó)際標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)化為本地客戶收到應(yīng)答時(shí),將國(guó)際標(biāo)準(zhǔn)時(shí)間轉(zhuǎn)化為本地時(shí)間時(shí)間vtime協(xié)議規(guī)定由協(xié)議規(guī)定由32bit的整數(shù)來(lái)表示:的整數(shù)來(lái)表示:用于一臺(tái)用于一臺(tái)計(jì)算機(jī)使用另外一系統(tǒng)時(shí)鐘來(lái)設(shè)置起事件計(jì)算機(jī)使用另外一系統(tǒng)時(shí)鐘來(lái)設(shè)置起事件v可以使用可以使用udp(tcp)訪問(wèn)訪問(wèn)time服務(wù)服務(wù) 客戶發(fā)出包含單個(gè)數(shù)據(jù)報(bào)的請(qǐng)求客戶發(fā)出包含單個(gè)數(shù)據(jù)報(bào)

54、的請(qǐng)求 服務(wù)器從傳入的數(shù)據(jù)報(bào)中取出地址和端口號(hào)服務(wù)器從傳入的數(shù)據(jù)報(bào)中取出地址和端口號(hào) 服務(wù)器將當(dāng)前時(shí)間編碼為一個(gè)整數(shù),使用上述地服務(wù)器將當(dāng)前時(shí)間編碼為一個(gè)整數(shù),使用上述地址和端口號(hào)發(fā)回給客戶址和端口號(hào)發(fā)回給客戶(void) write(s, msg, strlen(msg);n = read(s, (char *)&now, sizeof(now);now = ntohl(unsigned long)now);now -= unixepoch;printf(%s, ctime(&now);使用連接的使用連接的udp服務(wù)服務(wù)vecho服務(wù)器返回從客戶收到的所有數(shù)據(jù),用戶服務(wù)器返回

55、從客戶收到的所有數(shù)據(jù),用戶網(wǎng)絡(luò)管理員測(cè)試可達(dá)性,調(diào)試協(xié)議軟件,識(shí)別選網(wǎng)絡(luò)管理員測(cè)試可達(dá)性,調(diào)試協(xié)議軟件,識(shí)別選路問(wèn)題等路問(wèn)題等vtcp echo服務(wù):服務(wù):接收連接請(qǐng)求,從連接中讀取接收連接請(qǐng)求,從連接中讀取數(shù)據(jù),在該連接上將數(shù)據(jù)寫(xiě)回。直到客戶終止傳數(shù)據(jù),在該連接上將數(shù)據(jù)寫(xiě)回。直到客戶終止傳送。送。vudp echo服務(wù):服務(wù):接收整個(gè)數(shù)據(jù)報(bào),根據(jù)數(shù)據(jù)報(bào)接收整個(gè)數(shù)據(jù)報(bào),根據(jù)數(shù)據(jù)報(bào)指明的端口號(hào)和地址,返回整個(gè)數(shù)據(jù)。指明的端口號(hào)和地址,返回整個(gè)數(shù)據(jù)。請(qǐng)編寫(xiě)請(qǐng)編寫(xiě)tcp-echo.c和和udp-echo.c代碼代碼while (fgets(buf, sizeof(buf), stdin) bufli

56、nelen = 0; outchars = strlen(buf); (void) write(s, buf, outchars);for (inchars = 0; inchars outchars; inchars+=n ) n = read(s, &bufinchars, outchars - inchars); fputs(buf, stdout);v服務(wù)器軟件設(shè)計(jì)存在的問(wèn)題服務(wù)器軟件設(shè)計(jì)存在的問(wèn)題 四種基本類(lèi)型的服務(wù)器程序四種基本類(lèi)型的服務(wù)器程序 本地地址結(jié)構(gòu)的初始化本地地址結(jié)構(gòu)的初始化 周知端口綁定及被動(dòng)模式的設(shè)置周知端口綁定及被動(dòng)模式的設(shè)置 accept()函數(shù)調(diào)用函數(shù)調(diào)

57、用v循環(huán)服務(wù)器的設(shè)計(jì)循環(huán)服務(wù)器的設(shè)計(jì) 面向連接的和非連接的設(shè)計(jì)方法面向連接的和非連接的設(shè)計(jì)方法v并發(fā)服務(wù)器的設(shè)計(jì)并發(fā)服務(wù)器的設(shè)計(jì) 多進(jìn)程的多線程并發(fā)服務(wù)器設(shè)計(jì)多進(jìn)程的多線程并發(fā)服務(wù)器設(shè)計(jì) 單進(jìn)程中多線程的并發(fā)服務(wù)器設(shè)計(jì)單進(jìn)程中多線程的并發(fā)服務(wù)器設(shè)計(jì)v循環(huán)的或者并發(fā)的循環(huán)的或者并發(fā)的v使用面向連接的或者無(wú)連接的傳輸使用面向連接的或者無(wú)連接的傳輸循環(huán)的無(wú)連接循環(huán)的面向連接并發(fā)的無(wú)連接并發(fā)的面向連接v初始化地址協(xié)議族初始化地址協(xié)議族af_inetv初始化周知端口初始化周知端口getservbyname()v初始化本地初始化本地ip地址地址對(duì)于多接口主機(jī)使用對(duì)于多接口主機(jī)使用inaddr_any指明指

58、明了一個(gè)通配地址,讓了一個(gè)通配地址,讓該主機(jī)的任何一個(gè)該主機(jī)的任何一個(gè)ip地址都匹配地址都匹配tcp/ip的地址定義的地址定義struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2bstruct in_addr sin_addr;/4bchar sin_zero8;/8b未使用未使用 ip專用的結(jié)構(gòu)專用的結(jié)構(gòu)vbind系統(tǒng)調(diào)用用于將描述符和該地址結(jié)構(gòu)進(jìn)行綁定系統(tǒng)調(diào)用用于將描述符和該地址結(jié)構(gòu)進(jìn)行綁定vlisten系統(tǒng)調(diào)用用于將套接字置于被動(dòng)模式系統(tǒng)調(diào)用用于將套接字置于被動(dòng)模式 input_queue_siz

59、e參數(shù)指明套接字內(nèi)部的請(qǐng)求隊(duì)參數(shù)指明套接字內(nèi)部的請(qǐng)求隊(duì)列長(zhǎng)度列長(zhǎng)度 請(qǐng)求隊(duì)列保存一組請(qǐng)求隊(duì)列保存一組tcp傳入連接請(qǐng)求,來(lái)自客戶傳入連接請(qǐng)求,來(lái)自客戶,都向這個(gè)服務(wù)器請(qǐng)求一個(gè)連接,都向這個(gè)服務(wù)器請(qǐng)求一個(gè)連接int bind(int sockfd, struct sockaddr * my_addr, int addrlen)int listen(int sockfd, int input_queue_size)vaccept系統(tǒng)調(diào)用用于接受連接請(qǐng)求并使用這些連接系統(tǒng)調(diào)用用于接受連接請(qǐng)求并使用這些連接v服務(wù)器接收連接,使用服務(wù)器接收連接,使用read獲得來(lái)自客戶的應(yīng)用協(xié)獲得來(lái)自客戶的應(yīng)用協(xié)議,使

60、用議,使用write發(fā)回應(yīng)答。發(fā)回應(yīng)答。v服務(wù)器結(jié)束連接,使用服務(wù)器結(jié)束連接,使用close釋放套接字釋放套接字ssock = accept(msock, (struct sockaddr *)&fsin, &alen);v面向連接的循環(huán)服務(wù)器基本算法面向連接的循環(huán)服務(wù)器基本算法創(chuàng)建套接字并將其綁定到它所提供服務(wù)的熟知?jiǎng)?chuàng)建套接字并將其綁定到它所提供服務(wù)的熟知端口上;端口上;socket+bind將該端口設(shè)置為被動(dòng)模式,使其準(zhǔn)備為服務(wù)器將該端口設(shè)置為被動(dòng)模式,使其準(zhǔn)備為服務(wù)器所用;所用;listen從該套接字上接收連接請(qǐng)求,獲得該連接的新從該套接字上接收連接請(qǐng)求,獲得該連接的新的套接字;的套接字;ssock=accept(s, )重復(fù)地讀取來(lái)自客戶的請(qǐng)求,構(gòu)造響應(yīng),按照重復(fù)地讀取來(lái)自客戶的請(qǐng)求

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論