版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、本章要求本章要求:第第6 6章章 套接字編程套接字編程 u了解網(wǎng)絡(luò)的基本結(jié)構(gòu)u了解TCP/IP協(xié)議u理解套接字的概念u掌握如何使用套接字函數(shù)進(jìn)行網(wǎng)絡(luò)程序開發(fā)u掌握如何使用MFC類庫(kù)進(jìn)行網(wǎng)絡(luò)程序開發(fā)6.1.1 OSI參考模型6.1.2 IP地址6.1.3 地址解析6.1.4 域名系統(tǒng)6.1.5 TCP/IP協(xié)議6.1.6 端口 6.1 6.1 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)6.1.1 OSI6.1.1 OSI參考模型參考模型 開發(fā)式系統(tǒng)互聯(lián)(Open System Interconnection,OSI)是國(guó)際標(biāo)準(zhǔn)化組織(ISO)為了實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)的標(biāo)準(zhǔn)化而頒布的參考模型。OSI參考模型采用分層的
2、劃分原則,將網(wǎng)絡(luò)中的數(shù)據(jù)傳輸劃分為7層,每一層使用下層的服務(wù),并向上層提供服務(wù)。表6-1描述了OSI參考模型的結(jié)構(gòu)。OSI參考模型6.1.2 IP6.1.2 IP地址地址 為了使網(wǎng)絡(luò)上的計(jì)算機(jī)能夠彼此識(shí)別對(duì)方,每臺(tái)計(jì)算機(jī)都需要一個(gè)IP地址來標(biāo)識(shí)自己。IP地址由IP協(xié)議規(guī)定,由32位的二進(jìn)制數(shù)表示。最新的IPv6協(xié)議將IP地址升為128位,這使得IP地址更加廣泛,能夠很好地解決目前IP地址緊缺的問題。但是IPv6協(xié)議距離實(shí)際應(yīng)用還有一段距離,目前多數(shù)操作系統(tǒng)和應(yīng)用軟件都是以32位的IP地址為基準(zhǔn)。 32位的IP地址主要分為兩部分,即前綴和后綴。前綴表示計(jì)算機(jī)所屬的物理網(wǎng)絡(luò),后綴確定該網(wǎng)絡(luò)上的唯一
3、一臺(tái)計(jì)算機(jī)。在互聯(lián)網(wǎng)上,每一個(gè)物理網(wǎng)絡(luò)都有一個(gè)唯一的網(wǎng)絡(luò)號(hào)。根據(jù)網(wǎng)絡(luò)號(hào)的不同,可以將IP地址分為5類,即A類、B類、C類、D類和E類。其中,A類、B類和C類屬于基本類,D類用于多播發(fā)送,E類屬于保留。表6-2描述了各類IP地址的范圍。6.1.3 6.1.3 地址解析地址解析 地址解析是指將計(jì)算機(jī)的協(xié)議地址解析為物理地址,即MAC地址,又稱為媒體設(shè)備地址。通常,在網(wǎng)絡(luò)上由地址解析協(xié)議ARP來實(shí)現(xiàn)地址解析。下面以本地網(wǎng)絡(luò)上的兩臺(tái)計(jì)算機(jī)通信為例介紹ARP協(xié)議解析地址的過程。 假設(shè)主機(jī)A和主機(jī)B處于同一個(gè)物理網(wǎng)絡(luò)上,主機(jī)A的IP為1,主機(jī)B的IP為3,當(dāng)主機(jī)
4、A與主機(jī)B進(jìn)行通信時(shí),主機(jī)B的IP地址3將按如下步驟被解析為物理地址。(1)主機(jī)A從本地ARP緩存中查找IP為3對(duì)應(yīng)的物理地址。用戶可以在命令窗口中輸入“arp -a”命令查看ARP緩存,如圖6-1所示。圖6-1 本地ARP緩存(2)如果主機(jī)A在ARP緩存中沒有發(fā)現(xiàn)3映射的物理地址,將發(fā)送ARP請(qǐng)求幀到本地網(wǎng)絡(luò)上的所有主機(jī),在ARP請(qǐng)求幀中包含了主機(jī)A的物理地址和IP地址。(3)本地網(wǎng)絡(luò)上的其他主機(jī)接收到ARP請(qǐng)求幀后,檢查是否與自己的IP地址匹配,如果不匹配,則丟棄ARP請(qǐng)求幀。如果主機(jī)B發(fā)現(xiàn)與自己的IP地址匹配,則將主機(jī)A的
5、物理地址和IP地址添加到自己的ARP緩存中,然后主機(jī)B將自己的物理地址和IP地址發(fā)送到主機(jī)A,當(dāng)主機(jī)A接收到主機(jī)B發(fā)來的信息,將以這些信息更新ARP緩存。(4)當(dāng)主機(jī)B的物理地址確定后,主機(jī)A即可與主機(jī)B通信。6.1.4 6.1.4 域名系統(tǒng)域名系統(tǒng) 雖然使用IP地址可以標(biāo)識(shí)網(wǎng)絡(luò)中的計(jì)算機(jī),但是IP地址容易混淆,并且不容易記憶,人們更傾向于使用主機(jī)名來標(biāo)識(shí)IP地址。由于在Internet上存在許多計(jì)算機(jī),為了防止主機(jī)名相同,Internet管理機(jī)構(gòu)采取了在主機(jī)名后加上后綴名的方法標(biāo)識(shí)一臺(tái)主機(jī),其后綴名被稱為域名。為了能夠利用域名進(jìn)行不同主機(jī)間的通信,需要將域名解析為IP地址,稱之為域名解析。
6、域名解析是通過域名服務(wù)器來完成的。假如主機(jī)A的本地域名服務(wù)器是,根域名服務(wù)器是 ;所要訪問的主機(jī) B 的域名為 ,域名服務(wù)器為。當(dāng)主機(jī) A 通過域名 訪問主機(jī) B 時(shí),將發(fā)送解析域名的報(bào)文;本地域名服務(wù)器收到請(qǐng)求后,查詢本地緩存,假設(shè)沒有該記錄,則本地域名服務(wù)器將向根域名服務(wù)器發(fā)出請(qǐng)求解析域名;根域名服務(wù)器收到請(qǐng)求后查詢本地記錄,如果發(fā)現(xiàn)“ NS ”信息,將給出的IP地址,并將結(jié)果返回給主機(jī)A的本地域名服務(wù)器,當(dāng)本地域名服務(wù)器收到信息后,會(huì)向主機(jī)B的域名服務(wù)器發(fā)送解析域名的報(bào)文;當(dāng)域名服務(wù)器收到請(qǐng)求后,開始查詢本地的記錄,發(fā)現(xiàn)“ A 211.119.X.X” 。類似的信息,則將結(jié)果返回給主機(jī)A
7、的本地域名服務(wù)器。6.1.5 TCP/IP6.1.5 TCP/IP協(xié)議協(xié)議 TCP/IP(Transmission Control Protocal/Internet Protocal,傳輸控制協(xié)議/網(wǎng)際協(xié)議)協(xié)議是互聯(lián)網(wǎng)上最流行的協(xié)議,它能夠?qū)崿F(xiàn)互聯(lián)網(wǎng)上不同類型操作系統(tǒng)的計(jì)算機(jī)相互通信。對(duì)于網(wǎng)絡(luò)開發(fā)人員來說,必須了解TCP/IP協(xié)議的結(jié)構(gòu)。TCP/IP協(xié)議將網(wǎng)絡(luò)分為4層,分別對(duì)應(yīng)于OSI參考模型的7層結(jié)構(gòu)。表6-3列出了TCP/IP協(xié)議與OSI參考模型的對(duì)應(yīng)關(guān)系。 TCP/IP協(xié)議結(jié)構(gòu)層次 TCP/IP協(xié)議 OSI參考模型 應(yīng)用層(包括Telnet、FTP、SNTP協(xié)議) 會(huì)話層、表示層和應(yīng)
8、用層傳輸層(包括TCP、UDP協(xié)議) 傳輸層 網(wǎng)絡(luò)層(包括ICMP、IP、ARP等協(xié)議) 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層 物理層和數(shù)據(jù)鏈路層 從表中可以發(fā)現(xiàn),TCP/IP協(xié)議不是單個(gè)協(xié)議,而是一個(gè)協(xié)議簇,它包含有多種協(xié)議,其中主要的協(xié)議有網(wǎng)際協(xié)議(IP)和傳輸控制協(xié)議(TCP)等。下面介紹TCP/IP主要協(xié)議的結(jié)構(gòu)。1 1TCPTCP協(xié)議協(xié)議傳輸控制協(xié)議TCP是一種提供可靠數(shù)據(jù)傳輸?shù)耐ㄐ艆f(xié)議,它是TCP/IP體系結(jié)構(gòu)中傳輸層上的協(xié)議。在發(fā)送數(shù)據(jù)時(shí),應(yīng)用層的數(shù)據(jù)傳輸?shù)絺鬏攲?,加上TCP的首部,數(shù)據(jù)就構(gòu)成了報(bào)文。報(bào)文是網(wǎng)絡(luò)層IP的數(shù)據(jù),如果再加上IP首部,就構(gòu)成了IP數(shù)據(jù)報(bào) 2IPIP協(xié)議協(xié)議IP協(xié)議又稱為網(wǎng)
9、際協(xié)議。它工作在網(wǎng)絡(luò)層,主要提供無鏈接數(shù)據(jù)報(bào)傳輸。IP協(xié)議不保證數(shù)據(jù)報(bào)的發(fā)送,但最大限度地發(fā)送數(shù)據(jù)。 3ICMPICMP協(xié)議協(xié)議ICMP協(xié)議又稱為網(wǎng)際控制報(bào)文協(xié)議,負(fù)責(zé)網(wǎng)絡(luò)上設(shè)備狀態(tài)的發(fā)送和報(bào)文檢查,可以將某個(gè)設(shè)備的故障信息發(fā)送到其他設(shè)備上。 4 4UDPUDP協(xié)議協(xié)議用戶數(shù)據(jù)報(bào)協(xié)議UDP是一個(gè)面向無鏈接的協(xié)議,采用該協(xié)議,兩個(gè)應(yīng)用程序不需要先建立鏈接,它為應(yīng)用程序提供一次性的數(shù)據(jù)傳輸服務(wù)。UDP協(xié)議不提供差錯(cuò)恢復(fù),不能提供數(shù)據(jù)重傳,因此該協(xié)議傳輸數(shù)據(jù)安全性略差。UDP協(xié)議C語(yǔ)言數(shù)據(jù)描述如下:typedef struct HeadUDP WORD SourcePort;/16位源端口號(hào)WORD
10、 DePort;/16位目的端口WORD Len;/16為UDP長(zhǎng)度WORD ChkSum;/16位UDP校驗(yàn)和 HEADUDP;6.1.6 6.1.6 端口端口 在網(wǎng)絡(luò)上,計(jì)算機(jī)是通過IP地址來彼此標(biāo)識(shí)自己的,但是當(dāng)涉及兩臺(tái)計(jì)算機(jī)具體通信時(shí),還會(huì)出現(xiàn)一個(gè)問題如果主機(jī)A中的應(yīng)用程序A1想與主機(jī)B中的應(yīng)用程序B1通信,如何知道主機(jī)A中是A1應(yīng)用程序與主機(jī)B中的應(yīng)用程序通信,而不是主機(jī)A中的其他應(yīng)用程序與主機(jī)B中的應(yīng)用程序通信呢?反之,當(dāng)主機(jī)B接收到數(shù)據(jù)時(shí),又如何知道數(shù)據(jù)是發(fā)往應(yīng)用程序B1的呢?因?yàn)樵谥鳈C(jī)B中可以同時(shí)運(yùn)行多個(gè)應(yīng)用程序。 為了解決上述問題,TCP/IP協(xié)議提出了端口的概念,用于標(biāo)識(shí)通
11、信的應(yīng)用程序。當(dāng)應(yīng)用程序(嚴(yán)格說應(yīng)該是進(jìn)程)與某個(gè)端口綁定后,系統(tǒng)會(huì)將收到的該端口的數(shù)據(jù)送往該應(yīng)用程序。端口是用一個(gè)16位的無符號(hào)整數(shù)值來表示的,范圍為065535。低于256的端口被作為系統(tǒng)的保留端口,用于系統(tǒng)進(jìn)程的通信;不在這一范圍的端口號(hào)被稱為自由端口,可以由進(jìn)程自由使用。6.2.1 套接字概述6.2.2 網(wǎng)絡(luò)字節(jié)順序6.2.3 套接字I/O模式6.2.4 套接字通信過程 6.2 6.2 套接字概述套接字概述 所謂套接字,實(shí)際上是一個(gè)指向傳輸提供者的句柄。在WinSock中,就是通過操作該句柄來實(shí)現(xiàn)網(wǎng)絡(luò)通信和管理的。根據(jù)性質(zhì)和作用的不同,套接字可以分為3種,分別為原始套接字、流式套接字和
12、數(shù)據(jù)包套接字。原始套接字是在WinSock 2規(guī)范中提出的,它能夠使程序開發(fā)人員對(duì)底層的網(wǎng)絡(luò)傳輸機(jī)制進(jìn)行控制,在原始套接字下接收的數(shù)據(jù)中包含有IP頭;流式套接字提供了雙向、有序、可靠的數(shù)據(jù)傳輸服務(wù),該類型套接字在通信前,需要雙方建立連接,大家熟悉的TCP協(xié)議采用的就是流式套接字;與流式套接字對(duì)應(yīng)的是數(shù)據(jù)包套接字,數(shù)據(jù)包套接字提供雙向的數(shù)據(jù)流,但是它不能保證數(shù)據(jù)傳輸?shù)目煽啃?、有序性和無重復(fù)性,UDP協(xié)議采用的就是數(shù)據(jù)包套接字。.1套接字概述套接字概述 不同的計(jì)算機(jī)結(jié)構(gòu)有時(shí)使用不同的字節(jié)順序存儲(chǔ)數(shù)據(jù)。例如,基于 Intel 的計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的順序與Macintosh(Motorol
13、a)計(jì)算機(jī)相反。通常,用戶不必為在網(wǎng)絡(luò)上發(fā)送和接收的數(shù)據(jù)的字節(jié)順序轉(zhuǎn)換擔(dān)心,但在有些情況下必須轉(zhuǎn)換字節(jié)順序。例如,程序中將指定的整數(shù)設(shè)置為套接字的端口號(hào),在綁定端口號(hào)之前,必須將端口號(hào)從主機(jī)順序轉(zhuǎn)換為網(wǎng)絡(luò)順序,有關(guān)轉(zhuǎn)換的函數(shù)將在6.3節(jié)中進(jìn)行介紹。6.2.2 6.2.2 網(wǎng)絡(luò)字節(jié)順序網(wǎng)絡(luò)字節(jié)順序 套接字的I/O(Input/Output)模式有兩種,分別為阻塞模式和非阻塞模式。在阻塞模式下,在I/O操作完成之前,套接字函數(shù)會(huì)一直等待下去,函數(shù)調(diào)用后不會(huì)立即返回。默認(rèn)情況下,套接字為阻塞模式。而在非阻塞模式下,套接字函數(shù)在調(diào)用后會(huì)立刻返回。程序中可以使用ioctlsocket函數(shù)來設(shè)置套接字的I
14、/O模式,有關(guān)該函數(shù)的介紹參見6.3節(jié)。6.2.3 6.2.3 套接字套接字I/OI/O模式模式 套接字程序包含通信的兩端。這兩端可稱為服務(wù)器端和客戶機(jī)端。兩端各建立一個(gè)套接字對(duì)象。 面向連接的通信方法中,通信前,首先服務(wù)器端套接字啟動(dòng)監(jiān)聽(listen),然后由客戶機(jī)端套接字發(fā)出連接請(qǐng)求(Connect),服務(wù)器端觸發(fā)Accept事件,接受連接請(qǐng)求,并在服務(wù)器端再建立一個(gè)客戶套接字對(duì)象,用于接收客戶機(jī)端發(fā)送的數(shù)據(jù)。這樣兩個(gè)實(shí)體間要實(shí)現(xiàn)通信,至少需要三個(gè)套接字對(duì)象。 如果象QQ那樣,實(shí)現(xiàn)多點(diǎn)間的通信。那么可以有一個(gè)服務(wù)器,多個(gè)客戶機(jī)端,服務(wù)器中有一個(gè)監(jiān)聽套接字,每個(gè)客戶機(jī)端各有一個(gè)客戶套接字,
15、當(dāng)一個(gè)客戶機(jī)端向服務(wù)器發(fā)送連接請(qǐng)求后,服務(wù)器端接受連接請(qǐng)求(Accept),并在服務(wù)器端再建立一個(gè)客戶套接字對(duì)象,用于和客戶機(jī)端實(shí)現(xiàn)通信。這樣有n個(gè)客戶機(jī)端,服務(wù)器就要建立n個(gè)客戶套接字。所以n個(gè)實(shí)體間要實(shí)現(xiàn)通信,服務(wù)器端與客戶機(jī)端至少需要2n+1個(gè)套接字對(duì)象。6.2.4 6.2.4 套接字通信過程套接字通信過程 服務(wù)器與客戶機(jī)間的通信過程是服務(wù)器中的客戶套接字與客戶機(jī)端 套接字間的通信。它們中的其中之一發(fā)送數(shù)據(jù)(Send),這時(shí)另一端觸發(fā)receive事件,在該事件中就可以接收數(shù)據(jù)了。 多客戶機(jī)中的兩個(gè)客戶機(jī)要實(shí)現(xiàn)通信,如第i個(gè)客戶機(jī)要將數(shù)據(jù)發(fā)送給第j個(gè)客戶機(jī),過程是:第i個(gè)客戶機(jī)將數(shù)據(jù)發(fā)送
16、給服務(wù)器,服務(wù)器中的第i個(gè)客戶套接字接收該數(shù)據(jù),然后找到服務(wù)器中的第j個(gè)客戶套接字,通過它將數(shù)據(jù)發(fā)送給第j個(gè)客戶機(jī),這樣第j個(gè)客戶機(jī)就可以接收到由第i個(gè)客戶機(jī)發(fā)送的數(shù)據(jù)了。 面向非連接的通信,通信前不需要客戶發(fā)送連接請(qǐng)求,服務(wù)器接受請(qǐng)求的過程,總是認(rèn)為通信雙方處于工作狀態(tài)。用sendto,receivefrom實(shí)現(xiàn)數(shù)據(jù)收發(fā)。6.3.1 套接字函數(shù)介紹6.3.2 基于套接字函數(shù)的網(wǎng)絡(luò)聊天系統(tǒng)6.3 6.3 套接字函數(shù)套接字函數(shù) Windows系統(tǒng)提供的套接字函數(shù)通常封裝在ws2_32.dll動(dòng)態(tài)鏈接庫(kù)中,其頭文件winsock2.h提供了套接字函數(shù)的原型,庫(kù)文件ws2_32.lib提供了 ws2
17、_32.dll動(dòng)態(tài)鏈接庫(kù)的輸出節(jié)。在使用套接字函數(shù)前,用戶需要引用winsock2.h頭文件,并鏈接ws2_32.lib庫(kù)文件。例如:#include winsock2.h/引用頭文件#pragma comment (lib,ws2_32.lib)/鏈接庫(kù)文件此外,在使用套接字函數(shù)前還需要初始化套接字,可以使用WSAStartup函數(shù)來實(shí)現(xiàn)。例如:WSADATA wsd; /定義WSADATA對(duì)象WSAStartup(MAKEWORD(2,2),&wsd);/初始化套接字6.3.1 6.3.1 套接字函數(shù)介紹套接字函數(shù)介紹下面介紹網(wǎng)絡(luò)程序開發(fā)中經(jīng)常使用的套接字函數(shù)。1 1WSAStartupW
18、SAStartup該函數(shù)用于初始化ws2_32.dll動(dòng)態(tài)鏈接庫(kù)。在使用套接字函數(shù)之前,一定要初始化ws2_32.dll動(dòng)態(tài)鏈接庫(kù)。語(yǔ)法格式如下:int WSAStartup ( WORD wVersionRequested,LPWSADATA lpWSAData );wVersionRequested:調(diào)用者使用的Windows Socket的版本,高字節(jié)記錄修訂版本,低字節(jié)記錄主版本。例如,如果Windows Socket的版本為2.1,則高字節(jié)記錄1,低字節(jié)記錄2。lpWSAData:一個(gè)WSADATA結(jié)構(gòu)指針,該結(jié)構(gòu)詳細(xì)記錄了Windows套接字的相關(guān)信息。 2 2socketsock
19、et該函數(shù)用于創(chuàng)建一個(gè)套接字。語(yǔ)法格式如下:SOCKET socket ( int af,int type, int protocol );af:一個(gè)地址家族,通常為AF_INET。type:套接字類型,如果為SOCK_STREAM,表示創(chuàng)建面向鏈接的流式套接字;為SOCK_DGRAM,表示創(chuàng)建面向無鏈接的數(shù)據(jù)報(bào)套接字;為SOCK_RAW,表示創(chuàng)建原始套節(jié)字。對(duì)于這些值,用戶可以在winsock2.h頭文件中找到。potocol:表示套接口所用的協(xié)議,如果用戶不指定,可以設(shè)置為0。返回值:是創(chuàng)建的套接字句柄。3 3bindbind該函數(shù)用于將套接字綁定到指定的端口和地址上。語(yǔ)法格式如下:int
20、 bind (SOCKET s,const struct sockaddr FAR* name,int namelen );s:套接字標(biāo)識(shí)。name:一個(gè)sockaddr結(jié)構(gòu)指針,該結(jié)構(gòu)中包含了要結(jié)合的地址和端口號(hào)。namelen:確定name緩沖區(qū)的長(zhǎng)度。返回值:如果函數(shù)執(zhí)行成功,返回值為0,否則為SOCKET_ERROR。4 4listenlisten該函數(shù)用于將套接字設(shè)置為監(jiān)聽模式。語(yǔ)法格式如下:int listen ( SOCKET s, int backlog);s:套接字標(biāo)識(shí)。backlog:等待連接的最大隊(duì)列長(zhǎng)度。例如,如果backlog被設(shè)置為2,此時(shí)有3個(gè)客戶端同時(shí)發(fā)出連接請(qǐng)
21、求,那么前兩個(gè)客戶端連接會(huì)放置在等待隊(duì)列中,第3個(gè)客戶端會(huì)得到錯(cuò)誤信息。注意:對(duì)于流式套接字,必須處于監(jiān)聽模式才能接收客戶端套接字的連接。5 5acceptaccept該函數(shù)用于接受客戶端的連接。對(duì)于流式套接字,必須處于監(jiān)聽狀態(tài),才能接受客戶端的連接。語(yǔ)法格式如下:SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen );s:一個(gè)套接字,應(yīng)處于監(jiān)聽狀態(tài)。addr:一個(gè)sockaddr_in結(jié)構(gòu)指針,包含一組客戶端的端口號(hào)、IP地址等信息。addrlen:用于接收參數(shù)addr的長(zhǎng)度。返回值:一個(gè)新的套接字,它對(duì)
22、應(yīng)于已經(jīng)接受的客戶端連接,對(duì)于該客戶端的所有后續(xù)操作,都應(yīng)使用這個(gè)新的套接字。6 6closesocketclosesocket該函數(shù)用于關(guān)閉套接字。語(yǔ)法格式如下:int closesocket (SOCKET s);其中,s用于標(biāo)識(shí)一個(gè)套接字。如果參數(shù)s設(shè)置有SO_DONTLINGER選項(xiàng),則調(diào)用該函數(shù)后會(huì)立即返回,但此時(shí)如果有數(shù)據(jù)尚未傳送完畢,會(huì)繼續(xù)傳遞數(shù)據(jù),然后才關(guān)閉套接字。7 7connectconnect該函數(shù)用于發(fā)送一個(gè)連接請(qǐng)求。語(yǔ)法格式如下:int connect (SOCKET s,const struct sockaddr FAR* name,int namelen );s:
23、一個(gè)套接字。name:套接字s想要連接的主機(jī)地址和端口號(hào)。namelen:name緩沖區(qū)的長(zhǎng)度。返回值:如果函數(shù)執(zhí)行成功,返回值為0;否則為SOCKET_ERROR,用戶可以通過WSAGETLASTERROR得到其錯(cuò)誤描述。8 8htonshtons該函數(shù)將一個(gè)16位的無符號(hào)短整型數(shù)據(jù)由主機(jī)排列方式轉(zhuǎn)換為網(wǎng)絡(luò)排列方式。語(yǔ)法格式如下:u_short htons (u_short hostshort );其中,hostshort是一個(gè)主機(jī)排列方式的無符號(hào)短整型數(shù)據(jù)。返回值:16位的網(wǎng)絡(luò)排列方式數(shù)據(jù)。9 9htonlhtonl該函數(shù)將一個(gè)無符號(hào)長(zhǎng)整型數(shù)據(jù)由主機(jī)排列方式轉(zhuǎn)換為網(wǎng)絡(luò)排列方式。語(yǔ)法格式如下
24、:u_long htonl ( u_long hostlong);其中,hostlong表示一個(gè)主機(jī)排列方式的無符號(hào)長(zhǎng)整型數(shù)據(jù)。返回值:32位的網(wǎng)絡(luò)排列方式數(shù)據(jù)。1010inet_addrinet_addr該函數(shù)將一個(gè)由字符串表示的地址轉(zhuǎn)換為32位的無符號(hào)長(zhǎng)整型數(shù)據(jù)。語(yǔ)法格式如下:unsigned long inet_addr (const char FAR * cp);其中,cp表示一個(gè)IP地址的字符串。返回值:32位無符號(hào)長(zhǎng)整數(shù)。1111recvrecv該函數(shù)用于從面向連接的套接字中接收數(shù)據(jù)。語(yǔ)法格式如下:int recv (SOCKET s,char FAR* buf,int len,i
25、nt flags);s:一個(gè)套接字。buf:接收數(shù)據(jù)的緩沖區(qū)。len:buf的長(zhǎng)度。flags:函數(shù)的調(diào)用方式。如果為MSG_PEEK,表示查看傳來的數(shù)據(jù),在序列前端的數(shù)據(jù)會(huì)被復(fù)制一份到返回緩沖區(qū)中,但是這個(gè)數(shù)據(jù)不會(huì)從序列中移走;為MSG_OOB,表示用來處理Out-Of-Band數(shù)據(jù),也就是帶外數(shù)據(jù)。1212sendsend該函數(shù)用于在面向連接方式的套接字間發(fā)送數(shù)據(jù)。語(yǔ)法格式如下:int send (SOCKET s,const char FAR * buf, int len,int flags);s:一個(gè)套接字。buf:存放要發(fā)送數(shù)據(jù)的緩沖區(qū)。len:緩沖區(qū)長(zhǎng)度。flags:函數(shù)的調(diào)用方式
26、。1313selectselect該函數(shù)用來檢查一個(gè)或多個(gè)套接字是否處于可讀、可寫或錯(cuò)誤狀態(tài)。語(yǔ)法格式如下:int select (int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout);1414WSACleanupWSACleanup該函數(shù)用于釋放為ws2_32.dll動(dòng)態(tài)鏈接庫(kù)初始化時(shí)分配的資源。語(yǔ)法格式如下:int WSACleanup (void);1515WSAAsyncSelectWSAAsyncSelect該函數(shù)用
27、于將網(wǎng)絡(luò)中發(fā)生的事件關(guān)聯(lián)到窗口的某個(gè)消息中。語(yǔ)法格式如下:int WSAAsyncSelect (SOCKET s, HWND hWnd,unsigned int wMsg,long lEvent);1616ioctlsocketioctlsocket該函數(shù)用于設(shè)置套接字的I/O模式。語(yǔ)法格式如下:int ioctlsocket(SOCKET s,long cmd,u_long FAR* argp); 在介紹了套接字函數(shù)后,本節(jié)利用套接字函數(shù)設(shè)計(jì)一個(gè)網(wǎng)絡(luò)聊天系統(tǒng)。網(wǎng)絡(luò)聊天系統(tǒng)分為兩部分,即客戶端和服務(wù)器端??蛻舳擞糜诎l(fā)送和顯示數(shù)據(jù),服務(wù)器端則用于轉(zhuǎn)發(fā)客戶端的數(shù)據(jù)。6.3.2 6.3.2 基于套
28、接字函數(shù)的網(wǎng)絡(luò)聊基于套接字函數(shù)的網(wǎng)絡(luò)聊天系統(tǒng)天系統(tǒng) 6.4 MFC6.4 MFC套接字編程套接字編程6.4.1 CAsyncSocket類6.4.2 CSocket類6.4.3 基于TCP協(xié)議的網(wǎng)絡(luò)聊天室系統(tǒng) CAsyncSocket類對(duì)套接字函數(shù)進(jìn)行了簡(jiǎn)單封裝,提供了基于事件的I/O異步模型,使用戶可以方便地處理接收和發(fā)送等事件。但是,用戶需要自己處理網(wǎng)絡(luò)的字節(jié)順序、不同字符集間的轉(zhuǎn)換等問題。下面介紹CAsyncSocket類的主要方法和事件。1 1CreateCreate該方法用于創(chuàng)建一個(gè)Windows套接字,并將其附加到CAsyncSocket類對(duì)象上。語(yǔ)法格式如下:BOOL Creat
29、e(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL)6.4.1 6.4.1 CAayncSocketCAayncSocket類類 2 2GetLastErrorGetLastError該方法用于獲取最后一次操作失敗的狀態(tài)信息。語(yǔ)法格式如下:static int GetLastError(); 3 3GetPeerName
30、GetPeerName該方法用于獲取套接字連接的IP地址信息。語(yǔ)法格式如下:BOOL GetPeerName( CString& rPeerAddress, UINT& rPeerPort );BOOL GetPeerName( SOCKADDR* lpSockAddr, int* lpSockAddrLen ); 4 4AcceptAccept該方法用于接受客戶端的連接。語(yǔ)法格式如下:virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NU
31、LL );5 5BindBind該方法用于將IP地址和端口號(hào)綁定到套接字上。語(yǔ)法格式如下:BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL );BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 6 6ConnectConnect該方法用于發(fā)送一個(gè)連接請(qǐng)求。語(yǔ)法格式如下:BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );BOOL Connect( const SOCKADDR* lpSockA
32、ddr, int nSockAddrLen ); 7 7CloseClose該方法用于關(guān)閉套接字。語(yǔ)法格式如下:virtual void Close();6.4.2 6.4.2 CSocketCSocket類類 CSocket類派生于CAsyncSocket類,該類對(duì)套接字函數(shù)進(jìn)行了更高層次的封裝,并提供了同步技術(shù),用戶可以獨(dú)立使用CSocket類進(jìn)行套接字網(wǎng)絡(luò)程序開發(fā)。下面介紹CSocket類的主要方法。1 1CreateCreate該方法用于創(chuàng)建一個(gè)套接字,將其附加到CSocket類對(duì)象上。語(yǔ)法格式如下:BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM, LPCTSTR lpszSocketAddress= NULL );2 2AttachAttach該方法用于將一個(gè)套接字句柄附加到CSocket類對(duì)象上。語(yǔ)法格式如下:BOOL Attach( SOCKET hSocket );其中,hSocket表示套接字句柄。3 3FromHandleFromHandle該方法根據(jù)套接字句柄獲得CSocket對(duì)象指針。語(yǔ)法格式如下:static CSocket* PASCAL FromHandle( SOCKET hSocke
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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īng)城市七年級(jí)上學(xué)期語(yǔ)文期中試題
- 四年級(jí)數(shù)學(xué)(四則混合運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案匯編
- 分?jǐn)?shù)的初步認(rèn)識(shí)的說課稿
- 蹲踞式跳遠(yuǎn)說課稿初中
- 南京工業(yè)大學(xué)浦江學(xué)院《汽車構(gòu)造(下)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《相交線》初中數(shù)學(xué)說課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《房屋建筑學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 約定工資結(jié)清協(xié)議書(2篇)
- 南京工業(yè)大學(xué)《巖體力學(xué)與工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 對(duì)課件分析教學(xué)課件
- 蘇教版小學(xué)生五年級(jí)上冊(cè)英語(yǔ)期中試卷
- PLC控制的自動(dòng)花樣音樂噴泉系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文
- 建筑公司組織架構(gòu)及崗位職責(zé)
- COPD診療新進(jìn)展
- 精品資料(2021-2022年收藏的)病案管理制度全套
- 低壓工作票(共3頁(yè))
- 2閥門結(jié)構(gòu)和工作原理(上)
- 基礎(chǔ)圖案設(shè)計(jì)(課堂PPT)
- 食堂操作工藝流程圖
- 幼兒園參觀學(xué)?;顒?dòng)方案5篇
- 關(guān)于旅游景區(qū)游客滿意度研究的文獻(xiàn)綜述
評(píng)論
0/150
提交評(píng)論