版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、桂林電子科技大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)C 實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱聊天程序的設(shè)計(jì)14008104 班第實(shí)驗(yàn)小組作者 張業(yè)標(biāo)同作者學(xué)號(hào)1400810427成績輔導(dǎo)員簽名實(shí)驗(yàn)日期2016 年 12 月日 輔導(dǎo)員意見1、熟悉Visual C+ 的基本操作;2、基本了解基于對話框的windows 應(yīng)用程序的編寫過程;3、對于Windows Socket 編程建立初步概念,并實(shí)現(xiàn)聊天程序的編寫?!緦?shí)驗(yàn)要求】、 能編寫基于對話框的windows 應(yīng)用程序;能用 Visual C+中的MFC CSocket類,實(shí)現(xiàn)網(wǎng)絡(luò)傳輸數(shù)據(jù);制作實(shí)用的局域網(wǎng)一對一聊天程序;【實(shí)驗(yàn)原理】Windows Socket 和套接口的基本概念網(wǎng)際協(xié)議
2、(Internet Protocol , IP)是一種用于互聯(lián)網(wǎng)的網(wǎng)絡(luò)協(xié)議,已廣為人知。它可以廣泛用于大多數(shù)計(jì)算機(jī)操作系統(tǒng)上,也可用于大多數(shù)局域網(wǎng)LAN(比如小型辦公網(wǎng)絡(luò),小型宿舍網(wǎng)絡(luò))和廣域網(wǎng)WAN(例如互聯(lián)網(wǎng))。從它的設(shè)計(jì)來看,IP是一個(gè)無連接的協(xié)議,并不能保證數(shù)據(jù)投遞萬無一失。兩個(gè)上層協(xié)議(TCP和 UDP)依賴IP協(xié)議進(jìn)行數(shù)據(jù)通信。如果希望在Microsoft Windows 下通過TCP和 UDP協(xié)議建立網(wǎng)絡(luò)應(yīng)用程序,則需要使用Winsock 套接口編程技術(shù)。套接口,就是指向傳輸提供者的句柄。Win32 中,套接口不同于文件描述符,所以它是一個(gè)獨(dú)立的類型SOCKET。 Windows
3、 Socket 描述并定義了一個(gè)Microsoft Windows 的網(wǎng)絡(luò)編程界面,它是從Unix Socket的基礎(chǔ)上發(fā)展而來的,為Windows TCP/IP提供了一個(gè)BSD型的套接字規(guī)范,除與4.3BSD Unix Socket完全兼容外,還包括一個(gè)擴(kuò)充文件,通過一組附加的 API 實(shí)現(xiàn) Windows 式 (即事件驅(qū)動(dòng))的編程風(fēng)格;而 Winsock 則是在 Microsoft Windows中進(jìn)行網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)的接口。Windows 在 Internet 支配域中的TCP/IP協(xié)議定義了Winsock網(wǎng)絡(luò)編程規(guī)范,融入了許多新特點(diǎn)。使用Socket 的目的是使用戶在網(wǎng)絡(luò)協(xié)議上工作而
4、不必對該網(wǎng)絡(luò)協(xié)議有非常深入的了解。此外,編寫的程序還可被迅速地移植到任何支持SocketWinsock 提供了一種可為指定傳輸協(xié)議打開、計(jì)算和關(guān)閉會(huì)話的能力。在 Windows 下,TCP/IP上層模型在很大程度上與用戶的Winsock 應(yīng)用有關(guān);換言之, 用戶的 Winsock 應(yīng)用控制了會(huì)話的方方面面,必要時(shí),還會(huì)根據(jù)程序的需要格式化數(shù)據(jù)。 套接口有三種類型:流式套接口、數(shù)據(jù)報(bào)套接口及原始套接口。 流式套接口定義了一種可靠的面向連接的服務(wù)(利用TCP協(xié)議), 實(shí)現(xiàn)了無差錯(cuò)無重復(fù)的順序數(shù)據(jù)傳輸。數(shù)據(jù)報(bào)套接口定義了一種無連接的服務(wù)(UDP) ,數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸,是無序的,并且不保
5、證可靠和無差錯(cuò)。原始套接口允許對低層協(xié)議如IP和 ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)的測試等。 無連接服務(wù)器一般都是面向事務(wù)處理,一個(gè)請求、一個(gè)應(yīng)答就完成了客戶程序與服務(wù)程序之間的相互作用。套接口工作過程如下:服務(wù)器啟動(dòng),通過調(diào)用socket( )建立一個(gè)套接口,然后調(diào)用bind( )將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用accept( )來接收連接??蛻粼诮⑻捉涌诤笳{(diào)用 connect( )和服務(wù)器建立連接。連接一旦建立,客戶機(jī)和服務(wù)器之間就可以通過調(diào)用read( )和 write( ) 來發(fā)送和接受數(shù)據(jù)。最后, 待數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用close( )關(guān)閉套接口。在網(wǎng)絡(luò)編程
6、中,掌握端口的概念十分重要。端口:基于TCP/IP協(xié)議的網(wǎng)絡(luò)中,計(jì)算機(jī)都分配有一個(gè)IP 地址,用一個(gè)32 位二進(jìn)制數(shù)來表示,正式的稱呼是“Ipv4 地址” ??蛻魴C(jī)需要通過TCP或 UDP和服務(wù)器通信時(shí),必須指定服務(wù)器的IP地址和服務(wù)端口號(hào)。另外,服務(wù)器打算偵聽接入客戶機(jī)請求時(shí),也必須指定一個(gè)IP 地址和一個(gè)端口號(hào)。在選擇端口時(shí),應(yīng)特別小心,因?yàn)橛行┛捎枚丝谔?hào)是為“已知的”(即固定的)服務(wù)保留的,如文件傳輸協(xié)議和超文本傳輸協(xié)議,即FTP( 21 號(hào)端口)和HTTP(一般為8080 端口) 。 “已知的協(xié)議”,即固定協(xié)議,采用的端口由“互聯(lián)網(wǎng)編號(hào)分配認(rèn)證(IANA)”控制和分配,RFC 1700
7、中說明的編號(hào)。從本質(zhì)上說,端口可分為3 類: “已知”端口、已注冊端口、動(dòng)態(tài)和(或)私用端口?!耙阎倍丝? 1023,由IANA控制,是在UNIX中為固定服務(wù)保留的。( 2)已注冊的端口1024 49151,由IANA 列出來的,供普通用戶的普通用戶進(jìn)程或程序使用。( 3)動(dòng)態(tài)和(或)私用端口49152 65535.普通用戶應(yīng)選擇1024 49151 之間的已注冊端口,從而避免端口號(hào)已被另一個(gè)應(yīng)用或系統(tǒng)服務(wù)所用。此外,49152 65535 間的端口可自由使用,因?yàn)镮ANA在這些端口上沒有注冊服務(wù)。MFC對 Socket編程的封裝類簡介Microsoft Windows Class Libr
8、ary ( MFC)中提供了較高級封裝的類來實(shí)現(xiàn)網(wǎng)絡(luò)通信。圖4-1 給出了CSocket類的繼承關(guān)系。CObjectCAsyncSocketCSocket 圖 4-1CAsyncSocket類封裝了Windows Sockets API 函數(shù),提供了較低層的與Windows Sockets對話接口,一般適用于有相當(dāng)水平的網(wǎng)絡(luò)編程者使用,可方便地進(jìn)行低層的網(wǎng)絡(luò)事件通知及信息回叫控制等操作。CSocket類派生于CAsyncSocket,它繼承了父類中一些常用易懂的Windows Sockets API函數(shù), 并對 CAsyncSocket中低層的較難控制的一些API 函數(shù)或成員函數(shù)進(jìn)行了處理,使
9、得網(wǎng)絡(luò)傳輸簡捷易用,同時(shí)它支持模塊化的后臺(tái)信息處理,解決了CAsyncScoket中較難克服的多線程處理。下面介紹用Visual C在windows 中實(shí)現(xiàn) Socket類型成員函數(shù)(這些成員函數(shù)實(shí)際上是從CAsyncSocket類繼承來的)。成員函數(shù)和參數(shù)說明:BOOL Create(UNIT nsocketPort 0, int nSocketType=SOCK_STREAMl,o ng lEvent =FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE, LPCTSTR lpszSocketAddress=NULL)該函數(shù)用來建立
10、Socket,如果函數(shù)成功,則返回非零值;否則返回值為0。其中:nSocketPort:為所選擇的socket 端口, 一般要大于1023,如果該參數(shù)為0,則由系統(tǒng)選定一端口,默認(rèn)值0。nSocketType: 為套接字類型SOCK_STREAM或 SOCK_DGRAM。 SOCK_STREAM表示為流套接字 (本實(shí)驗(yàn)使用基于TCP連接的流套接字編程), SOCK_DGRAM表示為數(shù)據(jù)報(bào)套接字,默認(rèn)值為SOCK_STREAM。lEvent:標(biāo)識(shí)該Socket 要完成哪種工作,默認(rèn)值為FD_READ|FD_WRITE| FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLO。SE
11、lpszSocketAddress: 一個(gè)指向字符串的指針,該字符串包含了被連接套接口的網(wǎng)絡(luò)地址。一個(gè)帶點(diǎn)的數(shù)據(jù),如“”,默認(rèn)值為NULL。注意:CSocket中,WinsockAPI 的初始化 ( socket) 和綁定 ( bind) 兩部分工作都完成了。BOOL Listen(int nConnectionBacklog=5)該函數(shù)的作用是等待Socket 請求, 如果調(diào)用成功,則返回非零值;否則返回值為0。 Listen僅對那些支持連接的套接字起作用,也就是SOCK_STREAM類型的套接字。在進(jìn)程應(yīng)答連接并把它放到等待隊(duì)列時(shí),套接字被置成被動(dòng)模式( passive mode) 。 本
12、函數(shù)一般由那些一次可以用多個(gè)連接的服務(wù)器使用(或任何需要接受連接的應(yīng)用)。nConnectionBacklog:表示等待隊(duì)列的長度,默認(rèn)值為最大值5,有效值為1 5。BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort)該函數(shù)的作用是提出連接請求。其中:lpszHostAddress:對象連接的套接字的網(wǎng)絡(luò)地址、機(jī)器名,如 HYPERLINK .dn .dn ,或以句點(diǎn)分隔的數(shù)字,如“00”。nHostPort:為接受請求進(jìn)程的網(wǎng)絡(luò)地址和Socket端口號(hào)。注意: Connect 函數(shù)還有另一個(gè)版本:BOOL Connect(const SOC
13、KADDR *lpSockAddr, intnSockAddrLen);具體用法可以參閱MSDN Library 中關(guān)于CAnyscSocket類的闡述。virtual void Close()該函數(shù)的作用是關(guān)閉該Socket。三、利用CSocket進(jìn)行傳輸?shù)妮o助類簡介、 CSocketFile 類CSocketFile繼承自CFile類, 用在基于Windows Socket 的網(wǎng)絡(luò)上傳輸數(shù)據(jù)。首先, 將一個(gè)建立連接的CSocket對象實(shí)例作為參數(shù)進(jìn)行初始化,然后,將已經(jīng)初始化的CSocket對象連接到 CArchive 對象上,接著將數(shù)據(jù)串行化,以使用MFC系列來簡化發(fā)送和接受數(shù)據(jù),最終實(shí)
14、現(xiàn)利用網(wǎng)絡(luò)的Socket傳輸和本機(jī)上的流傳輸一樣簡單。成員函數(shù):CSocketFile用到的成員函數(shù)只有構(gòu)造函數(shù)。CSocketFile: : CSocketFile( CSocket *pSocket, BOOL bArchiveCompatible= true) ;其中: pSocket:連接到CSocketFile對象的套接口。bArchiveCompatible :指示該文件對象是否與一個(gè)CArchive對象一起使用。只有當(dāng)希望在單機(jī)方式下來使用這個(gè)CSocketFile對象時(shí),才傳遞FALSE。 因?yàn)閮H有CSocketFile類實(shí)例本身沒有什么意義,所以通常將其置為TRUE。說明:此
15、成員函數(shù)用來構(gòu)造一個(gè)CSocketFile對象。當(dāng)此對象超出范圍或被刪除時(shí),它的析構(gòu)函數(shù)將使它自己從插槽對象上分離。 注意:一個(gè)CSocketFile對象也可以在沒有CAchive對象的情況下作為一個(gè)(受限制的)文件來使用。缺省情況下,CSocketFile構(gòu)造函數(shù)的bArchiceCompatible 參數(shù)是TRUE, 它表明此文件對象與一個(gè)檔案一起使用。要在沒有檔案的情況下使用該文件對象,則給 bArchiceCompatible 參數(shù)傳遞FALSE。在“檔案兼容”模式下,一個(gè)CSocketFile 對象可以提供更好的表現(xiàn),并減少出現(xiàn)“死鎖”的幾率。、 CArchive 類CAchive類
16、沒有基類。CArchive允許以永久二進(jìn)制(通常為磁盤存儲(chǔ))的形式保存一個(gè)對象的復(fù)雜網(wǎng)絡(luò),它可以從永久存儲(chǔ)中裝載對象,并在內(nèi)存中重新構(gòu)造它們。使數(shù)據(jù)永久保留的過程就叫做“串行化”。一般可以把一個(gè)CArchive對象看作一個(gè)二進(jìn)制流,可以將它和輸入流 iostream 類的用法進(jìn)行比較。CArchive 對象一般和一個(gè)文件類關(guān)聯(lián)(CFile 類或CSocketFile類) 。 輸入輸出流是加工處理ASCII字符, 而 CArchive類的用處是高效、無冗余地處理二進(jìn)制數(shù)據(jù)。在 CArchive 類中,重載了提?。ǎ┖筒迦耄╲alue;aroutvalue;aroutvalue;注意事項(xiàng):利用CA
17、rchive 類進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)牟僮鞴倘环奖阒庇^,但是如果編寫的程序是和別人的程序進(jìn)行通信的話,就要注意對方的程序是否也使用了CArchive 類,否則會(huì)造成數(shù)據(jù)相互不能識(shí)別。五、使用CSocket類的同步問題和解決方法有了上面的理論基礎(chǔ),就可以自己設(shè)計(jì)實(shí)現(xiàn)網(wǎng)絡(luò)通信了??梢宰龅交谧枞l(fā)送和接受二進(jìn)制數(shù)據(jù)。例如:可以Client 端發(fā)送數(shù)據(jù),Server 端接收數(shù)據(jù):Server 端: m_receive(void *lpBuf, int nBufLen, int nFlags=0) ;Clietn 端: m_client(const void *lpBuf, int nBufLen, in
18、t nFlags=0) ;接著我們再分析一下各個(gè)類中提到的常用方法的同步特性:Listen( .) :執(zhí)行后無論有無連接,立即返回。Connect( ) :如果服務(wù)器端有端口正在監(jiān)聽,則立即成功返回,如果沒有,則過幾秒鐘后將顯示無法連接。Accept( ) : Listen 函數(shù)返回后可以執(zhí)行此函數(shù),但是此函數(shù)是基于阻塞的,只要客戶機(jī) connect 連接并且端口正確,則立即成功返回并建立連接;若遲遲監(jiān)聽不到連接,則不斷阻塞,直到連接成功或者強(qiáng)行關(guān)閉。Send( ) :調(diào)用后就將數(shù)據(jù)保存在socket 緩沖區(qū)中,立即返回。Receive( ) :和 Accept 一樣的阻塞,直到能從socke
19、t 緩沖區(qū)成功讀取到nBufLen 長度的數(shù)據(jù)。按照上述分析,讀者可能會(huì)考慮這樣的兩個(gè)問題:1 )監(jiān)聽的時(shí)候,如果客戶端遲遲沒有連接,則監(jiān)聽方執(zhí)行到Accept 則阻塞不能相應(yīng)。2)在用 Receive接受數(shù)據(jù)時(shí),若遲遲得不到發(fā)送的數(shù)據(jù),也阻塞不能響應(yīng)。顯然,帶有這兩個(gè)問題的軟件是不能被接受的。CSocket類里的 OnReceive和 OnAccept消息處理函數(shù)(繼承自CAsyncSocket類)可以解決上述兩個(gè)問題,其原理是:1 ) OnAccept(): Listen 過后,若監(jiān)聽到客戶機(jī)有連接,則產(chǎn)生消息調(diào)用OnAccept(),一般可以在此函數(shù)里面調(diào)用Accept 便可避免監(jiān)聽時(shí)的
20、阻塞。virtural void OnAccept ( int nErrorCode ) : nErrorCode 為套接字上最近的錯(cuò)誤代碼,此成員函數(shù)可用的錯(cuò)誤代碼有:0:函數(shù)成功地執(zhí)行并返回。WSAENETDOWN: Windows Socket檢測到網(wǎng)絡(luò)系統(tǒng)故障。說明由框架調(diào)用,通知監(jiān)聽套接字現(xiàn)在可以調(diào)用Accept 成員函數(shù)來接收掛起的連接請求(有connect 請求進(jìn)入)。2) OnReceive():建立連接后,若檢測到Socket 緩沖區(qū)里有數(shù)據(jù)到達(dá),便自動(dòng)調(diào)用OnReceive(),在此函數(shù)里面使用Receive接收就可避免接受數(shù)據(jù)的阻塞。virtural void OnRec
21、eive ( int nErrorCode ) : nErrorCode 為套接字上最近的錯(cuò)誤代碼,此成員函數(shù)可用的錯(cuò)誤代碼有:0:函數(shù)成功地執(zhí)行并返回。WSAENETDOWN: Windows Socket檢測到網(wǎng)絡(luò)系統(tǒng)故障。說明由框架調(diào)用,通知套接字緩沖區(qū)中有數(shù)據(jù),可以調(diào)用成員函數(shù)Receive取出?!緦?shí)驗(yàn)內(nèi)容與步驟】在上述實(shí)驗(yàn)原理的基礎(chǔ)上,以點(diǎn)對點(diǎn)通信的聊天程序?yàn)槔龑?shí)現(xiàn)網(wǎng)絡(luò)通信,客戶機(jī)/服務(wù)器模式是socket 點(diǎn)對點(diǎn)網(wǎng)絡(luò)程序的典型模式。使用的面向連接的TCP連接套接字是MFC 的典型方式。其實(shí)現(xiàn)步驟為:1、創(chuàng)建兩個(gè)對話框程序,分別為服務(wù)器端和客戶端;2、啟動(dòng)服務(wù)器端程序;3、創(chuàng)建套接字
22、后等待客戶的連接;4、客戶啟動(dòng),創(chuàng)建套接字,然后和服務(wù)器連接;5、連接建立后,客戶機(jī)和服務(wù)器可以通過建立的套接字連接進(jìn)行信息通信。聊天工具設(shè)計(jì)、需求、 建立MFC工程、 插入對話框右側(cè)對話框,左側(cè)工具欄一、設(shè)計(jì)對話框界面1.設(shè)置對話框?qū)傩?、靜態(tài)文本控件3.編輯控件3.組框 4.單選框5.復(fù)選框6.列表框7.組合框PS:更改控件的ID 號(hào)和標(biāo)題CChatDlg ,類名的第一個(gè)C 字母代表一個(gè)“類(class)Classname 中出現(xiàn) CChartDlg,表明類已經(jīng)添加成功。3、 為對話框中的控件添加變量接步驟(2) ,開始:點(diǎn)擊Member Variables 選項(xiàng)卡,表中列出ID 控件,4、為所有控件添加變量如圖所示:5、控件變量的意義:6、 CChatDlg.cpp 文件中對成員函數(shù)變量進(jìn)行初始化CChatDlg:CChatDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatDlg:IDD, pParent)/AFX_DATA_INIT(CC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度餐飲業(yè)SaaS運(yùn)營管理軟件銷售合同3篇
- 2024版物流倉儲(chǔ)中心租賃及運(yùn)營管理合同
- 2025年度銷售合同違約責(zé)任補(bǔ)充協(xié)議
- 年度回轉(zhuǎn)窯式垃圾焚燒爐市場分析及競爭策略分析報(bào)告
- 二零二五版城市更新項(xiàng)目借款合同規(guī)范2篇
- 2024-2025學(xué)年高中歷史專題七近代以來科學(xué)技術(shù)的輝煌7.2追尋生命的起源同步課時(shí)作業(yè)含解析人民版必修3
- 二零二四年倉儲(chǔ)物流園建設(shè)項(xiàng)目融資合同
- 二零二五年度酒店客房安全監(jiān)控服務(wù)合同3篇
- 2025年度林業(yè)生態(tài)補(bǔ)償項(xiàng)目評估合同4篇
- 2025版茅臺(tái)酒經(jīng)銷商培訓(xùn)及銷售技能提升合同3篇
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設(shè)計(jì)原則、計(jì)算和檢驗(yàn)
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 小學(xué)道德與法治學(xué)科高級(一級)教師職稱考試試題(有答案)
- 申請使用物業(yè)專項(xiàng)維修資金征求業(yè)主意見表
- 河北省承德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 實(shí)用性閱讀與交流任務(wù)群設(shè)計(jì)思路與教學(xué)建議
- 應(yīng)急柜檢查表
- 通風(fēng)設(shè)施標(biāo)準(zhǔn)
- 酒店市場營銷教案
- 房屋買賣合同簡單范本 房屋買賣合同簡易范本
- 環(huán)保有限公司營銷策劃方案
評論
0/150
提交評論