聊天程序?qū)嶒瀳蟾鎋第1頁
聊天程序?qū)嶒瀳蟾鎋第2頁
聊天程序?qū)嶒瀳蟾鎋第3頁
聊天程序?qū)嶒瀳蟾鎋第4頁
聊天程序?qū)嶒瀳蟾鎋第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、桂林電子科技大學(xué)計算機網(wǎng)絡(luò)C 實驗報告實驗名稱聊天程序的設(shè)計14008104 班第實驗小組作者 張業(yè)標同作者學(xué)號1400810427成績輔導(dǎo)員簽名實驗日期2016 年 12 月日 輔導(dǎo)員意見1、熟悉Visual C+ 的基本操作;2、基本了解基于對話框的windows 應(yīng)用程序的編寫過程;3、對于Windows Socket 編程建立初步概念,并實現(xiàn)聊天程序的編寫?!緦嶒炓蟆?、 能編寫基于對話框的windows 應(yīng)用程序;能用 Visual C+中的MFC CSocket類,實現(xiàn)網(wǎng)絡(luò)傳輸數(shù)據(jù);制作實用的局域網(wǎng)一對一聊天程序;【實驗原理】Windows Socket 和套接口的基本概念網(wǎng)際協(xié)議

2、(Internet Protocol , IP)是一種用于互聯(lián)網(wǎng)的網(wǎng)絡(luò)協(xié)議,已廣為人知。它可以廣泛用于大多數(shù)計算機操作系統(tǒng)上,也可用于大多數(shù)局域網(wǎng)LAN(比如小型辦公網(wǎng)絡(luò),小型宿舍網(wǎng)絡(luò))和廣域網(wǎng)WAN(例如互聯(lián)網(wǎng))。從它的設(shè)計來看,IP是一個無連接的協(xié)議,并不能保證數(shù)據(jù)投遞萬無一失。兩個上層協(xié)議(TCP和 UDP)依賴IP協(xié)議進行數(shù)據(jù)通信。如果希望在Microsoft Windows 下通過TCP和 UDP協(xié)議建立網(wǎng)絡(luò)應(yīng)用程序,則需要使用Winsock 套接口編程技術(shù)。套接口,就是指向傳輸提供者的句柄。Win32 中,套接口不同于文件描述符,所以它是一個獨立的類型SOCKET。 Windows

3、 Socket 描述并定義了一個Microsoft Windows 的網(wǎng)絡(luò)編程界面,它是從Unix Socket的基礎(chǔ)上發(fā)展而來的,為Windows TCP/IP提供了一個BSD型的套接字規(guī)范,除與4.3BSD Unix Socket完全兼容外,還包括一個擴充文件,通過一組附加的 API 實現(xiàn) Windows 式 (即事件驅(qū)動)的編程風(fēng)格;而 Winsock 則是在 Microsoft Windows中進行網(wǎng)絡(luò)應(yīng)用程序設(shè)計的接口。Windows 在 Internet 支配域中的TCP/IP協(xié)議定義了Winsock網(wǎng)絡(luò)編程規(guī)范,融入了許多新特點。使用Socket 的目的是使用戶在網(wǎng)絡(luò)協(xié)議上工作而

4、不必對該網(wǎng)絡(luò)協(xié)議有非常深入的了解。此外,編寫的程序還可被迅速地移植到任何支持SocketWinsock 提供了一種可為指定傳輸協(xié)議打開、計算和關(guān)閉會話的能力。在 Windows 下,TCP/IP上層模型在很大程度上與用戶的Winsock 應(yīng)用有關(guān);換言之, 用戶的 Winsock 應(yīng)用控制了會話的方方面面,必要時,還會根據(jù)程序的需要格式化數(shù)據(jù)。 套接口有三種類型:流式套接口、數(shù)據(jù)報套接口及原始套接口。 流式套接口定義了一種可靠的面向連接的服務(wù)(利用TCP協(xié)議), 實現(xiàn)了無差錯無重復(fù)的順序數(shù)據(jù)傳輸。數(shù)據(jù)報套接口定義了一種無連接的服務(wù)(UDP) ,數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保

