官术网_书友最值得收藏!

第1章 網絡編程和開發環境

1.1 Visual C++ 2010開發平臺

Microsoft Visual C++(簡稱Visual C++、MSVC、VC++或VC),是微軟公司的C++開發工具,具有集成開發環境,可編輯編譯C、C++及C++/CLI等語言。VC++整合了便利的排錯工具,特別是整合了視窗應用編程接口(Windows API)、三維動畫DirectX API及Microsoft .NET框架。目前最新的版本是Visual C++ 2010。

1.1.1 Visual Studio 2010安裝

Visual C++一直以來都是Visual Studio系列開發工具套件的重要成員。Visual Studio是微軟公司推出的著名產品,是目前最流行的Windows平臺應用程序開發環境。Visual Studio 2010(簡稱VS 2010)于2010年4月12日上市,其集成開發環境(IDE)的界面被重新設計和組織,變得更加簡單明了。Visual Studio 2010集成了Visual C++ 2010。

本書使用網上下載的Visual Studio 2010安裝包:

      cn_visual_studio_2010_ultimate_x86_dvd_532347.iso

這是個鏡像(.iso)文件,需要虛擬光驅才能運行。用虛擬光驅軟件DAEMON Tools Lite載入鏡像,如圖1.1所示。

圖1.1 載入VS 2010安裝.iso文件

載入后彈出如圖1.2所示的啟動窗口,單擊“安裝Microsoft Visual Studio 2010”,進入如圖1.3所示的安裝向導界面,單擊“下一步”按鈕繼續。

圖1.2 啟動窗口

圖1.3 Visual Studio 2010旗艦版安裝向導

在圖1.4所示窗口中選擇“我已閱讀并接受許可條款”,在圖1.5所示窗口中選擇“完全”,產品安裝路徑為默認的“C:\Program Files\Microsoft Visual Studio 10.0\”,單擊“安裝”按鈕開始安裝進程。

圖1.4 接受安裝許可條款

圖1.5 選擇安裝路徑

Visual Studio 2010包含Microsoft .NET平臺的許多組件,如圖1.6所示,安裝程序會逐個安裝它們,用戶要等待一段時間。

圖1.6 安裝進行中

安裝成功后,選擇→“所有程序”→“Microsoft Visual Studio 2010”→,即可啟動VS 2010。初次啟動會彈出如圖1.7所示的“選擇默認環境設置”對話框,本書是Visual C++ 編程,故選擇“Visual C++開發設置”,單擊“啟動Visual Studio”按鈕進入開發環境。

圖1.7 設置為Visual C++的開發環境

Visual Studio 2010的Visual C++集成開發環境的起始界面如圖1.8所示。

圖1.8 Visual C++ 2010集成開發環境

讀者也可從網絡獲得Visual Studio 2010的可執行(非鏡像)安裝程序或者直接從光盤安裝。

下面以編寫一個簡單的演示程序為例,使讀者初步熟悉Visual Studio 2010環境下Visual C++開發的基本操作。

1.1.2 創建Visual C++項目工程

選擇菜單命令“文件”→“新建”→“項目”,如圖1.9所示。

圖1.9 新建項目

系統彈出“新建項目”對話框(如圖1.10所示),左邊“項目類型”樹中默認選項為“Visual C++”→“MFC”,對應右邊“模板”選擇“MFC應用程序”,給項目命名為“GetIPAndPort”(我們即將做的這個軟件是用來演示程序如何獲得用戶輸入的IP和端口號的——這也是幾乎所有網絡程序都具有的功能,所以取這個名字)。

圖1.10 項目命名

單擊“確定”按鈕,彈出“MFC 應用程序向導”對話框(如圖1.11所示),接下來我們將在這個對話框的指引下輕松完成創建VC工程的工作,單擊“下一步”按鈕繼續。

圖1.11 MFC應用程序向導

在“應用程序類型”界面(如圖1.12所示)選中“基于對話框”單選按鈕(這個程序很簡單,用不著文檔和視圖),取消選擇界面下方的“使用Unicode庫”復選框(在本書所有程序建立工程的時候都要記得這一步,為程序兼容性考慮,避免字符串處理的麻煩),單擊“下一步”按鈕。

