基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序(普通下載)_第1頁
基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序(普通下載)_第2頁
基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序(普通下載)_第3頁
基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序(普通下載)_第4頁
基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序(普通下載)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于WINSOCK控件的VC網(wǎng)絡(luò)通訊程序馬進林永君馬永光呂麗霞華北電力大學(xué)仿真控制技術(shù)實驗室,河北保定作者簡介:馬進(1971- ,男,籍貫河北任丘,華北電力大學(xué)仿真控制技術(shù)研究所工程師,工學(xué)碩士,現(xiàn)從事電廠負荷優(yōu)化、仿真機的開發(fā)與研究工作。該程序為原國家電力公司青年促進費項目“發(fā)電廠廠級負荷優(yōu)化調(diào)度”中的一部分。項目編號:SP11-2001-05-66摘要:介紹在VISCAL C+ 6.0 環(huán)境下,使用Winsock控件進行網(wǎng)絡(luò)通訊的一種方法。Winsock控件的使用簡單,可以方便地應(yīng)用在使用VC+進行編程的網(wǎng)絡(luò)通訊程序中。關(guān)鍵字:Winsock控件局域網(wǎng) VC6.0中圖分類號: 文獻標識碼

2、: 文章編號:引言:隨著計算機技術(shù)的發(fā)展和網(wǎng)絡(luò)的不斷普及,網(wǎng)絡(luò)通訊程序的應(yīng)用越來越普遍,各種軟件開發(fā)平臺也為網(wǎng)絡(luò)通訊程序的開發(fā)提供了不同形式的類和控件。在利用Visual C+ 進行開發(fā)時,可以使用Csocket類;在利用Visucal Basic 進行開發(fā)時,可以使用Winsock 控件。有關(guān)Csocket類在VC中的使用和Winsock 控件在VB中使用,已經(jīng)有許多文章、資料進行的介紹,這里不再贅述。同時也應(yīng)注意到,利用VC的CSocket類需要對網(wǎng)絡(luò)通訊的機制和參數(shù)有較深的了解,需要較深的計算機知識。雖然CSocket對Winsock進行了封裝,但是它的函數(shù)調(diào)用仍然比較復(fù)雜,使用起來不容

3、易。與此相反,在利用VB編程時,各種控件的使用比較簡單,不需要許多的參數(shù)。利用VB中的Winsock 控件進行開發(fā)比較容易,但VB本身的功能不如VC強大,在進行開發(fā)時有時會受到一定程度的限制。在VC中利用Winsock控件的使用難度則介于上述二者之間,只需對少許一些參數(shù)做簡單設(shè)置即可。如果在用VC編制程序時需要進行網(wǎng)絡(luò)通訊而又不想花費過多的時間,在VC程序中插入Winsock控件是一種合適的方法。利用Winsock控件可以編制一個簡單的通訊程序,用于局域網(wǎng)之間的微機通訊。1 Winsock控件的使用方法1.1通訊協(xié)議的選擇Winsock控件提供了訪問 TCP 和 UDP 網(wǎng)絡(luò)服務(wù)的方便途徑。采

4、用TCP協(xié)議可以提供雙向的、可靠的、有序的和無重復(fù)投遞的數(shù)據(jù)流。TCP允許創(chuàng)建和維護與遠程計算機的連接,連接兩臺計算機就可彼此進行數(shù)據(jù)傳輸。用戶數(shù)據(jù)文報協(xié)議(UDP 是一個無連接協(xié)議。采用UDP協(xié)議,支持雙向的數(shù)據(jù)流,但不保證有序、可靠或無重復(fù)的投遞。但計算機并不建立連接。在使用中,采用TCP協(xié)議的編程模型應(yīng)用最為廣泛,因為面向連接協(xié)議提供了一系列的數(shù)據(jù)糾錯功能,可以保證在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)及時、無誤地到達對方,Internet上的多數(shù)服務(wù)(WWW、FTP、Telnet、SMTP就是靠此協(xié)議運轉(zhuǎn)的。采用UDP協(xié)議由于不用建立連接,傳輸比連接協(xié)議快,無數(shù)據(jù)糾錯功能,不保證數(shù)據(jù)的可靠傳遞。在這里本文

5、只介紹使用TCP/IP協(xié)議進行編程的方法。1.2使用方法和主要函數(shù)Winsock控件的使用方法和步驟如下圖所示。Server Winsock控件使用的一個特殊的數(shù)據(jù)類型為V ARIANT結(jié)構(gòu),其中vt的值類型說明了它所存儲的數(shù)據(jù),vt的幾個主要的值類型及值域為:類型值域說明vt=VT_BSTR bstrVal 字符串類型vt=VT_I2 Ival 整數(shù)類型vt=VT_ERROR scode 錯誤代碼在使用之前,應(yīng)對V ARIANT變量的類型和值域進行賦值。一般的使用方法為: V ARIANT variant namevariant name.vt=variant typevariant nam

6、e.variant type=value例如:Cstring m_host;m_host="Room312"V ARIANT vtHost;vtHost.vt=VT_BSTR;vtHost.bstrVal=m_host.AllocSysString(;Bind(函數(shù)指定用于 TCP 連接的 LocalPort 和 LocalIP。Listen(函數(shù)設(shè)置偵聽模式。該方法僅適用于 TCP 連接。Accept(在處理 ConnectionRequest 事件時用這個方法接受新連接。SendData(用于數(shù)據(jù)的發(fā)送。Close(關(guān)閉與對方的連接。Connect(要求連接到遠程計算機

7、。GetData(得到遠程計算機上的數(shù)據(jù)。2使用Winsock控件的局域網(wǎng)通訊程序2.1 Server程序利用ClassWizard建立一個ServerDemo程序,注意選擇SDI,支持ActiveX,將View類設(shè)為CFormView類, 從Project->Add File->Compont and Control, 在對話框中選Registered ActiveX,選擇Microsoft WinSock Control ,點擊Insert按鈕,依照缺省設(shè)置即可。這樣在工程文件中會出現(xiàn)mswinsockcontrol類編輯ServerDemo程序的主對話框,可以看到在控件面版上

8、出現(xiàn)mswinsockcontrol類的控件。在對話框中加入控件和相應(yīng)的變量,如表1所示控件 控件ID 變量名 類型Edit IDC_EDIT1 m_edit CString按鈕 IDC_SENDWinsock IDC_WINSOCK1 m_server 控制Winsock IDC_WINSOCK2 m_connect 控制(1在ServerDemoView.h中,加入以下變量VARIANT localport;VARIANT localip;CString strport;CString strip;VARIANT vtCommand;CString m_command;VARIANT vt

9、Data;VARIANT vtType;VARIANT vtMaxlen;(2在ServerDemoView .cpp的構(gòu)造函數(shù)中加入:localport.vt=VT_BSTR;localip.vt=VT_BSTR;strport="4000"vtCommand.vt=VT_BSTR;m_command="Server Send"vtData.vt=VT_BSTR;vtType.vt=VT_ERROR;(3利用ClassWizar映射OnInitialUpdate(的響應(yīng):在其中加入代碼:localport.bstrVal=strport.AllocSy

10、sString(;localip.bstrVal=strip.AllocSysString(;m_server.Bind(localport, localip;m_server.Listen(;(4利用ClassWizar響應(yīng)IDC_WINSOCK1的ConnectionRequest事件,在OnConnectionRequestWinsock1(中加入代碼:if(m_connect.GetState(=0 m_connect.Accept(requestID;elseAfxMessageBox("no more connects",MB_OK;(5利用ClassWizar

11、映射ID_SEND的動作:OnSend(,在其中加入代碼:m_edit.GetWindowText(m_command;vtCommand.bstrVal=m_command.AllocSysString(;m_connect.SendData(vtCommand;(6利用ClassWizar響應(yīng)ID_WINSOCK2的DataArrival事件,在OnDataArrivalWinsock2(中加入代碼:CString m_MBody;vtMaxlen.vt=VT_I2;vtMaxlen.iVal=bytesTotal;vtData.bstrVal=strport.AllocSysString

12、(;vtType.bstrVal=strport.AllocSysString(;m_connect.GetData(&vtData,vtType,vtMaxlen;m_MBody=vtData.bstrVal;m_edit.SetWindowText( m_MBody;(7利用ClassWizar響應(yīng)ID_WINSOCK2的Close(事件,在OnCloseWinsock2(中加入代碼:m_connect.Close(;(8在DestroyWindow( 中加入:m_server.Close(;m_connect.Close(;2.2 Client程序利用ClassWizard建立一

13、個ClientDemo程序,注意選擇SDI,支持ActiveX,將View類設(shè)為CFormView類, 從Project->Add File->Compont and Control, 在對話框中選Registered ActiveX,選擇Microsoft WinSock Control ,點擊Insert 按鈕,依照缺省設(shè)置即可。這樣在工程文件中會出現(xiàn)mswinsockcontrol類。編輯ClientDemo程序的主對話框,可以看到在控件面版上出現(xiàn)mswinsockcontrol 類的控件。在對話框中加入控件和相應(yīng)的變量,如表2所示表2控件表控件 控件ID 變量名 類型Edi

14、t IDC_EDIT1 m_edit CString按鈕 IDC_CONNECT m_connect 控制按鈕 IDC_SENDWinsock IDC_WINSOCK1 m_socket 控制(1在ClientDemoView.h中,加入以下變量CString m_host;CString m_port;VARIANT vtHost;VARIANT vtPort;VARIANT vtData;VARIANT vtType;VARIANT vtMaxlen;VARIANT vtCommand;CString m_command;(2在ClientDemo.cpp的構(gòu)造函數(shù)中加入:m_host=_

15、T("Room312"/在程序中將“Room312”設(shè)為自己server的主機 /名m_port=_T("4000" /端口設(shè)為4000;m_command=_T("Client send"vtHost.vt=VT_BSTR;vtPort.vt=VT_BSTR;vtData.vt=VT_BSTR;vtType.vt=VT_ERROR;vtCommand.vt=VT_BSTR;(3利用ClassWizar映射ID_CONNECT的動作:在OnConnect(中加入代碼: m_socket.SetRemoteHost("Room

16、312"/在程序中將“Room312”設(shè)為自己 /server的主機名m_socket.SetRemotePort(4000;vtHost.bstrVal=m_host.AllocSysString(;/見CString類字符串轉(zhuǎn)化為/系統(tǒng)字符串vtPort.bstrVal=m_port.AllocSysString(;m_socket.Connect(vtHost,vtPort;if(m_socket.GetState(=0 /如果m_socket已經(jīng)斷開連接,將connect /設(shè)置為可用m_connect.EnableWindow(true;elsem_connect.Enab

17、leWindow(false;(4利用ClassWizar映射ID_SEND的動作:在OnSend:m_edit.GetWindowText(m_command;vtCommand.bstrVal=m_command.AllocSysString(;m_socket.SendData(vtCommand;(5利用ClassWizar響應(yīng)ID_WINSOCK1的DataArrival事件,在 OnDataArrivalWinsock1(long bytesTotal中加入代碼:CString m_MBody;vtMaxlen.vt=VT_I2;vtMaxlen.iVal=bytesTotal;v

18、tData.bstrVal=m_host.AllocSysString(; vtType.bstrVal=m_port.AllocSysString(; m_socket.GetData(&vtData,vtType,vtMaxlen; m_MBody=vtData.bstrVal; m_edit.SetWindowText(m_MBody; (6)在 DestroyWindow(中加入: m_socket.Close(; (7)利用 ClassWizar 響應(yīng) ID_WINSOCK1 的 Close 事件,在 OnCloseWinsock1( 中加入代碼: m_socket.Clos

19、e(; if(m_socket.GetState(=0 m_connect.EnableWindow(true; else m_connect.EnableWindow(false; 3程序演示及結(jié)論 將 上 述 程 序 分 別 編 輯 、 連 接 為 執(zhí) 行 程 序 , 生 成 serverdemo.exe 和 clientdemo.exe 文件。確認程序中主機名和 IP 地址無誤。如果計算機沒有連網(wǎng), 可以在程序中使用本機的主機名和 IP 地址。首先運行 serverdemo.exe。它自動進 入到監(jiān)聽狀態(tài)。 隨后運行 clientdemo.exe, 點擊 connect 按鈕。 如果 client 與 server 連接成功,connect 按鈕變?yōu)榛疑ú豢捎茫?。連接成功后,在編輯框中輸入文字, 點擊 send 按鈕,在 serverdemo 程序的編輯框中可以看到 clientdemo 程序發(fā)送的 文字。同樣,在 serverdemo 的編輯框中輸入文字,點擊 send 按鈕,在 clientdemo 程序的編輯框中可以看到 serverdemo 程序發(fā)送的文字。 通過上述程序可以看到, MFC 的 Csocket

溫馨提示

  • 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

提交評論