5、證可靠和無差錯。原始套接口允許對低層協(xié)議如IP和 ICMP直接訪問,主要用于新的網(wǎng)絡(luò)協(xié)議實現(xiàn)的測試等。 無連接服務(wù)器一般都是面向事務(wù)處理,一個請求、一個應(yīng)答就完成了客戶程序與服務(wù)程序之間的相互作用。套接口工作過程如下:服務(wù)器啟動,通過調(diào)用socket( )建立一個套接口,然后調(diào)用bind( )將該套接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用accept( )來接收連接??蛻粼诮⑻捉涌诤笳{(diào)用 connect( )和服務(wù)器建立連接。連接一旦建立,客戶機和服務(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ò)中,計算機都分配有一個IP 地址,用一個32 位二進制數(shù)來表示,正式的稱呼是“Ipv4 地址” ??蛻魴C需要通過TCP或 UDP和服務(wù)器通信時,必須指定服務(wù)器的IP地址和服務(wù)端口號。另外,服務(wù)器打算偵聽接入客戶機請求時,也必須指定一個IP 地址和一個端口號。在選擇端口時,應(yīng)特別小心,因為有些可用端口號是為“已知的”(即固定的)服務(wù)保留的,如文件傳輸協(xié)議和超文本傳輸協(xié)議,即FTP( 21 號端口)和HTTP(一般為8080 端口) 。 “已知的協(xié)議”,即固定協(xié)議,采用的端口由“互聯(lián)網(wǎng)編號分配認證(IANA)”控制和分配,RFC 1700

7、中說明的編號。從本質(zhì)上說,端口可分為3 類: “已知”端口、已注冊端口、動態(tài)和(或)私用端口?!耙阎倍丝? 1023,由IANA控制,是在UNIX中為固定服務(wù)保留的。( 2)已注冊的端口1024 49151,由IANA 列出來的,供普通用戶的普通用戶進程或程序使用。( 3)動態(tài)和(或)私用端口49152 65535.普通用戶應(yīng)選擇1024 49151 之間的已注冊端口,從而避免端口號已被另一個應(yīng)用或系統(tǒng)服務(wù)所用。此外,49152 65535 間的端口可自由使用,因為IANA在這些端口上沒有注冊服務(wù)。MFC對 Socket編程的封裝類簡介Microsoft Windows Class Libr

8、ary ( MFC)中提供了較高級封裝的類來實現(xiàn)網(wǎng)絡(luò)通信。圖4-1 給出了CSocket類的繼承關(guān)系。CObjectCAsyncSocketCSocket 圖 4-1CAsyncSocket類封裝了Windows Sockets API 函數(shù),提供了較低層的與Windows Sockets對話接口,一般適用于有相當水平的網(wǎng)絡(luò)編程者使用,可方便地進行低層的網(wǎng)絡(luò)事件通知及信息回叫控制等操作。CSocket類派生于CAsyncSocket,它繼承了父類中一些常用易懂的Windows Sockets API函數(shù), 并對 CAsyncSocket中低層的較難控制的一些API 函數(shù)或成員函數(shù)進行了處理,使

9、得網(wǎng)絡(luò)傳輸簡捷易用,同時它支持模塊化的后臺信息處理,解決了CAsyncScoket中較難克服的多線程處理。下面介紹用Visual C在windows 中實現(xiàn) Socket類型成員函數(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)選定一端口,默認值0。nSocketType: 為套接字類型SOCK_STREAM或 SOCK_DGRAM。 SOCK_STREAM表示為流套接字 (本實驗使用基于TCP連接的流套接字編程), SOCK_DGRAM表示為數(shù)據(jù)報套接字,默認值為SOCK_STREAM。lEvent:標識該Socket 要完成哪種工作,默認值為FD_READ|FD_WRITE| FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLO。SE

11、lpszSocketAddress: 一個指向字符串的指針,該字符串包含了被連接套接口的網(wǎng)絡(luò)地址。一個帶點的數(shù)據(jù),如“”,默認值為NULL。注意:CSocket中,WinsockAPI 的初始化 ( socket) 和綁定 ( bind) 兩部分工作都完成了。BOOL Listen(int nConnectionBacklog=5)該函數(shù)的作用是等待Socket 請求, 如果調(diào)用成功,則返回非零值;否則返回值為0。 Listen僅對那些支持連接的套接字起作用,也就是SOCK_STREAM類型的套接字。在進程應(yīng)答連接并把它放到等待隊列時,套接字被置成被動模式( passive mode) 。 本

12、函數(shù)一般由那些一次可以用多個連接的服務(wù)器使用(或任何需要接受連接的應(yīng)用)。nConnectionBacklog:表示等待隊列的長度,默認值為最大值5,有效值為1 5。BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort)該函數(shù)的作用是提出連接請求。其中:lpszHostAddress:對象連接的套接字的網(wǎng)絡(luò)地址、機器名,如 HYPERLINK .dn .dn ,或以句點分隔的數(shù)字,如“00”。nHostPort:為接受請求進程的網(wǎng)絡(luò)地址和Socket端口號。注意: Connect 函數(shù)還有另一個版本:BOOL Connect(const SOC

13、KADDR *lpSockAddr, intnSockAddrLen);具體用法可以參閱MSDN Library 中關(guān)于CAnyscSocket類的闡述。virtual void Close()該函數(shù)的作用是關(guān)閉該Socket。三、利用CSocket進行傳輸?shù)妮o助類簡介、 CSocketFile 類CSocketFile繼承自CFile類, 用在基于Windows Socket 的網(wǎng)絡(luò)上傳輸數(shù)據(jù)。首先, 將一個建立連接的CSocket對象實例作為參數(shù)進行初始化,然后,將已經(jīng)初始化的CSocket對象連接到 CArchive 對象上,接著將數(shù)據(jù)串行化,以使用MFC系列來簡化發(fā)送和接受數(shù)據(jù),最終實

