Winsock編程實驗_第1頁
Winsock編程實驗_第2頁
Winsock編程實驗_第3頁
Winsock編程實驗_第4頁
Winsock編程實驗_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Winsock實驗 主要內容: 1.實驗目的和要求 2.Winsock和套接口概念 3.套接口工作原理 4.點對點通信實驗 實驗目的和要求 o 【實驗目的【實驗目的】 (1)熟悉Visual C+的基本操作。 (2)基本了解基于對話框的windows應用程序的編寫 過程。 (3)對于Windows Socket編程建立初步概念。 o 【實驗要求【實驗要求】 (1)應用VisualC+中MFCCSocket類,實現(xiàn)網(wǎng)絡數(shù) 據(jù)傳輸。 (2)制作實用的局域網(wǎng)數(shù)據(jù)傳輸程序。 Winsock和套接口概念 o 基本概念基本概念 網(wǎng)際協(xié)議(Intemet Protocol,IP)是一種用于互聯(lián) 網(wǎng)的網(wǎng)絡協(xié)議

2、。從它的設計看來,它是一個無連接的協(xié) 議,并不能保證數(shù)據(jù)投遞萬無一失。兩個上層協(xié)議(TCP 和UDP)依賴IP協(xié)議進行數(shù)據(jù)通信。Winsock規(guī)范定義如 何使用API與TCP/IP協(xié)議族連接,以實現(xiàn)網(wǎng)絡應用程序 間的通訊。多個應用程序通過winsock中的API實現(xiàn)相互 之間通訊。如圖示 如果希望在Microsoft Windows下通過TCP和UDP協(xié) 議建立網(wǎng)絡應用程序,則需要使用Winsock套接口編程 技術。 從圖中看出Socket是應用層與TCP/IP協(xié)議 族通信的中間軟件層,是一組接口,對用戶來 說就是讓Socket去組織數(shù)據(jù),以符合指定的協(xié) 議。 套接口,就是一個指向傳輸提供者的

3、句柄。 Win32中,套接口不同于文件描述符,所以它是 一個獨立的類型SOCKET。套接字接口 (SocketInterface)就是一種API , API實現(xiàn)的 作用是把API定義的具體操作和對象映射到協(xié)議 定義的抽象服務集上。 socket提供三種類型的套接字: 1.流式套接字(SOCK_STREAM) n 提供一個面向連接的、可靠的數(shù)據(jù)傳輸服務, 數(shù)據(jù)無差錯、無重復地發(fā)送,且按發(fā)送順序接 收。 n 內設流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作 是字節(jié)流,無長度限制。 n 文件傳輸協(xié)議(FTP)即使用流式套接字。 2.數(shù)據(jù)報式套接字(SOCK_DGRAM) n 提供一個無連接服務。 n 數(shù)據(jù)報

4、以獨立包形式被發(fā)送,不提供無錯保證,數(shù) 據(jù)可能丟失或重復,且接收順序混亂。 n 網(wǎng)絡文件系統(tǒng)(NFS)使用數(shù)據(jù)報式套接字。 3.原始式套接字(SOCK_RAW) n 該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。 n 常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有服務中配置的 新設備 套接口工作原理 o 由socket提供三種類型的套接字知道服務方式主要 有兩種,一種是面向連接,一種是無連接的。面向連接 服務器處理的請求往往比較復雜,不是一來一去的請求 應答所能解決的,而且往往是并發(fā)服務器。無連接服務 器一般都是面向事務處理的,一個請求、一個應答就完 成了客戶程序與服務程序之間的相互作用。使用面向連 接

5、的套接口編程,可以通過圖來表示。 其中socket()、bind()、listen()、accept()、 send()、recv()、sendto()、recvfrom()、 closesocket()函數(shù)是TCP和UDP通信常使用的API函數(shù)。 套接口工作原理 套接口工作原理 o 套接口工作過程如下:服務器首先啟動,通過調用 socket()建立一個套接口,然后調用bind()將該套 接口和本地網(wǎng)絡地址聯(lián)系在一起,再調用listen() 使套接口做好偵聽的準備,并規(guī)定它的請求隊列的 長度,之后,調用accept()來接收連接。客戶在建 立套接口后就可調用connect()和服務器建立連接。

