版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Winsock實驗 主要內(nèi)容: 1.實驗?zāi)康暮鸵?2.Winsock和套接口概念 3.套接口工作原理 4.點對點通信實驗 實驗?zāi)康暮鸵?o 【實驗?zāi)康摹緦嶒災(zāi)康摹?(1)熟悉Visual C+的基本操作。 (2)基本了解基于對話框的windows應(yīng)用程序的編寫 過程。 (3)對于Windows Socket編程建立初步概念。 o 【實驗要求【實驗要求】 (1)應(yīng)用VisualC+中MFCCSocket類,實現(xiàn)網(wǎng)絡(luò)數(shù) 據(jù)傳輸。 (2)制作實用的局域網(wǎng)數(shù)據(jù)傳輸程序。 Winsock和套接口概念 o 基本概念基本概念 網(wǎng)際協(xié)議(Intemet Protocol,IP)是一種用于互聯(lián) 網(wǎng)的網(wǎng)絡(luò)協(xié)議
2、。從它的設(shè)計看來,它是一個無連接的協(xié) 議,并不能保證數(shù)據(jù)投遞萬無一失。兩個上層協(xié)議(TCP 和UDP)依賴IP協(xié)議進行數(shù)據(jù)通信。Winsock規(guī)范定義如 何使用API與TCP/IP協(xié)議族連接,以實現(xiàn)網(wǎng)絡(luò)應(yīng)用程序 間的通訊。多個應(yīng)用程序通過winsock中的API實現(xiàn)相互 之間通訊。如圖示 如果希望在Microsoft Windows下通過TCP和UDP協(xié) 議建立網(wǎng)絡(luò)應(yīng)用程序,則需要使用Winsock套接口編程 技術(shù)。 從圖中看出Socket是應(yīng)用層與TCP/IP協(xié)議 族通信的中間軟件層,是一組接口,對用戶來 說就是讓Socket去組織數(shù)據(jù),以符合指定的協(xié) 議。 套接口,就是一個指向傳輸提供者的
3、句柄。 Win32中,套接口不同于文件描述符,所以它是 一個獨立的類型SOCKET。套接字接口 (SocketInterface)就是一種API , API實現(xiàn)的 作用是把API定義的具體操作和對象映射到協(xié)議 定義的抽象服務(wù)集上。 socket提供三種類型的套接字: 1.流式套接字(SOCK_STREAM) n 提供一個面向連接的、可靠的數(shù)據(jù)傳輸服務(wù), 數(shù)據(jù)無差錯、無重復(fù)地發(fā)送,且按發(fā)送順序接 收。 n 內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作 是字節(jié)流,無長度限制。 n 文件傳輸協(xié)議(FTP)即使用流式套接字。 2.數(shù)據(jù)報式套接字(SOCK_DGRAM) n 提供一個無連接服務(wù)。 n 數(shù)據(jù)報
4、以獨立包形式被發(fā)送,不提供無錯保證,數(shù) 據(jù)可能丟失或重復(fù),且接收順序混亂。 n 網(wǎng)絡(luò)文件系統(tǒng)(NFS)使用數(shù)據(jù)報式套接字。 3.原始式套接字(SOCK_RAW) n 該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。 n 常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有服務(wù)中配置的 新設(shè)備 套接口工作原理 o 由socket提供三種類型的套接字知道服務(wù)方式主要 有兩種,一種是面向連接,一種是無連接的。面向連接 服務(wù)器處理的請求往往比較復(fù)雜,不是一來一去的請求 應(yīng)答所能解決的,而且往往是并發(fā)服務(wù)器。無連接服務(wù) 器一般都是面向事務(wù)處理的,一個請求、一個應(yīng)答就完 成了客戶程序與服務(wù)程序之間的相互作用。使用面向連 接
5、的套接口編程,可以通過圖來表示。 其中socket()、bind()、listen()、accept()、 send()、recv()、sendto()、recvfrom()、 closesocket()函數(shù)是TCP和UDP通信常使用的API函數(shù)。 套接口工作原理 套接口工作原理 o 套接口工作過程如下:服務(wù)器首先啟動,通過調(diào)用 socket()建立一個套接口,然后調(diào)用bind()將該套 接口和本地網(wǎng)絡(luò)地址聯(lián)系在一起,再調(diào)用listen() 使套接口做好偵聽的準備,并規(guī)定它的請求隊列的 長度,之后,調(diào)用accept()來接收連接。客戶在建 立套接口后就可調(diào)用connect()和服務(wù)器建立連接。
6、 連接一旦建立,客戶機和服務(wù)器之間就可以通過調(diào) 用read()和write()來發(fā)送和接收數(shù)據(jù)。最后,待 數(shù)據(jù)傳送結(jié)束后,雙方調(diào)用close()關(guān)閉套接口。 套接口工作原理 對于以上的套接口工作過程我們用VC+中的 CSockct類進行網(wǎng)絡(luò)二進制數(shù)據(jù)通信的連接 ,主 要構(gòu)造的過程如下表,我們實驗過程也是按照表的 過程進行的,構(gòu)建流程如下表所示。 注意事項:利用cArchive類進行網(wǎng)絡(luò)數(shù)據(jù)傳 輸?shù)牟僮鞴倘环奖阒庇^,但是如果編寫的程序是和 別人的程序進行通信的話,就要注意對方的程序是 否也用了CArchive類,否則會造成數(shù)據(jù)相互不能 識別。 套接口工作原理 點對點通信實驗 下面以一個最簡單的點
7、對點通信的聊天程序為例 說明:其中代碼ABCDEFGHIJ 在最后面。 客戶機/服務(wù)器模式是socket點對點網(wǎng)絡(luò)程序 典型的模式。它用到的方法也是面向連接TCP連接 的套接字MFC典型方式。 其工作過程是:服務(wù)器首先啟動,創(chuàng)建套接字 后等待客戶的連接;客戶啟動以后,創(chuàng)建套接字, 然后和服務(wù)器建立連接;連接建立后,客戶機和服 務(wù)器可以通過建立的套接字連接進行信息通信。 o 第一步第一步:構(gòu)建服務(wù)器端 打開VC+,單擊新建菜單,先建立一MFC,選 dialogBased,工程名server2,下一步中選擇基本對 話框,如圖所示。注意在下一步過程中注意勾選 windows socket 然后一直下
8、一步,確定,完成就可以了。 確定后出現(xiàn)Dialog,編輯界面,使其如圖所示且對 控件點擊右鍵,選擇屬性選項,把每個控件的ID改掉 (控件ID就是每個控件的名字,要改成有意義的,以便 將來管理)。 o 各個控件的ID如下表,并且在對話框視 圖中點擊右鍵,選擇建立類向?qū)нx項,用該 工具對控件添加變量。注意控件 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ā)生不可預(yù)計的錯誤。 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)建類向?qū)?,在classname欄目里面找 到Cserver類,添加OnAccept和OnReceive函數(shù)并且 雙擊下面的Member function欄目,分別為兩個函數(shù) 添加代碼E和F,過程如圖示 該步完成后,可以為CServer2Dlg類添加public成員 函數(shù)ShowAccept()和ShowMsg():在 server2Dlg.cpp中添加下面函數(shù):ShowAccept()和 ShowMsg(),代碼分別為G和H: 服務(wù)器端代碼添加完畢服務(wù)器端代碼添加完畢 o第二步第二步:構(gòu)建客戶端 按照第一步的步驟再
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ā)生不可預(yù)計的錯誤。 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)建類向?qū)В赾lassname欄目里面 找到Cclient類,添加OnReceive函數(shù)并且雙擊 下面的Member function欄目,在client工程 中添加OnReceive函數(shù)代碼 I: 并在client2Dlg.cpp中添加 ShowMsg()函數(shù) 代碼J: o 最后即在對話框銷毀的時候,關(guān)閉Socket連接,釋放 資源。在client2工程中見圖。 o 在OnDestroy() 函數(shù)中添加如下代碼: void CClient2Dlg:OnDestroy() CDialog:OnDestroy(); /
15、 TODO: Add your message handler code here m_client.Close(); 至此,代碼全部添加完畢。 o 第五步:調(diào)試服務(wù)器和客戶端實現(xiàn)通信,過 程如下如,先調(diào)試服務(wù)器端,調(diào)試運行成功 顯示下圖: o 同樣調(diào)試運行客戶端成功后顯示 本實驗是實現(xiàn)兩臺聯(lián)網(wǎng)的電腦之間的點 對點之間通信,首先要保證兩臺電腦正常聯(lián) 網(wǎng),然后首先點擊服務(wù)器界面中的偵聽按鈕, 保持偵聽狀態(tài),然后在客戶端的服務(wù)器ip地 址中輸入運行服務(wù)器端的電腦的ip地址,就 可以實現(xiàn)兩臺電腦間的通信連接,然后就可 以實現(xiàn)數(shù)據(jù)發(fā)送。運行結(jié)果如圖示 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)系上傳者。文件的所有權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級英語Myfuture課件
- JJF(陜) 028-2020 數(shù)顯糖量計校準規(guī)范
- 【培訓(xùn)課件】著作權(quán)集體管理之討論
- 加強抗震救災(zāi)安全保障計劃
- 辦公室消防安全培訓(xùn)
- 讀書驛站在社區(qū)內(nèi)搭建臨時圖書館提供服務(wù)計劃
- 2024-2025學(xué)年年七年級數(shù)學(xué)人教版下冊專題整合復(fù)習(xí)卷28.2 解直角三角形(1)(含答案)-
- 班主任的情緒智力提升計劃
- 斷路器關(guān)鍵部件相關(guān)項目投資計劃書
- 有效的班級會議組織與實施計劃
- GB/T 45090-2024塑料再生塑料的標識和標志
- 《工廠垃圾分類》課件
- 6.1 認識經(jīng)濟全球化 課件-高中政治統(tǒng)編版選擇性必修一當代國際政治與經(jīng)濟-2
- 2025年1月“八省聯(lián)考”考前猜想卷歷史試題01 含解析
- 眼科練習(xí)卷含答案
- 山東省淄博市2023-2024學(xué)年高二上學(xué)期期末教學(xué)質(zhì)量檢測試題 數(shù)學(xué) 含解析
- 專題23 殖民地人民的反抗與資本主義制度的擴展(練習(xí))
- 2024至2030年中國無甲醛多層板數(shù)據(jù)監(jiān)測研究報告
- 算法設(shè)計與分析 課件 5.4.1-動態(tài)規(guī)劃-0-1背包問題-問題描述和分析
- 分子生物學(xué)課件第一章醫(yī)學(xué)分子生物學(xué)緒論
- 電工技能與實訓(xùn)(第4版)教學(xué)指南 高教版
評論
0/150
提交評論