圖1.12 選擇應用程序類型

接下來的“用戶界面功能”和“高級功能”界面(如圖1.13所示)都采用系統默認設置,連續單擊“下一步”按鈕跳過。

圖1.13 “用戶界面功能”和“高級功能”默認設置

最后一步出現的是“生成的類”,稍留意下可以看到,系統已經自動為程序建立了兩個類——CGetIPAndPortApp和CGetIPAndPortDlg(如圖1.14所示),其中CGetIPAndPortApp類代表應用程序本身,CGetIPAndPortDlg類代表程序的主界面對話框。細心的讀者可能會發現,這兩個看似冗長的類名其中間部分“GetIPAndPort”就是我們剛才取的工程名!沒錯,以后大家就會發現一個規律:VC在一開始創建工程時都會默認生成兩個類,名稱形如CXXXApp和CXXXDlg(其中“XXX”部分就是用戶指定的工程名),這樣的命名法則是為了方便用戶理清程序的類結構。

圖1.14 生成的類

單擊“完成”按鈕,至此一個VC工程就創建完成了。

1.1.3 Visual C++可視化設計

開發環境工作區主界面將呈現的樣子如圖1.15所示。

圖1.15 開發環境工作區主界面

主工作區大致分為三部分,最左邊是供用戶瀏覽程序結構的,包括好幾個選項卡界面,常用的是解決方案資源管理器、類視圖和資源視圖,如圖1.16所示。

圖1.16 三個常用的視圖

解決方案資源管理器以樹形目錄結構列出了程序中包含的所有代碼文件,VC將它們分成三大類:頭文件(.h)、源文件(.cpp)和資源文件。頭文件主要對程序中用到的各種變量、常量、函數和類進行定義和聲明;源文件是程序的主體部分,是各個函數、類的具體實現代碼;資源文件定義程序運行要用到的各種資源,如圖片、動畫、聲音、視頻等,這對于一些功能豐富的軟件(如多媒體類應用)是必不可少的。

類視圖用樹狀結構展示了工程中所有 C++ 類及其層次結構,單擊類名可在 Visual Studio 2010 環境界面右下角的“屬性”窗口中設置對應的類,包括為其添加新的事件消息,重寫某些方法的實現代碼等。

資源視圖分類列出了程序的所有資源,其中常用的是 Dialog 資源,這種資源是每一個具有GUI的程序都有的,雙擊資源ID號可以打開對應的界面設計工作區,就可以設計程序的圖形界面了。

VC在創建工程時默認會生成兩個類(本例是CGetIPAndPortApp和CGetIPAndPortDlg),圖 1.16 解決方案資源管理器中的頭文件 GetIPAndPort.h 和源文件 GetIPAndPort.cpp 對應CGetIPAndPortApp 類,它們一同構成了該類的源代碼實現;同理,GetIPAndPortDlg.h 和GetIPAndPortDlg.cpp對應CGetIPAndPortDlg類,從中間類視圖中也可以看到這兩個類。

除此之外,讀者會發現類視圖里多了一個CAboutDlg類,它是VC自動創建的,叫做“關于GetIPAndPort”對話框,用來顯示程序的版本信息。

在本例的三個類中,CAboutDlg類和CGetIPAndPortDlg類都有各自的對話框界面資源。資源視圖中 Dialog 目錄下有它們的 ID 號(對應的分別是 IDD_ABOUTBOX 和 IDD_GETIPANDPORT_DIALOG),雙擊ID號可以打開其對話框的界面設計工作區,如圖1.17所示。

圖1.17 “關于GetIPAndPort”對話框的設計工作區

工作區中顯示的是“關于GetIPAndPort”對話框的默認界面,可以在此基礎上自己設計或重新布局。

解決方案資源管理器、類視圖和資源視圖三者密切配合,將程序代碼有機地組織成一個結構精巧的 C++項目,通過這三者可以清楚地看到程序中每個類的對應代碼實體,用 C++寫的類不再是抽象的代碼,而是成為看得見、摸得著的現實存在,這就是可視化設計的魅力!