6、 連接一旦建立,客戶機和服務器之間就可以通過調 用read()和write()來發(fā)送和接收數(shù)據(jù)。最后,待 數(shù)據(jù)傳送結束后,雙方調用close()關閉套接口。 套接口工作原理 對于以上的套接口工作過程我們用VC+中的 CSockct類進行網(wǎng)絡二進制數(shù)據(jù)通信的連接 ,主 要構造的過程如下表,我們實驗過程也是按照表的 過程進行的,構建流程如下表所示。 注意事項:利用cArchive類進行網(wǎng)絡數(shù)據(jù)傳 輸?shù)牟僮鞴倘环奖阒庇^,但是如果編寫的程序是和 別人的程序進行通信的話,就要注意對方的程序是 否也用了CArchive類,否則會造成數(shù)據(jù)相互不能 識別。 套接口工作原理 點對點通信實驗 下面以一個最簡單的點

7、對點通信的聊天程序為例 說明:其中代碼ABCDEFGHIJ 在最后面。 客戶機/服務器模式是socket點對點網(wǎng)絡程序 典型的模式。它用到的方法也是面向連接TCP連接 的套接字MFC典型方式。 其工作過程是:服務器首先啟動,創(chuàng)建套接字 后等待客戶的連接;客戶啟動以后,創(chuàng)建套接字, 然后和服務器建立連接;連接建立后,客戶機和服 務器可以通過建立的套接字連接進行信息通信。 o 第一步第一步:構建服務器端 打開VC+,單擊新建菜單,先建立一MFC,選 dialogBased,工程名server2,下一步中選擇基本對 話框,如圖所示。注意在下一步過程中注意勾選 windows socket 然后一直下

8、一步,確定,完成就可以了。 確定后出現(xiàn)Dialog,編輯界面,使其如圖所示且對 控件點擊右鍵,選擇屬性選項,把每個控件的ID改掉 (控件ID就是每個控件的名字,要改成有意義的,以便 將來管理)。 o 各個控件的ID如下表,并且在對話框視 圖中點擊右鍵,選擇建立類向導選項,用該 工具對控件添加變量。注意控件 IDC_CONTENT添加兩個變量。 o 然后把這幾個控件全部添加完畢點擊Message maps 菜單,將偵聽和發(fā)送按鈕添加clicked功能,兩個按鈕 全部添加完后點擊確定。 o 完成后,在Server2Dlg.cpp中將BOOL CServer2Dlg:OnInitDialog()函數(shù)

9、末尾添加 語句,其如下所示: m_send.EnableWindow(FALSE);/使發(fā)送 按鈕變灰 return TRUE;/return TRUE unless you /set the focus to a control 注意:這個語句作用使發(fā)送按鈕失效,以免還 未連接用戶就點擊發(fā)送,發(fā)生不可預計的錯誤。 o 為了在程序中更自由地處理CSocket得到的消息, 必須新建CSocket的派生類:在server2工程的工作區(qū) 類視圖中點擊右鍵,添加新類: Cserver,父類為,父類為 CSocket。NewClass對話框如下圖所示 o 添加新類Cserver 后,需要在資源文件ser

10、ver.cpp文 件和server2Dlg.h 文件頭文件或者成員變量添加,如 圖示 o 在server.cpp中添加頭文件: #include server2Dlg.h o 在server2Dlg.h里添加: 頭文件: #include server.h public:void ShowMsg(); void ShowAccept(); private變量: Cserver m_server; Cserver m_recv; 然后在對話框的圖像上雙擊“偵聽”按鈕,添 加如下代碼A 在對話框圖像上再雙擊“發(fā)送”按鈕,添加如 下代碼B o 下面的步驟就是利用OnAccept和OnReceive函

11、數(shù) 處理socket消息。首先,在server2工程的編輯界面中 點擊右鍵,選創(chuàng)建類向導,在classname欄目里面找 到Cserver類,添加OnAccept和OnReceive函數(shù)并且 雙擊下面的Member function欄目,分別為兩個函數(shù) 添加代碼E和F,過程如圖示 該步完成后,可以為CServer2Dlg類添加public成員 函數(shù)ShowAccept()和ShowMsg():在 server2Dlg.cpp中添加下面函數(shù):ShowAccept()和 ShowMsg(),代碼分別為G和H: 服務器端代碼添加完畢服務器端代碼添加完畢 o第二步第二步:構建客戶端 按照第一步的步驟再