14、現(xiàn)利用網(wǎng)絡(luò)的Socket傳輸和本機上的流傳輸一樣簡單。成員函數(shù):CSocketFile用到的成員函數(shù)只有構(gòu)造函數(shù)。CSocketFile: : CSocketFile( CSocket *pSocket, BOOL bArchiveCompatible= true) ;其中: pSocket:連接到CSocketFile對象的套接口。bArchiveCompatible :指示該文件對象是否與一個CArchive對象一起使用。只有當希望在單機方式下來使用這個CSocketFile對象時,才傳遞FALSE。 因為僅有CSocketFile類實例本身沒有什么意義,所以通常將其置為TRUE。說明:此

15、成員函數(shù)用來構(gòu)造一個CSocketFile對象。當此對象超出范圍或被刪除時,它的析構(gòu)函數(shù)將使它自己從插槽對象上分離。 注意:一個CSocketFile對象也可以在沒有CAchive對象的情況下作為一個(受限制的)文件來使用。缺省情況下,CSocketFile構(gòu)造函數(shù)的bArchiceCompatible 參數(shù)是TRUE, 它表明此文件對象與一個檔案一起使用。要在沒有檔案的情況下使用該文件對象,則給 bArchiceCompatible 參數(shù)傳遞FALSE。在“檔案兼容”模式下,一個CSocketFile 對象可以提供更好的表現(xiàn),并減少出現(xiàn)“死鎖”的幾率。、 CArchive 類CAchive類

16、沒有基類。CArchive允許以永久二進制(通常為磁盤存儲)的形式保存一個對象的復(fù)雜網(wǎng)絡(luò),它可以從永久存儲中裝載對象,并在內(nèi)存中重新構(gòu)造它們。使數(shù)據(jù)永久保留的過程就叫做“串行化”。一般可以把一個CArchive對象看作一個二進制流,可以將它和輸入流 iostream 類的用法進行比較。CArchive 對象一般和一個文件類關(guān)聯(lián)(CFile 類或CSocketFile類) 。 輸入輸出流是加工處理ASCII字符, 而 CArchive類的用處是高效、無冗余地處理二進制數(shù)據(jù)。在 CArchive 類中,重載了提取()和插入(value;aroutvalue;aroutvalue;注意事項:利用CA

17、rchive 類進行網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)牟僮鞴倘环奖阒庇^,但是如果編寫的程序是和別人的程序進行通信的話,就要注意對方的程序是否也使用了CArchive 類,否則會造成數(shù)據(jù)相互不能識別。五、使用CSocket類的同步問題和解決方法有了上面的理論基礎(chǔ),就可以自己設(shè)計實現(xiàn)網(wǎng)絡(luò)通信了。可以做到基于阻塞發(fā)送和接受二進制數(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) ;接著我們再分析一下各個類中提到的常用方法的同步特性:Listen( .) :執(zhí)行后無論有無連接,立即返回。Connect( ) :如果服務(wù)器端有端口正在監(jiān)聽,則立即成功返回,如果沒有,則過幾秒鐘后將顯示無法連接。Accept( ) : Listen 函數(shù)返回后可以執(zhí)行此函數(shù),但是此函數(shù)是基于阻塞的,只要客戶機 connect 連接并且端口正確,則立即成功返回并建立連接;若遲遲監(jiān)聽不到連接,則不斷阻塞,直到連接成功或者強行關(guān)閉。Send( ) :調(diào)用后就將數(shù)據(jù)保存在socket 緩沖區(qū)中,立即返回。Receive( ) :和 Accept 一樣的阻塞,直到能從socke