對話框界面的設計布局如Visual Basic一樣方便:開發環境界面中央是主工作區,在這里可以打開任意多個程序文件(源文件或頭文件)及對話框界面設計工作區;只要將右邊工具箱中的控件直接拖曳到工作區中,就可以設計出自己想要的程序界面。VC環境下的工具箱和VB的一樣,都包含了一般 Windows 程序通用的界面元素(按鈕、文本框、靜態標簽、列表框、滾動條等),用過VB的人對這些常用控件肯定再熟悉不過了,故這里不做過多介紹。只是針對本書所介紹的網絡編程,有一個控件需要特別提一下,那就是 IP 地址控件(如圖1.18所示)。它在界面上的顯示效果如圖1.19所示。

圖1.18 IP地址控件

圖1.19 地址控件的顯示效果

稍后將會介紹這個控件的具體用法,讀者會看到它是個很實用的控件。

選擇工具箱中的控件設計程序界面,可以看到VC界面設計環境的使用極其方便,絲毫不比VB遜色。在布局界面時可以使用工具欄中提供的功能調整各個控件的大小、對齊方式。如圖1.20所示,先選擇“關于”按鈕控件,再選擇“退出”按鈕控件,然后單擊工具欄中的“使大小相同”按鈕,就可以使先選擇的按鈕與后選擇的按鈕大小一樣。

圖1.20 調整控件的大小

最終設計出的程序界面效果如圖1.21所示。

圖1.21 程序界面

在網絡編程中,程序使用IP和端口來標識網絡上的其他程序,以實現程序之間的通信(進程通信),因此獲取并正確處理對方進程的IP和端口(通常由用戶通過界面輸入指定)就成為網絡程序的通用功能。下面的小程序就用來演示這個最基本的功能,不過,它只負責獲取和處理IP、端口號,并不實際發起網絡連接。

1.1.4 一個簡單的Visual C++小程序

這個程序的界面已經設計好了,但要讓程序完成一定的功能,還必須為其編寫代碼。寫代碼之前,首先要定義程序中需要用到的一些變量。在VC中,很多變量都不是孤立的,而是與某個界面元素(即控件)綁定的,這樣用戶在界面上的輸入就可以很容易地傳遞給程序中相應的變量進行處理。例如,為了在程序代碼中獲得用戶輸入的IP,需要給IP地址控件關聯一個變量。如圖1.22所示,右擊該控件,在彈出的菜單中選擇“添加變量”命令。

圖1.22 給控件關聯變量

出現“添加成員變量向導”對話框(如圖1.23所示),將變量命名為“m_ip”,變量類別為“Control”。

圖1.23 添加Control型變量

“Control”表示控件變量,它是微軟對實現Windows程序的圖形用戶界面元素的一些類(類名如CEdit、CButton)的總稱。這些類大多是由同一個叫做窗口(CWnd)的C++類衍生過來的, CWnd及其龐大的衍生類家族封裝了Windows的GUI,作為MFC的重要組成部分,是微軟對基礎 C++語言的擴充,使其具有了強大的圖形化界面功能。與 CWnd 家族中的類關聯的變量即控件變量,可以通過這樣的變量獲取和控制它所關聯控件的幾乎一切行為,從而對程序界面進行靈活的編程和定制。

而那些僅僅只是獲取用戶輸入值的變量稱為值類型(Value)變量,這種變量與我們以前上C++語言課時接觸的那些變量差不多,所不同的只是它們都有各自關聯的控件,用于獲取和保存特定控件接收的用戶輸入。

除了Control和Value這兩大類變量外,用戶在編程時也可以根據需要自定義臨時變量,這種變量就是普通C++里用的那些變量(整型、實型、字符型之類)。

下面接著添加變量,給用于接收端口號的文本框關聯Value變量strport(如圖1.24所示)。

圖1.24 添加Value型變量

再設置該文本框的Number屬性為True(如圖1.25所示),之所以這樣設置,是為了限定用戶只能在這個文本框中輸入數字形式的端口號。這樣設置之后,后面運行程序時讀者會發現:如果試圖輸入非數字字符(中文、英文字母),則文本框一概不響應,也就杜絕了用戶的非法輸入。

