




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第15章 網(wǎng)絡(luò)編程隨著Internet的普及,人們的生活已經(jīng)越來(lái)越離不開網(wǎng)絡(luò)。所以,編寫網(wǎng)絡(luò)程序成了每個(gè)開發(fā)人員必不可少的一項(xiàng)基本技能。VC+為編寫網(wǎng)絡(luò)程序提供了多種支持,使我們能更快更方便的的開發(fā)出滿足需要網(wǎng)絡(luò)應(yīng)用程序。通過(guò)本章學(xué)習(xí),讀者也可以編寫出即時(shí)的聊天程序。第15章 網(wǎng)絡(luò)編程隨著Internet的普及,人們的生活已15.1 網(wǎng)絡(luò)編程基礎(chǔ)在使用VC+實(shí)現(xiàn)網(wǎng)絡(luò)編程之前,我們有必要學(xué)習(xí)一下計(jì)算機(jī)網(wǎng)絡(luò)的概念、一些常見的術(shù)語(yǔ)、還有計(jì)算機(jī)網(wǎng)絡(luò)的協(xié)議等網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí)。15.1 網(wǎng)絡(luò)編程基礎(chǔ)在使用VC+實(shí)現(xiàn)網(wǎng)絡(luò)編程之前,我們15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)計(jì)算機(jī)網(wǎng)絡(luò),即相互連接的獨(dú)立自主的計(jì)算機(jī)集合,最
2、簡(jiǎn)單的網(wǎng)絡(luò)形式可以只由兩臺(tái)計(jì)算機(jī)組成,如下圖所示。15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)計(jì)算機(jī)網(wǎng)絡(luò),即相互連接的獨(dú)立自主的15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)在Internet上,為了保證兩臺(tái)主機(jī)進(jìn)行正常的通信,它們需要遵循約定的規(guī)則。我們把這種規(guī)則稱之為協(xié)議。如果A主機(jī)和B主機(jī)采用同樣的協(xié)議,它們之間就可以進(jìn)行通信了。但是主機(jī)之間的通信往往不是單一的,一臺(tái)計(jì)算機(jī)上可能有多個(gè)程序要完成網(wǎng)絡(luò)的通信。例如,我們一邊掛著QQ,一邊還要看電影,一邊還在用迅雷下載東西。那么當(dāng)信息發(fā)送到某個(gè)IP地址的主機(jī)時(shí),應(yīng)該哪個(gè)程序來(lái)接收呢?15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)在Internet上,為了保證兩臺(tái)15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)為了標(biāo)識(shí)計(jì)算機(jī)上運(yùn)行
3、的每個(gè)網(wǎng)絡(luò)應(yīng)用程序,我們提出了端口的概念;每個(gè)網(wǎng)絡(luò)應(yīng)用程序都被分配了一個(gè)端口號(hào)。在發(fā)送數(shù)據(jù)時(shí),除了指定接收數(shù)據(jù)主機(jī)的IP地址外,還要指定端口號(hào)。這樣,在指定IP地址的計(jì)算機(jī)上,將會(huì)由與指定端口號(hào)相對(duì)應(yīng)的網(wǎng)絡(luò)應(yīng)用程序來(lái)接收數(shù)據(jù)。就好像我們打電話,IP地址就像是一個(gè)公司的總機(jī)號(hào)碼,端口號(hào)就相當(dāng)于分機(jī)號(hào)碼。在打電話時(shí),撥通總機(jī)后,還需要轉(zhuǎn)到分機(jī)上,才能找到需要與你通話的人。15.1.1 計(jì)算機(jī)網(wǎng)絡(luò)為了標(biāo)識(shí)計(jì)算機(jī)上運(yùn)行的每個(gè)網(wǎng)絡(luò)應(yīng)用15.1.2 網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)上所有設(shè)備之間通信規(guī)則、標(biāo)準(zhǔn)和約定的集合。不同的計(jì)算機(jī)之間必須使用相同的網(wǎng)絡(luò)協(xié)議才能進(jìn)行通信。TCP/IP協(xié)議是目前在網(wǎng)絡(luò)中應(yīng)用得最廣泛
4、的協(xié)議。TCP/IP是一個(gè)關(guān)于Internet的標(biāo)準(zhǔn),并隨著的Internet廣泛應(yīng)用而被大眾所知,它也成為局域網(wǎng)所使用首選的協(xié)議。TCP/IP是一種分層協(xié)議,它共被分為個(gè)4層次。通過(guò)使用該協(xié)議,可以高效和可靠地實(shí)現(xiàn)各地的計(jì)算機(jī)相互連接。TCP/IP協(xié)議中的核心協(xié)議有TCP(傳輸控制協(xié)議)、UDP(用戶數(shù)據(jù)報(bào)協(xié)議)和IP(因特網(wǎng)協(xié)議)。15.1.2 網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)協(xié)議是網(wǎng)絡(luò)上所有設(shè)備之間通信規(guī)則15.1.2 網(wǎng)絡(luò)協(xié)議1TCP協(xié)議TCP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議)提供一種面向連接的、可靠的字節(jié)流服務(wù)。面向連接意味著
5、兩個(gè)使用TCP的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器)在彼此交換數(shù)據(jù)之前必須先建立一個(gè)TCP連接。該協(xié)議主要用于在主機(jī)間建立一個(gè)虛擬連接,以實(shí)現(xiàn)高可靠性的數(shù)據(jù)包交換。IP協(xié)議可以進(jìn)行IP數(shù)據(jù)包的分割和組裝,但是通過(guò)IP協(xié)議并不能清楚地了解到數(shù)據(jù)包是否順利地發(fā)送給目標(biāo)計(jì)算機(jī)。而使用TCP協(xié)議就不同了,在該協(xié)議傳輸模式中在將數(shù)據(jù)包成功發(fā)送給目標(biāo)計(jì)算機(jī)后,TCP會(huì)要求發(fā)送一個(gè)確認(rèn);如果在某個(gè)時(shí)限內(nèi)沒有收到確認(rèn),那么TCP將重新發(fā)送數(shù)據(jù)包。另外,在傳輸?shù)倪^(guò)程中,如果接收到無(wú)序、丟失以及被破壞的數(shù)據(jù)包,TCP還可以負(fù)責(zé)恢復(fù)。15.1.2 網(wǎng)絡(luò)協(xié)議1TCP協(xié)議15.1.2 網(wǎng)絡(luò)協(xié)議2UDP協(xié)議UDP協(xié)議(Us
6、er Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是OSI參考模型中一種無(wú)連接的傳輸層協(xié)議,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù)。UDP協(xié)議基本上是IP協(xié)議與上層協(xié)議的接口。UDP協(xié)議適用端口分別運(yùn)行在同一臺(tái)設(shè)備上的多個(gè)應(yīng)用程序。15.1.2 網(wǎng)絡(luò)協(xié)議2UDP協(xié)議15.1.2 網(wǎng)絡(luò)協(xié)議3IP協(xié)議IP協(xié)議(Internet Protocol,網(wǎng)絡(luò)之間互連的協(xié)議)是為計(jì)算機(jī)網(wǎng)絡(luò)相互連接進(jìn)行通信而設(shè)計(jì)的協(xié)議。在因特網(wǎng)中,它是能使連接到網(wǎng)上的所有計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)相互通信的一套規(guī)則,規(guī)定了計(jì)算機(jī)在因特網(wǎng)上進(jìn)行通信時(shí)應(yīng)當(dāng)遵守的規(guī)則。任何廠家生產(chǎn)的計(jì)算機(jī)系統(tǒng),只要遵守IP協(xié)議就可以與因特網(wǎng)互連互通。正
7、是因?yàn)橛辛薎P協(xié)議,因特網(wǎng)才得以迅速發(fā)展成為世界上最大的、開放的計(jì)算機(jī)通信網(wǎng)絡(luò)。IP地址可以稱為互聯(lián)網(wǎng)地址或Internet地址,是用來(lái)惟一標(biāo)識(shí)互聯(lián)網(wǎng)上計(jì)算機(jī)的邏輯地址。每臺(tái)連網(wǎng)計(jì)算機(jī)都依靠IP地址來(lái)標(biāo)識(shí)自己,這就很類似于我們的電話號(hào)碼樣的。通過(guò)電話號(hào)碼來(lái)找到相應(yīng)的具體的電話。全世界的電話號(hào)碼都是惟一的,IP地址也是一樣。15.1.2 網(wǎng)絡(luò)協(xié)議3IP協(xié)議15.1.3 OSI參考模型在計(jì)算機(jī)網(wǎng)絡(luò)產(chǎn)生之初,每個(gè)計(jì)算機(jī)廠商都有一套自己的網(wǎng)絡(luò)體系結(jié)構(gòu),它們之間互不兼容。為此,國(guó)際標(biāo)準(zhǔn)化組織(ISO)建立了一個(gè)專門的機(jī)構(gòu)來(lái)研究一種標(biāo)準(zhǔn)的網(wǎng)絡(luò)體系結(jié)構(gòu),來(lái)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的連接。這個(gè)標(biāo)準(zhǔn)即開放系統(tǒng)互聯(lián)體系結(jié)構(gòu)(O
8、pen Systems Interconnection,簡(jiǎn)稱OSI)。它定義了連接不同類型計(jì)算機(jī)的標(biāo)準(zhǔn)框架。15.1.3 OSI參考模型在計(jì)算機(jī)網(wǎng)絡(luò)產(chǎn)生之初,每個(gè)計(jì)算15.1.3 OSI參考模型OSI參考模型分為層,分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層,如下圖所示。15.1.3 OSI參考模型OSI參考模型分為層,分別是15.1.4 TCP/IP參考模型TCP/IP協(xié)議(Transfer Control Protocol/Internet Protocol)叫做傳輸控制/網(wǎng)際協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,這個(gè)協(xié)議是Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。TCP/IP參考模型分
9、為四個(gè)層次:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層。在TCP/IP參考模型中,去掉了OSI參考模型中的會(huì)話層和表示層(這兩層的功能被合并到應(yīng)用層實(shí)現(xiàn))。同時(shí)將OSI參考模型中的數(shù)據(jù)鏈路層和物理層合并為鏈路層。15.1.4 TCP/IP參考模型TCP/IP協(xié)議(Tra15.1.4 TCP/IP參考模型TCP/IP與OSI參考模型的對(duì)應(yīng)關(guān)系如下圖所示。15.1.4 TCP/IP參考模型TCP/IP與OSI參考15.1.5 網(wǎng)絡(luò)編程相關(guān)概念1.端口按照OSI七層參考模型,傳輸層提供進(jìn)程通信的能力。為了表示通信實(shí)體中進(jìn)行通信的進(jìn)程,TCP/IP協(xié)議提出了協(xié)議端口(Protocol Port)的概念,簡(jiǎn)稱端
10、口。端口是一種抽象的軟件結(jié)構(gòu)(包括一些數(shù)據(jù)結(jié)構(gòu)和I/O緩沖區(qū))。應(yīng)用程序通過(guò)系統(tǒng)調(diào)用與某端口建立連接(Binding)后,傳輸層傳給該端口的數(shù)據(jù)都被相應(yīng)的進(jìn)程所接收,相應(yīng)進(jìn)程發(fā)給傳輸層的數(shù)據(jù)都要通過(guò)該端口輸出。端口使用一個(gè)16位的數(shù)字表示,所以它的范圍為065535,1024以下的端口號(hào)保留給預(yù)定義的服務(wù)。例如,http使用的80端口。所以我們?cè)诰帉懢W(wǎng)絡(luò)應(yīng)用程序時(shí),要為程序制定1024以上的端口號(hào)。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念1.端口15.1.5 網(wǎng)絡(luò)編程相關(guān)概念2.套接字(Socket)為了能夠方便的開發(fā)網(wǎng)絡(luò)應(yīng)用軟件,由美國(guó)伯克利大學(xué)在UNIX上推出了一種應(yīng)用程序訪問(wèn)通信協(xié)議的操作系統(tǒng)調(diào)用
11、套接字(Socket)。Socket的出現(xiàn),使程序員可以很方便地訪問(wèn)TCP/IP,從而開發(fā)各種網(wǎng)絡(luò)應(yīng)用程序。隨著UNIX的應(yīng)用推廣,套接字在編寫網(wǎng)絡(luò)軟件中得到了極大的普及。后來(lái)套接字又被引進(jìn)了Windows等操作系統(tǒng),稱為開發(fā)網(wǎng)絡(luò)應(yīng)用程序非常有效快捷的工具。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念2.套接字(Socket)15.1.5 網(wǎng)絡(luò)編程相關(guān)概念3.網(wǎng)絡(luò)字節(jié)順序字節(jié)順序是指占內(nèi)存多于一個(gè)字節(jié)的數(shù)據(jù)在內(nèi)存中的存放順序。通常有兩種順序,一種是低字節(jié)數(shù)據(jù)存放在內(nèi)存低地址處,高字節(jié)數(shù)據(jù)存放在內(nèi)存高地址處;另一種是高字節(jié)數(shù)據(jù)存放在低地址處,低字節(jié)數(shù)據(jù)存放在高地址處。由于不同的計(jì)算機(jī)存放多字節(jié)值的順序不同,為
12、保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。TCP/IP協(xié)議使用16位整數(shù)和32位整數(shù)的高位先存(即起始地址存放高位字節(jié))格式,它們均被含在協(xié)議頭文件中。在網(wǎng)絡(luò)中不同主機(jī)進(jìn)行通信時(shí),要同一采用網(wǎng)絡(luò)字節(jié)順序。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念3.網(wǎng)絡(luò)字節(jié)順序15.1.5 網(wǎng)絡(luò)編程相關(guān)概念4.半相關(guān)與全相關(guān)在網(wǎng)絡(luò)通信中,可以使用一個(gè)三元組(協(xié)議、地址、端口號(hào))來(lái)表示通信雙方的一端。這樣的一個(gè)三元組叫做一個(gè)半相關(guān)(Half-association)。一個(gè)完整的通信,需要由兩個(gè)進(jìn)程完成??梢允褂靡粋€(gè)五元組(協(xié)議、本地地址、本地端口號(hào)、遠(yuǎn)地地址、遠(yuǎn)地端口號(hào))來(lái)表示通信的雙方。這樣一個(gè)五元組叫做一個(gè)全相
13、關(guān)。兩個(gè)通信實(shí)體要進(jìn)行通信,必須使用同一種高層協(xié)議。例如,通信雙方必須同時(shí)使用TCP或UDP協(xié)議。兩個(gè)協(xié)議相同的半相關(guān)才能組合成一個(gè)合適的全相關(guān)。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念4.半相關(guān)與全相關(guān)15.1.5 網(wǎng)絡(luò)編程相關(guān)概念5.客戶機(jī)/服務(wù)器模式在TCP/IP網(wǎng)絡(luò)中,通信的兩個(gè)進(jìn)程之間通常使用客戶機(jī)/服務(wù)器模式(Client/Server),即客戶端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器收到請(qǐng)求后提供相應(yīng)的服務(wù)。客戶機(jī)/服務(wù)器模式的建立主要基于兩點(diǎn)。首先是建立網(wǎng)絡(luò)的起因是網(wǎng)絡(luò)中軟硬件資源、運(yùn)算能力和信息不均等,需要共享。從而造成了擁有眾多資源的主機(jī)提供服務(wù),資源較少的客戶請(qǐng)求服務(wù)這一非對(duì)等關(guān)系。其次是網(wǎng)間進(jìn)
14、程通信完全異步,互相通信的進(jìn)程間既不存在父子關(guān)系,也不存在共享緩沖區(qū)。因此需要一種機(jī)制為希望通信的進(jìn)程間建立聯(lián)系,為二者的數(shù)據(jù)交換提供同步。這就是基于客戶機(jī)/服務(wù)器模式的TCP/IP。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念5.客戶機(jī)/服務(wù)器模式15.1.5 網(wǎng)絡(luò)編程相關(guān)概念客戶機(jī)/服務(wù)器模式在操作過(guò)程中采用的是主動(dòng)請(qǐng)求方式。首先服務(wù)器方要先啟動(dòng),并等待連接請(qǐng)求,其過(guò)程如下:(1)打開一通信通道并告知本地主機(jī),它愿意在某一個(gè)公認(rèn)地址上接收客戶請(qǐng)求;(2)等待客戶請(qǐng)求;(3)接收到服務(wù)請(qǐng)求,處理該請(qǐng)求,并發(fā)送應(yīng)答信號(hào);(4)返回第二步,等待其他客戶請(qǐng)求;(5)關(guān)閉服務(wù)器。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念客戶
15、機(jī)/服務(wù)器模式在操作過(guò)程15.1.5 網(wǎng)絡(luò)編程相關(guān)概念客戶方需要主動(dòng)連接到服務(wù)器,具體步驟如下:(1)打開一通信通道,并連接服務(wù)器指定的端口;(2)向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文;(3)等待并接收應(yīng)答;(4)請(qǐng)求結(jié)束后關(guān)閉通信通道。15.1.5 網(wǎng)絡(luò)編程相關(guān)概念客戶方需要主動(dòng)連接到服務(wù)器,15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持微軟提供了在Windows下進(jìn)行網(wǎng)絡(luò)編程的結(jié)構(gòu)Windows Socket API。使用VC+除了能利用Windows Socket API進(jìn)行編程外,MFC還提供了專門的類讓開發(fā)者能更方便的進(jìn)行網(wǎng)絡(luò)應(yīng)用程序的開發(fā)。下面我們來(lái)介紹VC+對(duì)網(wǎng)絡(luò)編程的支持有哪些。15.1.6 VC+
16、對(duì)網(wǎng)絡(luò)編程的支持微軟提供了在Wind15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持1.Windows Socket APIWindows環(huán)境下進(jìn)行網(wǎng)絡(luò)程序設(shè)計(jì)的最基本方法是應(yīng)用Windows Sockets實(shí)現(xiàn)進(jìn)程間的通信。為此微軟提供了大量基于Windows Sockets的通信API,如WinSock API、WinInet API和ISAPI,并一直致力于開發(fā)更快、更容易的通信API。在Visual C+中,完全可以利用這些API函數(shù)進(jìn)行網(wǎng)絡(luò)程序的開發(fā),而不比附加任何其他內(nèi)容。15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持1.Windows 15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持2.MFC WinSock類雖
17、然Windows Socket API提供了強(qiáng)大的網(wǎng)絡(luò)編程接口,但是只用它們來(lái)進(jìn)行編程是一件非常煩瑣的事情。為了方便程序員的開發(fā),MFC對(duì)Windows Socket API進(jìn)行了封裝。15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持2.MFC WinS15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持3.WinInet支持一個(gè)Internet客戶端程序的目的是通過(guò)像HTTP、FTP等Internet協(xié)議來(lái)存取服務(wù)器的信息。WinInet是指由Microsoft提供的Internet函數(shù)接口,這些函數(shù)由WinInet.dll動(dòng)態(tài)庫(kù)提供,程序員利用這些函數(shù)能方便地使用HTTP、FTP和gopher訪問(wèn)Internet,甚
18、至還能進(jìn)行Finger查詢和Whois查詢。為了更方便的開發(fā)Internet應(yīng)用程序,MFC將WinInet函數(shù)封裝在一個(gè)類庫(kù)中。在編寫WinInet客戶端應(yīng)用程序時(shí),既可以直接使用Win32函數(shù),也可以使用WinInet類庫(kù)。MFC提供了13個(gè)WinInet類,它們實(shí)現(xiàn)了一系列Internet訪問(wèn)功能。15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持3.WinInet支15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持4.MAPI支持MAPI是Messaging Application Progrmming Interface的縮寫。MAPI提供了一組函數(shù),能夠支持郵件或郵件撰寫應(yīng)用程序的開發(fā)。MFC并沒有封裝整個(gè)M
19、API函數(shù)集,但是可以在MFC應(yīng)用程序中直接使用MAPI函數(shù)。在MFC的CDocument類中提供了OnFileSendMail和OnUpdateFileSendMail函數(shù)支持郵件的發(fā)送。15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持4.MAPI支持15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持5.ISAPI支持ISAPI是Internet Server API的簡(jiǎn)寫,它提供了一種簡(jiǎn)單有效的方法來(lái)擴(kuò)展與ISAPI兼容的Web服務(wù)器。ISAPI服務(wù)器擴(kuò)展是可以被HTTP服務(wù)器加載和調(diào)用的DLL。Internet服務(wù)器擴(kuò)展也稱為Internet服務(wù)器應(yīng)用程序(ISA),用于增強(qiáng)符合Internet服務(wù)器API(IS
20、API)的服務(wù)器功能。ISA通過(guò)瀏覽器應(yīng)用程序調(diào)用,并且將相似的功能提供給通用網(wǎng)關(guān)接口應(yīng)用程序。15.1.6 VC+對(duì)網(wǎng)絡(luò)編程的支持5.ISAPI支持15.2 WinSock API編程WinSock API是微軟提供的網(wǎng)絡(luò)編程接口。VC+對(duì)網(wǎng)絡(luò)編程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,WinSock API是TCP/IP網(wǎng)絡(luò)環(huán)境里,也是Internet上進(jìn)行開發(fā)最為通用的API。15.2 WinSock API編程WinSock API15.2.1 WinSock API常用函數(shù)1.WSAStartup函數(shù)WSAStartup函數(shù)主要實(shí)現(xiàn)加載套接字庫(kù)
21、和套接字庫(kù)版本協(xié)商的功能,也就是確定將使用socket版本。該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)1.WSASt15.2.1 WinSock API常用函數(shù)WSADATA結(jié)構(gòu)的定義如下所示:15.2.1 WinSock API常用函數(shù)WSADATA15.2.1 WinSock API常用函數(shù)2.socket函數(shù)在完成對(duì)套接字庫(kù)的加載之后,就可以調(diào)用socket函數(shù)來(lái)創(chuàng)建套接字了。該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)2.socke15.2.1 WinSock API常用函數(shù)3.bind函數(shù)在創(chuàng)建了套接字后,我們通過(guò)bind()函數(shù)
22、將該套接字綁定到本地的某個(gè)地址及端口上。該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)3.bind函15.2.1 WinSock API常用函數(shù)sockaddr結(jié)構(gòu)的定義如下所示:15.2.1 WinSock API常用函數(shù)sockadd15.2.1 WinSock API常用函數(shù)由于實(shí)際要求的只是內(nèi)存區(qū),所以對(duì)于不同的協(xié)議家族,用不同的結(jié)構(gòu)來(lái)替代sockaddr。除了sa_family外,sockaddr是按網(wǎng)絡(luò)字節(jié)順序表示的。在基于TCP/IP的socket中,可以用sockaddr_in結(jié)構(gòu)來(lái)表示,以方便填寫地址信息。sockaddr_in的結(jié)構(gòu)定義如下所示。15
23、.2.1 WinSock API常用函數(shù)由于實(shí)際要求的15.2.1 WinSock API常用函數(shù)4.inet_addr函數(shù)和inet_ntoa函數(shù)inet_addr()函數(shù)實(shí)現(xiàn)將字符型IP地址轉(zhuǎn)換為Internet地址值。其函數(shù)原型聲明如下所示。15.2.1 WinSock API常用函數(shù)4.inet_15.2.1 WinSock API常用函數(shù)inet_ntoa函數(shù)完成相反的轉(zhuǎn)換,它接受一個(gè)in_addr結(jié)構(gòu)體類型的參數(shù)并返回一個(gè)以點(diǎn)分十進(jìn)制格式表示的IP地址字符串。該函數(shù)的原型聲明如下所示:15.2.1 WinSock API常用函數(shù)inet_nt15.2.1 WinSock API常用
24、函數(shù)5.listen函數(shù)當(dāng)服務(wù)器端的Socket對(duì)象綁定之后,必須建立一個(gè)監(jiān)聽的隊(duì)列來(lái)接收客戶端的連接請(qǐng)求。listen()函數(shù)的作用是將指定的套接字設(shè)置為監(jiān)聽模式。其函數(shù)原型聲明如下所示。15.2.1 WinSock API常用函數(shù)5.liste15.2.1 WinSock API常用函數(shù)6.accept函數(shù)當(dāng)客戶端提出連接請(qǐng)求時(shí),服務(wù)器端通過(guò)調(diào)用accept()函數(shù)接受客戶端的連接請(qǐng)求。該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)6.accep15.2.1 WinSock API常用函數(shù)7.send函數(shù)和sendto函數(shù)我們利用send函數(shù)來(lái)發(fā)送數(shù)據(jù),send函數(shù)
25、通過(guò)一個(gè)已建立連接的套接字來(lái)完成數(shù)據(jù)的發(fā)送。其函數(shù)原型聲明如下所示。15.2.1 WinSock API常用函數(shù)7.send函15.2.1 WinSock API常用函數(shù)如果我們想向一個(gè)特定的目的方式發(fā)送數(shù)據(jù),可使用sendto()函數(shù)。其函數(shù)原型聲明如下所示。15.2.1 WinSock API常用函數(shù)如果我們想向一15.2.1 WinSock API常用函數(shù)8.recv函數(shù)和recvfrom函數(shù)recv函數(shù)實(shí)現(xiàn)從建立連接或綁定的socket中接收數(shù)據(jù),該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)8.recv函15.2.1 WinSock API常用函數(shù)如果我們要接
26、收一個(gè)數(shù)據(jù)報(bào)信息并保存源地址,可通過(guò)recvfrom()函數(shù)實(shí)現(xiàn)。該函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)如果我們要接收15.2.1 WinSock API常用函數(shù)10.connect函數(shù)connet()函數(shù)用于建立一個(gè)連接到一個(gè)指定的socket。其函數(shù)原型聲明如下所示。15.2.1 WinSock API常用函數(shù)10.conn15.2.1 WinSock API常用函數(shù)11.htonl函數(shù)和htons函數(shù)htonl函數(shù)實(shí)現(xiàn)將32為主機(jī)字節(jié)順序的長(zhǎng)整型數(shù)據(jù)轉(zhuǎn)換為TCP/IP網(wǎng)絡(luò)字節(jié)順序數(shù)據(jù)。其函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)1
27、1.hton15.2.1 WinSock API常用函數(shù)htons函數(shù)實(shí)現(xiàn)將16位主機(jī)字節(jié)順序的整型數(shù)據(jù)轉(zhuǎn)換為TCP/IP網(wǎng)絡(luò)字節(jié)順序數(shù)據(jù)。其函數(shù)的原型聲明如下所示。15.2.1 WinSock API常用函數(shù)htons函數(shù)15.2.2 基于TCP套接字編程步驟TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的傳輸層協(xié)議?;赥CP套接字編程服務(wù)器端程序編寫步驟如下:(1)創(chuàng)建套接字(socket)。(2)將一個(gè)套接字綁定到一個(gè)本地地址和端口上(bind)。(3)將套接字設(shè)為監(jiān)聽模式,用來(lái)接收客戶請(qǐng)求(listen)。(4)等待客戶請(qǐng)求,當(dāng)接收到請(qǐng)求后接受連接請(qǐng)求,并返回一個(gè)新的對(duì)應(yīng)于此次連接的套
28、接字(accept)。(5)用返回的套接字和客戶端進(jìn)行通信(send/recv)。(6)返回,等待另一個(gè)客戶請(qǐng)求。(7)關(guān)閉套接字。15.2.2 基于TCP套接字編程步驟TCP(傳輸控制協(xié)議15.2.2 基于TCP套接字編程步驟基于TCP的套接字編程,客戶端程序編寫步驟如下:(1)創(chuàng)建套接字(socket)。(2)向服務(wù)器發(fā)送連接請(qǐng)求(connect)。(3)和服務(wù)器端進(jìn)行通信(send/recv)。(4)關(guān)閉套接字。15.2.2 基于TCP套接字編程步驟基于TCP的套接字編15.2.3 基于TCP套接字編程實(shí)例下面我們編寫一個(gè)基于對(duì)話框的TCP套接字程序,使讀者對(duì)上面講解的知識(shí)有更深刻的理解
29、。首先編寫服務(wù)端程序,然后再編寫客戶端程序。1.編寫服務(wù)端程序2.編寫客戶端程序15.2.3 基于TCP套接字編程實(shí)例下面我們編寫一個(gè)基于15.2.4 基于UDP套接字編程步驟UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是一種無(wú)連接的客戶/服務(wù)器通信協(xié)議。它不能保證數(shù)據(jù)報(bào)會(huì)被對(duì)方完全接收,也不保證他們抵達(dá)的順序與發(fā)出時(shí)是一樣的,但它的速度要比TCP/IP協(xié)議快的多。所以,對(duì)于某些不需要保證數(shù)據(jù)完整準(zhǔn)確的場(chǎng)合或數(shù)據(jù)量很大的場(chǎng)合,通常蠶蛹UDP通信。15.2.4 基于UDP套接字編程步驟UDP(用戶數(shù)據(jù)報(bào)協(xié)15.2.4 基于UDP套接字編程步驟對(duì)于UDP套接字編程來(lái)說(shuō),它的服務(wù)器端和客戶端概念不太強(qiáng)化,所以我們稱之為
30、接收端和發(fā)送端。接收端程序的編寫步驟如下:(1)創(chuàng)建套接字(socket)。(2)將套接字綁定到一個(gè)本地地址和端口上(bind)。(3)等待接收數(shù)據(jù)(revcfrom)。(4)關(guān)閉套接字。15.2.4 基于UDP套接字編程步驟對(duì)于UDP套接字編程15.2.5 基于UDP套接字編程實(shí)例下面,我們編寫一個(gè)基于UDP協(xié)議的聊天軟件。就像QQ客戶端一樣,實(shí)現(xiàn)兩臺(tái)電腦互相發(fā)送和接收消息的功能。15.2.5 基于UDP套接字編程實(shí)例下面,我們編寫一個(gè)基15.3 利用MFC WinSock類編程在實(shí)際的應(yīng)用中,我們已經(jīng)幾乎不在使用Windows Socket API來(lái)編寫網(wǎng)絡(luò)程序了。因?yàn)镸FC為編程人員封裝
31、了CAsyncSocket和CSocket兩個(gè)類,使我們能夠更方便的實(shí)現(xiàn)網(wǎng)絡(luò)通信。本節(jié)將針對(duì)這兩個(gè)重要的類做簡(jiǎn)要的介紹。15.3 利用MFC WinSock類編程在實(shí)際的應(yīng)用中,15.3.1 MFC WinSock類編程概述直接利用Windows Sockets API編程,需要了解網(wǎng)絡(luò)編程的框架,使用起來(lái)比較復(fù)雜。為了簡(jiǎn)化套接字網(wǎng)絡(luò)編程,MFC提供了兩個(gè)套接字類,對(duì)Windows Sockets API進(jìn)行了不同層次的封裝。一個(gè)是CAsyncSocket類、另一個(gè)是CSocket類。15.3.1 MFC WinSock類編程概述直接利用Wi15.3.1 MFC WinSock類編程概述CAs
32、yncSocket類對(duì)Windows Sockets API進(jìn)行了很底層次的封裝,它的成員函數(shù)和Windows Sockets API的函數(shù)調(diào)用直接對(duì)應(yīng)。一個(gè)CAsyncSocket對(duì)象代表一個(gè)套接字。如果對(duì)網(wǎng)絡(luò)通信的細(xì)節(jié)比較熟悉,仍希望充分利用Windows Sockets API編程的靈活性,可以選擇CAsyncSocket進(jìn)行編程。但是必須自己處理阻塞問(wèn)題、字節(jié)順序問(wèn)題和字符串轉(zhuǎn)換問(wèn)題。15.3.1 MFC WinSock類編程概述CAsync15.3.1 MFC WinSock類編程概述CSocket類是CAsyncSocket類派生出來(lái)的,是對(duì)Windows Sockets API的
33、高級(jí)封裝。CSocket類繼承了CAsyncSocket類的許多成員函數(shù),這些函數(shù)封裝了Windows套接字應(yīng)用程序編程接口。在兩個(gè)套接字類中,這些函數(shù)的用法是一致的。而CSocket類的高級(jí),主要表現(xiàn)在3個(gè)方面:一、CSocket類可結(jié)合CArchive類來(lái)使用套接字;二、CSocket類管理了通信的許多方面,如字節(jié)順序問(wèn)題和字符串轉(zhuǎn)換問(wèn)題。而這些在使用原始API或CAsyncSocket類時(shí),都必須由用戶自己來(lái)解決。所以,CSocket類要比CAsyncSocket類更容易使用。三、CSocket類為Windows消息的后臺(tái)處理提供了阻塞的工作模式,而這也是CArchive同步操作所必須的
34、。15.3.1 MFC WinSock類編程概述CSocke15.3.1 MFC WinSock類編程概述至于這兩個(gè)類的主要區(qū)別也就是前者是異步通信,后者是同步通信;前者是非阻塞模式,后者是阻塞模式。下面我們只對(duì)CSocket類中的常用到的一些方法及其使用做簡(jiǎn)要介紹。15.3.1 MFC WinSock類編程概述至于這兩個(gè)類15.3.2 CSocket類常用到的方法1.AfxSocketInit()函數(shù)該函數(shù)作用為初始化WinSock,在使用CSocket前一定要先調(diào)用該函數(shù),否則使用CSocket會(huì)出錯(cuò)。就算主線程調(diào)用了該函數(shù),在子線程下使用CSocket也要先調(diào)用該函數(shù)。該函數(shù)的原型聲明為如下。15.3.2 CSocket類常用到的方法1.AfxSoc15.3.2 CSocket類常用到的方法2.Create()方法通過(guò)調(diào)用Create()方法創(chuàng)建底層套接字句柄,并且決定套接字對(duì)象的具體特性。其函數(shù)的原型聲明如下所示。15.3.2 CSocket類常用到的方法2.Create15.3.2 CSocket類常用到的方法3.
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年工業(yè)有機(jī)廢氣凈化設(shè)備項(xiàng)目合作計(jì)劃書
- 2025年臥式螺旋離心脫水機(jī)項(xiàng)目建議書
- 2025年錫基合金焊粉項(xiàng)目建議書
- 2025年微波介質(zhì)陶瓷項(xiàng)目建議書
- 2025黑龍江省建筑安全員A證考試題庫(kù)及答案
- 2025年教師職業(yè)發(fā)展述職報(bào)告范文
- 2025上海市建筑安全員B證考試題庫(kù)及答案
- 2025甘肅省安全員《C證》考試題庫(kù)及答案
- 2025重慶市建筑安全員-A證考試題庫(kù)附答案
- 體育場(chǎng)館用水協(xié)議書范文
- 醫(yī)院DRG付費(fèi)知識(shí)培訓(xùn)課件
- 高考語(yǔ)文一輪復(fù)習(xí):文學(xué)類文本閱讀練習(xí)
- (2024年)保安培訓(xùn)圖文課件
- 中醫(yī)養(yǎng)生保健素養(yǎng)知識(shí)講座
- 雷達(dá)干擾技術(shù)概述
- JBT 7901-2023 金屬材料實(shí)驗(yàn)室均勻腐蝕全浸試驗(yàn)方法 (正式版)
- 2024年南通建筑電工證考試題模擬試題電工培訓(xùn)試題及答案(全國(guó)通用)
- 2025小學(xué)道德與法治開學(xué)第一課(思想政治理論教育課)
- 基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 教案
- 動(dòng)畫分鏡頭腳本設(shè)計(jì)課件
- 江蘇省成人高等教育畢業(yè)生登記表
評(píng)論
0/150
提交評(píng)論