聊天程序實驗報告_第1頁
聊天程序實驗報告_第2頁
聊天程序實驗報告_第3頁
聊天程序實驗報告_第4頁
聊天程序實驗報告_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、桂林電子科技大學計算機網絡C 實驗報告實驗名稱聊天程序的設計14008104 班第實驗小組作者 張業標同作者學號1400810427成績輔導員簽名實驗日期2016 年 12 月日 輔導員意見1、熟悉Visual C+ 的基本操作;2、基本了解基于對話框的windows 應用程序的編寫過程;3、對于Windows Socket 編程建立初步概念,并實現聊天程序的編寫。【實驗要求】、 能編寫基于對話框的windows 應用程序;能用 Visual C+中的MFC CSocket類,實現網絡傳輸數據;制作實用的局域網一對一聊天程序;【實驗原理】Windows Socket 和套接口的基本概念網際協議

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

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

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

5、證可靠和無差錯。原始套接口允許對低層協議如IP和 ICMP直接訪問,主要用于新的網絡協議實現的測試等。 無連接服務器一般都是面向事務處理,一個請求、一個應答就完成了客戶程序與服務程序之間的相互作用。套接口工作過程如下:服務器啟動,通過調用socket( )建立一個套接口,然后調用bind( )將該套接口和本地網絡地址聯系在一起,再調用accept( )來接收連接。客戶在建立套接口后調用 connect( )和服務器建立連接。連接一旦建立,客戶機和服務器之間就可以通過調用read( )和 write( ) 來發送和接受數據。最后, 待數據傳送結束后,雙方調用close( )關閉套接口。在網絡編程

6、中,掌握端口的概念十分重要。端口:基于TCP/IP協議的網絡中,計算機都分配有一個IP 地址,用一個32 位二進制數來表示,正式的稱呼是“Ipv4 地址” 。客戶機需要通過TCP或 UDP和服務器通信時,必須指定服務器的IP地址和服務端口號。另外,服務器打算偵聽接入客戶機請求時,也必須指定一個IP 地址和一個端口號。在選擇端口時,應特別小心,因為有些可用端口號是為“已知的”(即固定的)服務保留的,如文件傳輸協議和超文本傳輸協議,即FTP( 21 號端口)和HTTP(一般為8080 端口) 。 “已知的協議”,即固定協議,采用的端口由“互聯網編號分配認證(IANA)”控制和分配,RFC 1700

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

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

9、得網絡傳輸簡捷易用,同時它支持模塊化的后臺信息處理,解決了CAsyncScoket中較難克服的多線程處理。下面介紹用Visual C在windows 中實現 Socket類型成員函數(這些成員函數實際上是從CAsyncSocket類繼承來的)。成員函數和參數說明: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)該函數用來建立

10、Socket,如果函數成功,則返回非零值;否則返回值為0。其中:nSocketPort:為所選擇的socket 端口, 一般要大于1023,如果該參數為0,則由系統選定一端口,默認值0。nSocketType: 為套接字類型SOCK_STREAM或 SOCK_DGRAM。 SOCK_STREAM表示為流套接字 (本實驗使用基于TCP連接的流套接字編程), SOCK_DGRAM表示為數據報套接字,默認值為SOCK_STREAM。lEvent:標識該Socket 要完成哪種工作,默認值為FD_READ|FD_WRITE| FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLO。SE

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

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

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

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

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

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

17、rchive 類進行網絡數據傳輸的操作固然方便直觀,但是如果編寫的程序是和別人的程序進行通信的話,就要注意對方的程序是否也使用了CArchive 類,否則會造成數據相互不能識別。五、使用CSocket類的同步問題和解決方法有了上面的理論基礎,就可以自己設計實現網絡通信了。可以做到基于阻塞發送和接受二進制數據。例如:可以Client 端發送數據,Server 端接收數據:Server 端: m_receive(void *lpBuf, int nBufLen, int nFlags=0) ;Clietn 端: m_client(const void *lpBuf, int nBufLen, in

18、t nFlags=0) ;接著我們再分析一下各個類中提到的常用方法的同步特性:Listen( .) :執行后無論有無連接,立即返回。Connect( ) :如果服務器端有端口正在監聽,則立即成功返回,如果沒有,則過幾秒鐘后將顯示無法連接。Accept( ) : Listen 函數返回后可以執行此函數,但是此函數是基于阻塞的,只要客戶機 connect 連接并且端口正確,則立即成功返回并建立連接;若遲遲監聽不到連接,則不斷阻塞,直到連接成功或者強行關閉。Send( ) :調用后就將數據保存在socket 緩沖區中,立即返回。Receive( ) :和 Accept 一樣的阻塞,直到能從socke

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

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

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

22、后等待客戶的連接;4、客戶啟動,創建套接字,然后和服務器連接;5、連接建立后,客戶機和服務器可以通過建立的套接字連接進行信息通信。聊天工具設計、需求、 建立MFC工程、 插入對話框右側對話框,左側工具欄一、設計對話框界面1.設置對話框屬性2、靜態文本控件3.編輯控件3.組框 4.單選框5.復選框6.列表框7.組合框PS:更改控件的ID 號和標題CChatDlg ,類名的第一個C 字母代表一個“類(class)Classname 中出現 CChartDlg,表明類已經添加成功。3、 為對話框中的控件添加變量接步驟(2) ,開始:點擊Member Variables 選項卡,表中列出ID 控件,4、為所有控件添加變量如圖所示:5、控件變量的意義:6、 CChatDlg.cpp 文件中對成員函數變量進行初始化CChatDlg:CChatDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatDlg:IDD, pParent)/AFX_DATA_INIT(CC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論