圖1.25 設置文本框Number屬性

本程序還有一個文本框是用于顯示程序獲取的 IP 和端口的,給它關聯 Control 型變量m_showIpAndPort,并且設置Read Only屬性為True(作為顯示信息窗口的文本框一般都設為只讀模式),如圖1.26所示。

圖1.26 設置顯示框Read Only屬性

至于給控件關聯的變量究竟是設成Control還是Value型,應視具體需要而定。一般來說,如果希望對控件的行為進行某種控制,設置變量為Control型較好;如果僅僅想獲得控件接收的用戶輸入值,設置為Value型就足夠了;有時候對控件的行為有較高的控制要求,同時又希望能夠非常方便地獲取控件的輸入值,也可以對一個控件同時關聯定義這兩類變量。

現在,所有的變量都關聯好了,界面控件也都進行了恰當的設置和布局,只剩下編碼工作了。程序界面上的“獲取”按鈕是實現本程序功能的關鍵,編程工作主要就是給這個按鈕添加事件處理程序。右擊“獲取”按鈕,在彈出的功能菜單中選擇“添加事件處理程序”命令,如圖1.27所示。

圖1.27 給“獲取”按鈕添加事件處理程序

在“事件處理程序向導”對話框中將這個處理程序命名為“OnShowIpAndPort”,如圖1.28所示。

圖1.28 給事件處理程序命名

單擊“添加編輯”按鈕,進入代碼編輯窗口(如圖1.29所示),VC自動打開需要編輯的程序代碼文件 GetIPAndPortDlg.cpp 并定位到源文件中相應的位置,供用戶添加自己的代碼。以后在編譯、調試程序時,也可隨時先選中程序界面上的“獲取”按鈕,然后再在開發環境右下角“獲取”按鈕的屬性設置窗口中選擇這個事件處理過程。這樣就可以隨時隨地定位到這個事件過程的源碼編輯處,修改完善程序。需要指出的是,事件過程 OnShowIpAndPort 的代碼必須填寫在如圖1.29中VC為我們指定的地方,寫在其他任何地方或本工程的其他代碼文件中都是無法運行的。

圖1.29 編輯事件處理過程代碼

為“獲取”按鈕編寫的事件過程代碼如下:

        BYTE nFild[4];              //分別存放IP地址的四個字段
        CString sip;                //IP地址的字符串形式(可以直接顯示在界面上的)
        UpdateData();              //刷新對話框界面,獲取用戶輸入
        //驗證輸入是否合法
        if(m_ip.IsBlank())         //若用戶沒有填寫IP地址,則提示填寫
        {
            AfxMessageBox("請填寫IP地址!");
            return;
        }
        if(strport.IsEmpty())      //若用戶忘了指定端口號,則提醒其指定
        {
            AfxMessageBox("請指定進程端口!");
            return;
        }
        //獲取用戶輸入的IP地址值
        m_ip.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
        //將IP地址格式化為可以在計算機屏幕上顯示的字符串
        sip.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);
        //在界面上顯示用戶輸入的網絡進程地址(包括所在主機的IP和端口)
        m_showIpAndPort.SetWindowTextA(sip + " :" + strport);
        m_ip.SetFocus();           //焦點回到IP地址欄

雙擊“關于”按鈕,為其添加事件過程(如圖1.30所示)。VC也會自動定位到需要添加代碼處,事件處理過程函數自動命名為OnBnClickedButton2,表示在單擊Button2(即“關于”按鈕)時執行這個事件過程。

圖1.30 添加“關于”按鈕事件過程

“關于”按鈕的Click事件代碼如下:

        CAboutDlg dlg;
        dlg.DoModal();         //顯示“關于”對話框

