版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第六章 網(wǎng)絡(luò)程序設(shè)計(jì)基本知識(shí),6.1 網(wǎng)絡(luò)應(yīng)用程序的概念 6.1.1.什么是網(wǎng)絡(luò)應(yīng)用程序 6.1.2.網(wǎng)絡(luò)應(yīng)用程序的標(biāo)識(shí)問(wèn)題 6.1.3.客戶(hù)/服務(wù)器模型,6.1網(wǎng)絡(luò)應(yīng)用程序的概念,6.1.1.什么是網(wǎng)絡(luò)應(yīng)用程序 應(yīng)用程序,可分為2種: 1)無(wú)需其他程序產(chǎn)生的數(shù)據(jù),其他程序也不使用它輸出的數(shù)據(jù)(進(jìn)程之間 不存在 通信問(wèn)題) 2)需要與其他應(yīng)用程序進(jìn)行數(shù)據(jù)交換才能完成其功能(進(jìn)程之間 存在 通信問(wèn)題) 進(jìn)程間通信,可分為2種: 1)單機(jī)系統(tǒng)中的進(jìn)程之間的通信 2)不同系統(tǒng)間,通過(guò)網(wǎng)絡(luò)通信協(xié)議進(jìn)行的進(jìn)程間的通信(網(wǎng)絡(luò)應(yīng)用程序),6.1網(wǎng)絡(luò)應(yīng)用程序的概念,6.1.2.網(wǎng)絡(luò)應(yīng)用程序的標(biāo)識(shí)問(wèn)題 同一系統(tǒng)
2、中不同進(jìn)程間的通信,通過(guò)系統(tǒng)分配的進(jìn)程ID來(lái)唯一標(biāo)識(shí)一個(gè)進(jìn)程。 ?網(wǎng)絡(luò)中,為了 唯一標(biāo)識(shí) 網(wǎng)絡(luò)中 通信的一個(gè)進(jìn)程是否 也可以 通過(guò) 進(jìn)程ID 來(lái) 唯一標(biāo)識(shí)? 網(wǎng)絡(luò)中,為了唯一標(biāo)識(shí)網(wǎng)絡(luò)中通信的一個(gè)進(jìn)程使用一個(gè) 三元組 三元組 僅僅 指定了通信的一條連接 的 半個(gè)部分(半相關(guān)) 完整表示通信中2個(gè)進(jìn)程,需要六元組(全相關(guān)),6.1網(wǎng)絡(luò)應(yīng)用程序的概念,6.1.2.網(wǎng)絡(luò)應(yīng)用程序的標(biāo)識(shí)問(wèn)題 互聯(lián)網(wǎng)中通信主機(jī)在網(wǎng)絡(luò)層使用IP協(xié)議,在運(yùn)輸層中可使用TCP或UDP協(xié)議 ?是否可以呢? 協(xié)議格式不同,在傳輸層無(wú)法識(shí)別數(shù)據(jù),無(wú)法正常通信。 簡(jiǎn)化為五元組:,6.1網(wǎng)絡(luò)應(yīng)用程序的概念,6.1.3.客戶(hù)/服務(wù)器模型 網(wǎng)
3、絡(luò)應(yīng)用程序,一般以C/S模型方式工作 所具資源為非對(duì)稱(chēng) 要求有一套雙方都能共同識(shí)別的規(guī)則(協(xié)議),且在通信兩端被實(shí)現(xiàn)。 C和S的關(guān)系一般為多對(duì)多。,服務(wù)器提供服務(wù)的方式:,協(xié)議,C/S模型特點(diǎn)(P96),(Telnet) (FTP),第六章 網(wǎng)絡(luò)程序設(shè)計(jì)基本知識(shí),6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口 6.2.1.TCP/IP應(yīng)用程序工作模型 6.2.2. Windows Sockets概念 6.2.3. Winsock規(guī)范的目標(biāo)及相關(guān)概念,6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,6.2.1.TCP/IP應(yīng)用程序工作模型 ?TCP/IP 協(xié)議 的 功能 由誰(shuí) 實(shí)現(xiàn)? 一般由
4、 操作系統(tǒng)內(nèi)核 來(lái)實(shí)現(xiàn) (協(xié)議核心內(nèi)容在低3層(傳輸層、IP層、網(wǎng)絡(luò)接口層),被封裝在操作系統(tǒng)中) ?如何在網(wǎng)絡(luò)應(yīng)用程序中使用TCP/IP協(xié)議? 為保證安全、可靠性,用戶(hù)一般不能對(duì)核心進(jìn)行操作和使用 操作系統(tǒng) 給 用戶(hù)提供 使用內(nèi)核的 接口(網(wǎng)絡(luò)應(yīng)用程序編程接口),6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,6.2.1.TCP/IP應(yīng)用程序工作模型 明確 3點(diǎn): 1)網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì),是使用系統(tǒng)提供的網(wǎng)絡(luò)協(xié)議完成用戶(hù)程序的功能 2)不是由用戶(hù)去實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議各層的功能 3)進(jìn)行TCP/IP程序設(shè)計(jì)的關(guān)鍵問(wèn)題:熟悉所用平臺(tái)提供的 網(wǎng)絡(luò)編程接口(API) Windows環(huán)境下的網(wǎng)絡(luò)編程接口:
5、Windows Sockets Socket: 套接口、套接字、接口、插口,6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,6.2.2. Windows Sockets概念 Sockets Unix操作系統(tǒng)下流行的一種API 1983年在伯克利分校的4.2BSD操作系統(tǒng)中首先引用,被稱(chēng)為“Berkeley Socket API” 開(kāi)始僅僅支持TCP/IP協(xié)議,后增加對(duì)OSI協(xié)議的支持 Windows Sockets 簡(jiǎn)稱(chēng)Winsock,Windows環(huán)境下的一套網(wǎng)絡(luò)編程規(guī)范,1991年根據(jù)Berkeley Socket API 制定 Windows 環(huán)境下 網(wǎng)絡(luò)編程 事實(shí)上 的 標(biāo)準(zhǔn)(開(kāi)放的
6、,支持多協(xié)議)。,1.來(lái)源,6.2.2. Windows Sockets概念 現(xiàn)在開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用程序都使用Winsock2 要使用,需要在代碼中添加的: 1)頭文件winsock2.h ( 代碼第1行) 2)到WS2_32.lib庫(kù)的鏈接 ( 代碼第2行),6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,2.版本,#include / #pragma comment(lib,WS2_32),6.2.2. Windows Sockets概念 在Winsock規(guī)范中,將Winsock API函數(shù)集分為:,6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,3.分類(lèi),4.對(duì)多線程的支持,來(lái)源于BSD
7、Socket API,又根據(jù)Windows操作系統(tǒng) 進(jìn)行了擴(kuò)充,核心內(nèi)容符合Berkeley Socket 風(fēng)格的 庫(kù)函數(shù)又使程序員能夠充分利用Windows消息驅(qū)動(dòng) 機(jī)制進(jìn)行編程。,一個(gè)進(jìn)程可包含 一個(gè) 或 多個(gè) 同時(shí)執(zhí)行的線程。,6.2.3. Winsock規(guī)范的目標(biāo)及相關(guān)概念 Winsock規(guī)范的2個(gè)目標(biāo): 1)給網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)者提供一套簡(jiǎn)單的網(wǎng)絡(luò)編程API。 2)讓各家網(wǎng)絡(luò)軟件供應(yīng)商能根據(jù)這套規(guī)范建立各自符合Winsock標(biāo)準(zhǔn)的實(shí)現(xiàn)和應(yīng)用程序。 Winsock兼容的:遵守Winsock規(guī)范的網(wǎng)絡(luò)軟件 Winsock提供者: Winsock兼容實(shí)現(xiàn)的提供者 能夠與Winsock兼容實(shí)現(xiàn)
8、協(xié)同工作的應(yīng)用程序,都被認(rèn)為是 具有Winsock接口的。稱(chēng)為Winsock應(yīng)用程序,6.2TCP/IP應(yīng)用程序工作模型與網(wǎng)絡(luò)編程接口,第六章 網(wǎng)絡(luò)程序設(shè)計(jì)基本知識(shí),6.3套接口概念及其編程原理 6.3.1.套接口(Socket) 6.3.2.套接口的分類(lèi) 6.3.3. 套接口編程原理 6.3.4. 對(duì)錯(cuò)誤的處理機(jī)制 P196 6.3.5. 網(wǎng)絡(luò)字節(jié)順序 P148,6.3.1.套接口(Socket) Winsock API 依靠 套接口 進(jìn)行網(wǎng)絡(luò)程序設(shè)計(jì) 套接口 的 本質(zhì):通信過(guò)程中所使用的一些緩沖區(qū)及相關(guān)的數(shù)據(jù)結(jié)構(gòu)。,6.3套接口概念及其編程原理,主機(jī)A,主機(jī)B,基于TCP/IP 的網(wǎng)絡(luò),網(wǎng)
9、絡(luò)管理軟件,網(wǎng)卡,6.3.2.套接口的分類(lèi) 流式套接口:使用TCP協(xié)議來(lái)實(shí)現(xiàn) 數(shù)據(jù)報(bào)式套接口:使用UDP協(xié)議來(lái)實(shí)現(xiàn) 原始套接口:允許對(duì)較低層協(xié)議(eg:IP、ICMP)進(jìn)行直接訪問(wèn),6.3套接口概念及其編程原理,6.3.4.對(duì)錯(cuò)誤的處理機(jī)制 P196 對(duì)Winsock函數(shù)而言,返回錯(cuò)誤很常見(jiàn),如果發(fā)生錯(cuò)誤,應(yīng)該使用WSAGetLastError( )函數(shù)以獲得錯(cuò)誤的詳細(xì)說(shuō)明 int WSAGetLastError( ) 返回:錯(cuò)誤代碼 eg: printf(socket Error = %dn,WSAGetLastError(); 錯(cuò)誤代碼的值的聲明在頭文件Winsock2.h中,6.3套接口
10、概念及其編程原理,6.3.5.網(wǎng)絡(luò)字節(jié)順序 P148 不同主機(jī)對(duì)字節(jié)值的存儲(chǔ)順序不同“主機(jī)字節(jié)順序” 存儲(chǔ)由多個(gè)字節(jié)組成的字時(shí),有的計(jì)算機(jī)在起始地址處存放整數(shù)的: 低序號(hào)字節(jié) (小序在前) 高序號(hào)字節(jié) (大序在前) Windows 采用 小序在前 的 存儲(chǔ)方式 IP地址 端口號(hào),按計(jì)算機(jī)各自的主機(jī)字節(jié)順序表示 網(wǎng)絡(luò)中,為保證數(shù)據(jù)的正確性,網(wǎng)絡(luò)通信協(xié)議中 必須指定“網(wǎng)絡(luò)字節(jié)順序”(大序在前),6.3套接口概念及其編程原理,6.3.5.網(wǎng)絡(luò)字節(jié)順序 P148 2個(gè)函數(shù)實(shí)現(xiàn)2B的 “主機(jī)字節(jié)順序”和“網(wǎng)絡(luò)字節(jié)順序”間的轉(zhuǎn)換 htons() ntohs() 2個(gè)函數(shù)實(shí)現(xiàn)4B的 “主機(jī)字節(jié)順序”和“網(wǎng)絡(luò)
11、字節(jié)順序”間的轉(zhuǎn)換 htonl() ntohl(),6.3套接口概念及其編程原理,P152 inet_addr inet_ntoa,第六章 網(wǎng)絡(luò)程序設(shè)計(jì)基本知識(shí),6.4Winsock API基本函數(shù)套接口與連接建立 P103P115 6.4.1.打開(kāi)Winsock 6.4.2.創(chuàng)建套接口 6.3.3. 指定本地地址(綁定) 6.3.4. 監(jiān)聽(tīng) 6.3.5. 請(qǐng)求連接 6.3.5. 接受連接,服務(wù)器端,流程 /-加載動(dòng)態(tài)鏈接庫(kù)- /-創(chuàng)建流式套節(jié)字S,使用socket()- /-創(chuàng)建結(jié)構(gòu)體,用于記錄自己的地址- /-綁定自己的地址,使用bind() - /-監(jiān)聽(tīng),使用listen() - /-創(chuàng)
12、建結(jié)構(gòu)體,用于記錄客戶(hù)端的地址- /-創(chuàng)建套節(jié)字cli,用于記錄accept的結(jié)果- /-循環(huán)接受客戶(hù)的連接請(qǐng)求,使用accept()- /-關(guān)閉套節(jié)字S ,終止對(duì)動(dòng)態(tài)鏈接庫(kù)的訪問(wèn)-,#include #pragma comment(lib,“WS2_32”) #include void main() printf( 加載等待中. ); /-加載動(dòng)態(tài)鏈接庫(kù)- WORD wVersionRequested MAKEWORD(2,2) ; WSADATA wsaData; if(WSAStartup(wVersionRequested, ,函數(shù)WSAStartup 定義: int WSAStart
13、up( WORD wVersionRequested , LPWSADATA 1pWSAData ); wVersionRequested ,為雙字節(jié)型數(shù)值,高位字節(jié)為副版本號(hào),低位字節(jié)為主版本號(hào) 使用 宏 MAKEWORD(X,Y),X為高位字節(jié),Y為低位字節(jié),/指定準(zhǔn)備加載Winsock庫(kù)的版本,/指向WSADATA結(jié)構(gòu)的指針, 用于返回DLL庫(kù)信息,eg: MAKEWORD(2,2) 等同 0 x0202,函數(shù)WSAStartup 定義: int WSAStartup( WORD wVersionRequested , LPWSADATA 1pWSAData ); 1pWSAData ,
14、該參數(shù)是 指向 WSADATA結(jié)構(gòu) 的 指針( WSAStartup函數(shù)用它加載的庫(kù)版本的相關(guān)信息填在結(jié)構(gòu)體WSADATA里) 結(jié)構(gòu)體WSADATA P103,/指定準(zhǔn)備加載Winsock庫(kù)的版本,/指向WSADATA結(jié)構(gòu)的指針, 用于返回DLL庫(kù)信息,typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned
15、 short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, FAR * LPWSADATA;,P103,/-創(chuàng)建流式套節(jié)字s,使用socket()- SOCKET s; s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); / s = socket(AF_INET, SOCK_STREAM, 0); if(s = = INVALID_SOCKET) printf(Failed socket n); printf(socket Error = %dn,WSAGetLastError(); ,函數(shù)socket 定義
16、: SOCKET socket( int af, int type, int protocol ); af :套接字要使用的協(xié)議地址族,用常量AF_INET表示使 用IP地址 type:描述套接字的協(xié)議類(lèi)型,使用 protocol:說(shuō)明套接字使用的特定協(xié)議,SOCK_STREAM SOCK_DGRAM SOCK_RAW,IPPROTO_TCP IPPROTO_UDP IPPROTO_RAW,eg:s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);,函數(shù)socket 函數(shù)調(diào)用成功:返回新創(chuàng)建的套接口號(hào)(無(wú)符號(hào)整型數(shù)據(jù)) 調(diào)用錯(cuò)誤:返回INVALID_SO
17、CKET if(s = INVALID_SOCKET) printf(Failed socket n); 函數(shù)socket 為 五元組 指定了 協(xié)議 這 一 元,返回的s,稱(chēng)為:套接口的描述字 或 套接口句柄,/-(綁定)指定本地地址bind- struct sockaddr_in Sadd; Sadd.sin_family=AF_INET; Sadd.sin_porthtons(5555); Sadd.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /inet_addr() If(bind(s,(sockaddr*),/struct so
18、ckaddr_in *name= (struct sockaddr*),函數(shù)bind 定義: int bind( SOCKET s, const struct sockaddr FAR* name, int namelen ); s:未綁定套接口的句柄 (上一步創(chuàng)建的) name:與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,在Winsock中使用 sockaddr_in結(jié)構(gòu) 指定 IP地址和端口信息 namelen:地址參數(shù)(name)的長(zhǎng)度,用sizeof(Sadd) 獲得,函數(shù)bind 定義: int bind( SOCKET s, const struct sockaddr FAR* name, in
19、t namelen ); struct sockaddr /一般不使用這個(gè)結(jié)構(gòu)體 unsigned short sa_family; / 地址族 char sa_data14; / 14B 協(xié)議地址 ;,函數(shù)bind struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr char sin_zero8;/不用,用0填充 - struct in _ addr union structu_char s_b1,s_b2,s_b3,s_b4; S_un_b; structu_short s_w1,s_
20、w2;S_un_w; u_long S_addr; S_un,struct sockaddr_in Sadd; Sadd.sin_addr.S_un.S_addr= inet_addr(),函數(shù)bind Struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr char sin_zero8;/不用,用0填充 eg: struct sockaddr_in Sadd; Sadd.sin_family=AF_INET; Sadd.sin_porthtons(5555); Sadd
21、.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 如果Sadd.sin_porthtons(0);/系統(tǒng)自動(dòng)分配一個(gè)數(shù)值為10245000的端口號(hào),函數(shù)bind struct in _ addr union structu_char s_b1,s_b2,s_b3,s_b4; S_un_b; structu_short s_w1,s_w2;S_un_w; u_long S_addr; S_un eg:(家庭作業(yè):回去試一試,輸出結(jié)果) Sadd.sin_addr. S_un.S_un_b.s_b1=192; Sadd.sin_addr.S_un.S_un_b.s_
22、b2=168; Sadd.sin_addr.S_un.S_un_b.s_b3=1; Sadd.sin_addr.S_un.S_un_b.s_b4=1;,函數(shù)bind 函數(shù)調(diào)用成功返回0 調(diào)用錯(cuò)誤返回SOCKET_ERROR /-1 If(bind(s,(sockaddr*) 幫助: bind(SOCKET s , const sockaddr* name , int namelen),/-(進(jìn)入監(jiān)聽(tīng)狀態(tài)) listen- if(listen(s, 2) = SOCKET_ERROR) printf (Failed listen()n);,函數(shù)listen 定義: int listen( SOC
23、KET s, int backlog, ); s:套接口的句柄 (之前已經(jīng)創(chuàng)建) Backlog :等待連接的最大隊(duì)列長(zhǎng)度 (當(dāng)寫(xiě)為SOMAXCONN下層服務(wù)提供者將該套接字設(shè)置為最大合理值) eg: listen(s, 2) 如果服務(wù)器端連接數(shù)限制在2,當(dāng)有3臺(tái)客戶(hù)機(jī)同時(shí)發(fā)出連接請(qǐng)求,第三個(gè)請(qǐng)求的客戶(hù)端將收到“連接試圖被拒絕”的錯(cuò)誤代碼 10061,函數(shù)listen 函數(shù)調(diào)用成功返回0 調(diào)用錯(cuò)誤返回SOCKET_ERROR if(listen(s, 2) = SOCKET_ERROR) printf (Failed listen()n);,/-循環(huán)接受客戶(hù)的連接請(qǐng)求 accept()- struct sockaddr_in clientadd; /結(jié)構(gòu)體sockaddr_in int addLe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公室員工培訓(xùn)效果跟蹤機(jī)制制度
- 一個(gè)童話(huà)般的水晶球故事5篇
- 科技研發(fā)發(fā)展指標(biāo)責(zé)任書(shū)(3篇)
- 加強(qiáng)規(guī)范加班管理制度
- 醫(yī)院三甲考核規(guī)范制度
- 線束廠計(jì)件制度規(guī)范標(biāo)準(zhǔn)
- 規(guī)范公共停車(chē)位管理制度
- 規(guī)范離退休人員管理制度
- 規(guī)范化管理工作責(zé)任制度
- 診療規(guī)范及考核培訓(xùn)制度
- 器官移植術(shù)后排斥反應(yīng)的風(fēng)險(xiǎn)分層管理
- 虛擬電廠關(guān)鍵技術(shù)
- 事業(yè)單位清算及財(cái)務(wù)報(bào)告編寫(xiě)范本
- 護(hù)坡綠化勞務(wù)合同范本
- 臨床績(jī)效的DRG與CMI雙指標(biāo)調(diào)控
- 2026年湛江日?qǐng)?bào)社公開(kāi)招聘事業(yè)編制工作人員備考題庫(kù)及完整答案詳解
- 2025-2026學(xué)年人教版數(shù)學(xué)三年級(jí)上學(xué)期期末仿真模擬試卷一(含答案)
- 預(yù)制混凝土構(gòu)件質(zhì)量控制
- 2024高考英語(yǔ)應(yīng)用文寫(xiě)作真題手把手:2023全國(guó)乙卷素材
- 抵制網(wǎng)絡(luò)爛梗主題班會(huì)課件不盲目跟風(fēng)做自己的主人
- 企業(yè)盡職調(diào)查內(nèi)容提綱-中英文對(duì)照
評(píng)論
0/150
提交評(píng)論