19、t 緩沖區(qū)成功讀取到nBufLen 長度的數(shù)據(jù)。按照上述分析,讀者可能會考慮這樣的兩個問題:1 )監(jiān)聽的時候,如果客戶端遲遲沒有連接,則監(jiān)聽方執(zhí)行到Accept 則阻塞不能相應(yīng)。2)在用 Receive接受數(shù)據(jù)時,若遲遲得不到發(fā)送的數(shù)據(jù),也阻塞不能響應(yīng)。顯然,帶有這兩個問題的軟件是不能被接受的。CSocket類里的 OnReceive和 OnAccept消息處理函數(shù)(繼承自CAsyncSocket類)可以解決上述兩個問題,其原理是:1 ) OnAccept(): Listen 過后,若監(jiān)聽到客戶機有連接,則產(chǎn)生消息調(diào)用OnAccept(),一般可以在此函數(shù)里面調(diào)用Accept 便可避免監(jiān)聽時的

20、阻塞。virtural void OnAccept ( int nErrorCode ) : nErrorCode 為套接字上最近的錯誤代碼,此成員函數(shù)可用的錯誤代碼有:0:函數(shù)成功地執(zhí)行并返回。WSAENETDOWN: Windows Socket檢測到網(wǎng)絡(luò)系統(tǒng)故障。說明由框架調(diào)用,通知監(jiān)聽套接字現(xiàn)在可以調(diào)用Accept 成員函數(shù)來接收掛起的連接請求(有connect 請求進入)。2) OnReceive():建立連接后,若檢測到Socket 緩沖區(qū)里有數(shù)據(jù)到達,便自動調(diào)用OnReceive(),在此函數(shù)里面使用Receive接收就可避免接受數(shù)據(jù)的阻塞。virtural void OnRec

21、eive ( int nErrorCode ) : nErrorCode 為套接字上最近的錯誤代碼,此成員函數(shù)可用的錯誤代碼有:0:函數(shù)成功地執(zhí)行并返回。WSAENETDOWN: Windows Socket檢測到網(wǎng)絡(luò)系統(tǒng)故障。說明由框架調(diào)用,通知套接字緩沖區(qū)中有數(shù)據(jù),可以調(diào)用成員函數(shù)Receive取出。【實驗內(nèi)容與步驟】在上述實驗原理的基礎(chǔ)上,以點對點通信的聊天程序為例實現(xiàn)網(wǎng)絡(luò)通信,客戶機/服務(wù)器模式是socket 點對點網(wǎng)絡(luò)程序的典型模式。使用的面向連接的TCP連接套接字是MFC 的典型方式。其實現(xiàn)步驟為:1、創(chuàng)建兩個對話框程序,分別為服務(wù)器端和客戶端;2、啟動服務(wù)器端程序;3、創(chuàng)建套接字

22、后等待客戶的連接;4、客戶啟動,創(chuàng)建套接字,然后和服務(wù)器連接;5、連接建立后,客戶機和服務(wù)器可以通過建立的套接字連接進行信息通信。聊天工具設(shè)計、需求、 建立MFC工程、 插入對話框右側(cè)對話框,左側(cè)工具欄一、設(shè)計對話框界面1.設(shè)置對話框?qū)傩?、靜態(tài)文本控件3.編輯控件3.組框 4.單選框5.復(fù)選框6.列表框7.組合框PS:更改控件的ID 號和標題CChatDlg ,類名的第一個C 字母代表一個“類(class)Classname 中出現(xiàn) CChartDlg,表明類已經(jīng)添加成功。3、 為對話框中的控件添加變量接步驟(2) ,開始:點擊Member Variables 選項卡,表中列出ID 控件,4、為所有控件添加變量如圖所示:5、控件變量的意義:6、 CChatDlg.cpp 文件中對成員函數(shù)變量進行初始化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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論