由此可見,添加代碼有兩種方式:一種方式是右擊控件后選擇“添加事件處理程序”菜單項,另一種方式是直接雙擊該控件。所不同的是第一種方式可以自定義事件處理程序的函數名,如本例命名“獲取”按鈕的單擊處理過程函數名為OnShowIpAndPort,這是個有意義的名字,表示單擊“獲取”按鈕后,程序就會顯示(Show)指定的“IP”和“端口(Port)”;而采用第二種方式添加的函數使用系統自動生成的函數名,如OnBnClickedButton2,雖然這個名稱也有一定意義,表示事件過程是在單擊(BnClicked)第二個按鈕(Button2)時發生的,但并沒有直觀地表示出它要完成的功能。

對于小程序的開發,這兩種方式都是可行的,并沒有本質區別。但是如果程序規模稍大,事件處理過程較多的時候,就要注意了:采用第一種方式添加的函數由于其名稱更有意義,將使得最終整個源程序的可讀性很強,便于修改、維護,因此對于程序的重要功能函數盡量使用第一種方式添加;而第二種方式也不是完全沒有用——對于一些不重要的函數(并非程序必要的核心功能),若都采用第一種方式添加,都要給它取一個有意義的名字,勢必給編程工作造成不便,而且過多地增加有意義的函數名也容易造成命名混亂,反而降低了程序的可讀性。在實際編程中,要根據具體情況靈活運用這兩種方式。

至此,這個簡單的VC小程序就編寫完成了,下面來運行。

單擊工具欄上的“啟動調試”()按鈕,程序界面如圖1.31所示。

圖1.31 啟動程序界面

我們先不填寫IP地址而直接單擊“獲取”按鈕,看看會發生什么。程序彈出了消息框,提醒填寫IP地址(如圖1.32所示)。

圖1.32 提醒填寫IP地址

接下來填寫IP地址時,我們故意將最后一個字段填成300(或任何其他大于255的十進制數),這時你會發現:IP地址控件會自動將它重置為255(因為值大于255的IP地址字段是不合法的),而且始終無法在IP地址控件中輸入其他非數字字符(這就是使用IP地址控件的好處)。如果使用其他控件接收用戶輸入,用戶就要自己編寫代碼來檢查輸入的合法性,IP 地址控件將這種煩瑣的驗證過程封裝起來自動完成,給編寫程序帶來了極大的方便。

填寫完合法 IP,再故意不填端口號,單擊“獲取”按鈕后,程序同樣也會彈出消息框,提醒輸入端口號(如圖1.33所示)。

圖1.33 提醒填寫端口

在IP和端口都合法填寫的情況下,單擊“獲取”按鈕,程序就會將用戶輸入的網絡進程地址(IP+端口)顯示在下方的輸出文本框中,如圖1.34所示。

圖1.34 顯示運行結果

這樣,程序就完成了對用戶輸入網絡進程地址的獲取工作,在本書以后的程序示例中,這樣的操作會經常用到。在獲取了進程地址后,程序會進一步用這個地址作為參數傳遞給不同的網絡編程接口函數,從而完成豐富的網絡功能。

單擊“關于”按鈕,程序彈出“關于GetIPAndPort”對話框(如圖1.35所示),這是一個版本聲明對話框,每一個 Windows 程序幾乎都有這樣一個對話框,用于聲明版本號和版權信息。對話框上顯示的內容可以根據需要進行修改和自定義,這個小程序暫時保持默認內容。

圖1.35 “關于GetIPAndPort”對話框

通過以上這個簡單的小程序,讀者已經初步熟悉了本書要使用的開發平臺,但要進行網絡編程還必須對一些基本概念有所了解,下面就來介紹。

主站蜘蛛池模板: 云和县| 晋城| 嵊泗县| 孟村| 宁德市| 肥东县| 山阳县| 神木县| 扎囊县| 寻乌县| 郎溪县| 孝昌县| 邯郸市| 时尚| 澳门| 华阴市| 密山市| 贡嘎县| 海淀区| 高要市| 郑州市| 土默特右旗| 新邵县| 兴山县| 文化| 石屏县| 林口县| 镇赉县| 漯河市| 越西县| 淮安市| 花垣县| 探索| 赞皇县| 蚌埠市| 宿松县| 资阳市| 丹东市| 无锡市| 桐城市| 武川县|