12、打開一個VC,建立客 戶機工程,工程名稱為client2,各個控件的ID 如下表 o 當出現(xiàn)Dialog以后,編輯界面,使其如圖所示 且對控件點擊右鍵,選擇屬性選項,把每個控 件的ID改掉。界面如圖示。 前兩步完成后,同樣在client2Dlg.cpp中將BOOL CClient2Dlg:OnInitDialog()使末尾添加語句,其如 下所示: m_send.EnableWindow(FALSE);/使發(fā)送按鈕變灰 return TRUE;/return TRUE unless you /set the focus to a control 注意:這個語句作用使發(fā)送按鈕失效,以免還未連接用

13、戶就點擊發(fā)送,發(fā)生不可預計的錯誤。 o 同樣地同樣地,在client工程的工作區(qū)類視圖中點擊 右鍵,添加新類: Cclient它繼承自CSocket。 在client.cpp中添加頭文件: #includeclient2Dlg.h“ 在server2Dlgh里添加: 頭文件: #includeClient.h public: void ShowMsg(); private:Cclient m_client; o 雙擊對話框圖像上的“連接”按鈕,添加代碼 C o 雙擊發(fā)送按鈕,添加代碼D 通過以上操作,我們建立了CSocket,主 機、客戶機建立連接后的消息發(fā)送代碼也添加 完成了,但是還缺少使其

14、工作的消息機制。 同樣地同樣地,在client工程的編輯界面中點擊 右鍵,選創(chuàng)建類向導,在classname欄目里面 找到Cclient類,添加OnReceive函數(shù)并且雙擊 下面的Member function欄目,在client工程 中添加OnReceive函數(shù)代碼 I: 并在client2Dlg.cpp中添加 ShowMsg()函數(shù) 代碼J: o 最后即在對話框銷毀的時候,關閉Socket連接,釋放 資源。在client2工程中見圖。 o 在OnDestroy() 函數(shù)中添加如下代碼: void CClient2Dlg:OnDestroy() CDialog:OnDestroy(); /

15、 TODO: Add your message handler code here m_client.Close(); 至此,代碼全部添加完畢。 o 第五步:調試服務器和客戶端實現(xiàn)通信,過 程如下如,先調試服務器端,調試運行成功 顯示下圖: o 同樣調試運行客戶端成功后顯示 本實驗是實現(xiàn)兩臺聯(lián)網(wǎng)的電腦之間的點 對點之間通信,首先要保證兩臺電腦正常聯(lián) 網(wǎng),然后首先點擊服務器界面中的偵聽按鈕, 保持偵聽狀態(tài),然后在客戶端的服務器ip地 址中輸入運行服務器端的電腦的ip地址,就 可以實現(xiàn)兩臺電腦間的通信連接,然后就可 以實現(xiàn)數(shù)據(jù)發(fā)送。運行結果如圖示 o A ovoid CServer2Dlg:OnL

16、isten() o o/ TODO: Add your control notification handler code here om_server.Create(1000); om_server.Listen(); o o B o void CServer2Dlg:OnSend() o o/ TODO: Add your control notification handler code here o UpdateData(TRUE); /更新數(shù)據(jù),使m_msg得到當前框中 文本 o m_recv.Send(m_msg,255); om_ctrl.SetSel(0,-1); om_ctr

17、l.ReplaceSel(,TRUE); o oC ovoid CClient2Dlg:OnConnect() o UpdateData(TRUE); om_client.Create(1001); oif(m_client.Connect(m_ip,1000) o o AfxMessageBox(Client端連接成功); o m_send.EnableWindow(TRUE); o m_connect.EnableWindow(FALSE); o oelse o o m_client.Close(); o AfxMessageBox(連接失?。?; o o oD ovoid CClient

18、2Dlg:OnSend() o UpdateData(TRUE); om_client.Send(m_msg,255); o oE ovoid CServer:OnAccept(int nErrorCode) o oCSocket:OnAccept(nErrorCode); o (CServer2Dlg*)(AfxGetApp()-m_pMainWnd)-ShowAccept(); o o F ovoid CServer:OnReceive(int nErrorCode) o o/ TODO: Add your specialized code here and/or call the base class o oCSocket:OnReceive(nErrorCode); o (CServer2Dlg*)(AfxGetApp()-m_pMainWnd)-ShowMsg(); o o G ovoid CServer2Dlg:Sho

溫馨提示

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

評論

0/150

提交評論