- Visual C++網(wǎng)絡(luò)編程教程(Visual Studio 2010平臺(tái))
- 鄭阿奇編著
- 12字
- 2018-12-30 12:04:48
第1章 網(wǎng)絡(luò)編程和開(kāi)發(fā)環(huán)境
1.1 Visual C++ 2010開(kāi)發(fā)平臺(tái)
Microsoft Visual C++(簡(jiǎn)稱Visual C++、MSVC、VC++或VC),是微軟公司的C++開(kāi)發(fā)工具,具有集成開(kāi)發(fā)環(huán)境,可編輯編譯C、C++及C++/CLI等語(yǔ)言。VC++整合了便利的排錯(cuò)工具,特別是整合了視窗應(yīng)用編程接口(Windows API)、三維動(dòng)畫(huà)DirectX API及Microsoft .NET框架。目前最新的版本是Visual C++ 2010。
1.1.1 Visual Studio 2010安裝
Visual C++一直以來(lái)都是Visual Studio系列開(kāi)發(fā)工具套件的重要成員。Visual Studio是微軟公司推出的著名產(chǎn)品,是目前最流行的Windows平臺(tái)應(yīng)用程序開(kāi)發(fā)環(huán)境。Visual Studio 2010(簡(jiǎn)稱VS 2010)于2010年4月12日上市,其集成開(kāi)發(fā)環(huán)境(IDE)的界面被重新設(shè)計(jì)和組織,變得更加簡(jiǎn)單明了。Visual Studio 2010集成了Visual C++ 2010。
本書(shū)使用網(wǎng)上下載的Visual Studio 2010安裝包:
cn_visual_studio_2010_ultimate_x86_dvd_532347.iso
這是個(gè)鏡像(.iso)文件,需要虛擬光驅(qū)才能運(yùn)行。用虛擬光驅(qū)軟件DAEMON Tools Lite載入鏡像,如圖1.1所示。

圖1.1 載入VS 2010安裝.iso文件
載入后彈出如圖1.2所示的啟動(dòng)窗口,單擊“安裝Microsoft Visual Studio 2010”,進(jìn)入如圖1.3所示的安裝向?qū)Ы缑妫瑔螕簟跋乱徊健卑粹o繼續(xù)。

圖1.2 啟動(dòng)窗口

圖1.3 Visual Studio 2010旗艦版安裝向?qū)?/p>
在圖1.4所示窗口中選擇“我已閱讀并接受許可條款”,在圖1.5所示窗口中選擇“完全”,產(chǎn)品安裝路徑為默認(rèn)的“C:\Program Files\Microsoft Visual Studio 10.0\”,單擊“安裝”按鈕開(kāi)始安裝進(jìn)程。

圖1.4 接受安裝許可條款

圖1.5 選擇安裝路徑
Visual Studio 2010包含Microsoft .NET平臺(tái)的許多組件,如圖1.6所示,安裝程序會(huì)逐個(gè)安裝它們,用戶要等待一段時(shí)間。

圖1.6 安裝進(jìn)行中
安裝成功后,選擇→“所有程序”→“Microsoft Visual Studio 2010”→
,即可啟動(dòng)VS 2010。初次啟動(dòng)會(huì)彈出如圖1.7所示的“選擇默認(rèn)環(huán)境設(shè)置”對(duì)話框,本書(shū)是Visual C++ 編程,故選擇“Visual C++開(kāi)發(fā)設(shè)置”,單擊“啟動(dòng)Visual Studio”按鈕進(jìn)入開(kāi)發(fā)環(huán)境。

圖1.7 設(shè)置為Visual C++的開(kāi)發(fā)環(huán)境
Visual Studio 2010的Visual C++集成開(kāi)發(fā)環(huán)境的起始界面如圖1.8所示。

圖1.8 Visual C++ 2010集成開(kāi)發(fā)環(huán)境
讀者也可從網(wǎng)絡(luò)獲得Visual Studio 2010的可執(zhí)行(非鏡像)安裝程序或者直接從光盤(pán)安裝。
下面以編寫(xiě)一個(gè)簡(jiǎn)單的演示程序?yàn)槔棺x者初步熟悉Visual Studio 2010環(huán)境下Visual C++開(kāi)發(fā)的基本操作。
1.1.2 創(chuàng)建Visual C++項(xiàng)目工程
選擇菜單命令“文件”→“新建”→“項(xiàng)目”,如圖1.9所示。

圖1.9 新建項(xiàng)目
系統(tǒng)彈出“新建項(xiàng)目”對(duì)話框(如圖1.10所示),左邊“項(xiàng)目類(lèi)型”樹(shù)中默認(rèn)選項(xiàng)為“Visual C++”→“MFC”,對(duì)應(yīng)右邊“模板”選擇“MFC應(yīng)用程序”,給項(xiàng)目命名為“GetIPAndPort”(我們即將做的這個(gè)軟件是用來(lái)演示程序如何獲得用戶輸入的IP和端口號(hào)的——這也是幾乎所有網(wǎng)絡(luò)程序都具有的功能,所以取這個(gè)名字)。

圖1.10 項(xiàng)目命名
單擊“確定”按鈕,彈出“MFC 應(yīng)用程序向?qū)А睂?duì)話框(如圖1.11所示),接下來(lái)我們將在這個(gè)對(duì)話框的指引下輕松完成創(chuàng)建VC工程的工作,單擊“下一步”按鈕繼續(xù)。

圖1.11 MFC應(yīng)用程序向?qū)?/p>
在“應(yīng)用程序類(lèi)型”界面(如圖1.12所示)選中“基于對(duì)話框”單選按鈕(這個(gè)程序很簡(jiǎn)單,用不著文檔和視圖),取消選擇界面下方的“使用Unicode庫(kù)”復(fù)選框(在本書(shū)所有程序建立工程的時(shí)候都要記得這一步,為程序兼容性考慮,避免字符串處理的麻煩),單擊“下一步”按鈕。

圖1.12 選擇應(yīng)用程序類(lèi)型
接下來(lái)的“用戶界面功能”和“高級(jí)功能”界面(如圖1.13所示)都采用系統(tǒng)默認(rèn)設(shè)置,連續(xù)單擊“下一步”按鈕跳過(guò)。

圖1.13 “用戶界面功能”和“高級(jí)功能”默認(rèn)設(shè)置
最后一步出現(xiàn)的是“生成的類(lèi)”,稍留意下可以看到,系統(tǒng)已經(jīng)自動(dòng)為程序建立了兩個(gè)類(lèi)——CGetIPAndPortApp和CGetIPAndPortDlg(如圖1.14所示),其中CGetIPAndPortApp類(lèi)代表應(yīng)用程序本身,CGetIPAndPortDlg類(lèi)代表程序的主界面對(duì)話框。細(xì)心的讀者可能會(huì)發(fā)現(xiàn),這兩個(gè)看似冗長(zhǎng)的類(lèi)名其中間部分“GetIPAndPort”就是我們剛才取的工程名!沒(méi)錯(cuò),以后大家就會(huì)發(fā)現(xiàn)一個(gè)規(guī)律:VC在一開(kāi)始創(chuàng)建工程時(shí)都會(huì)默認(rèn)生成兩個(gè)類(lèi),名稱形如CXXXApp和CXXXDlg(其中“XXX”部分就是用戶指定的工程名),這樣的命名法則是為了方便用戶理清程序的類(lèi)結(jié)構(gòu)。

圖1.14 生成的類(lèi)
單擊“完成”按鈕,至此一個(gè)VC工程就創(chuàng)建完成了。
1.1.3 Visual C++可視化設(shè)計(jì)
開(kāi)發(fā)環(huán)境工作區(qū)主界面將呈現(xiàn)的樣子如圖1.15所示。

圖1.15 開(kāi)發(fā)環(huán)境工作區(qū)主界面
主工作區(qū)大致分為三部分,最左邊是供用戶瀏覽程序結(jié)構(gòu)的,包括好幾個(gè)選項(xiàng)卡界面,常用的是解決方案資源管理器、類(lèi)視圖和資源視圖,如圖1.16所示。

圖1.16 三個(gè)常用的視圖
解決方案資源管理器以樹(shù)形目錄結(jié)構(gòu)列出了程序中包含的所有代碼文件,VC將它們分成三大類(lèi):頭文件(.h)、源文件(.cpp)和資源文件。頭文件主要對(duì)程序中用到的各種變量、常量、函數(shù)和類(lèi)進(jìn)行定義和聲明;源文件是程序的主體部分,是各個(gè)函數(shù)、類(lèi)的具體實(shí)現(xiàn)代碼;資源文件定義程序運(yùn)行要用到的各種資源,如圖片、動(dòng)畫(huà)、聲音、視頻等,這對(duì)于一些功能豐富的軟件(如多媒體類(lèi)應(yīng)用)是必不可少的。
類(lèi)視圖用樹(shù)狀結(jié)構(gòu)展示了工程中所有 C++ 類(lèi)及其層次結(jié)構(gòu),單擊類(lèi)名可在 Visual Studio 2010 環(huán)境界面右下角的“屬性”窗口中設(shè)置對(duì)應(yīng)的類(lèi),包括為其添加新的事件消息,重寫(xiě)某些方法的實(shí)現(xiàn)代碼等。
資源視圖分類(lèi)列出了程序的所有資源,其中常用的是 Dialog 資源,這種資源是每一個(gè)具有GUI的程序都有的,雙擊資源ID號(hào)可以打開(kāi)對(duì)應(yīng)的界面設(shè)計(jì)工作區(qū),就可以設(shè)計(jì)程序的圖形界面了。
VC在創(chuàng)建工程時(shí)默認(rèn)會(huì)生成兩個(gè)類(lèi)(本例是CGetIPAndPortApp和CGetIPAndPortDlg),圖 1.16 解決方案資源管理器中的頭文件 GetIPAndPort.h 和源文件 GetIPAndPort.cpp 對(duì)應(yīng)CGetIPAndPortApp 類(lèi),它們一同構(gòu)成了該類(lèi)的源代碼實(shí)現(xiàn);同理,GetIPAndPortDlg.h 和GetIPAndPortDlg.cpp對(duì)應(yīng)CGetIPAndPortDlg類(lèi),從中間類(lèi)視圖中也可以看到這兩個(gè)類(lèi)。
除此之外,讀者會(huì)發(fā)現(xiàn)類(lèi)視圖里多了一個(gè)CAboutDlg類(lèi),它是VC自動(dòng)創(chuàng)建的,叫做“關(guān)于GetIPAndPort”對(duì)話框,用來(lái)顯示程序的版本信息。
在本例的三個(gè)類(lèi)中,CAboutDlg類(lèi)和CGetIPAndPortDlg類(lèi)都有各自的對(duì)話框界面資源。資源視圖中 Dialog 目錄下有它們的 ID 號(hào)(對(duì)應(yīng)的分別是 IDD_ABOUTBOX 和 IDD_GETIPANDPORT_DIALOG),雙擊ID號(hào)可以打開(kāi)其對(duì)話框的界面設(shè)計(jì)工作區(qū),如圖1.17所示。

圖1.17 “關(guān)于GetIPAndPort”對(duì)話框的設(shè)計(jì)工作區(qū)
工作區(qū)中顯示的是“關(guān)于GetIPAndPort”對(duì)話框的默認(rèn)界面,可以在此基礎(chǔ)上自己設(shè)計(jì)或重新布局。
解決方案資源管理器、類(lèi)視圖和資源視圖三者密切配合,將程序代碼有機(jī)地組織成一個(gè)結(jié)構(gòu)精巧的 C++項(xiàng)目,通過(guò)這三者可以清楚地看到程序中每個(gè)類(lèi)的對(duì)應(yīng)代碼實(shí)體,用 C++寫(xiě)的類(lèi)不再是抽象的代碼,而是成為看得見(jiàn)、摸得著的現(xiàn)實(shí)存在,這就是可視化設(shè)計(jì)的魅力!
對(duì)話框界面的設(shè)計(jì)布局如Visual Basic一樣方便:開(kāi)發(fā)環(huán)境界面中央是主工作區(qū),在這里可以打開(kāi)任意多個(gè)程序文件(源文件或頭文件)及對(duì)話框界面設(shè)計(jì)工作區(qū);只要將右邊工具箱中的控件直接拖曳到工作區(qū)中,就可以設(shè)計(jì)出自己想要的程序界面。VC環(huán)境下的工具箱和VB的一樣,都包含了一般 Windows 程序通用的界面元素(按鈕、文本框、靜態(tài)標(biāo)簽、列表框、滾動(dòng)條等),用過(guò)VB的人對(duì)這些常用控件肯定再熟悉不過(guò)了,故這里不做過(guò)多介紹。只是針對(duì)本書(shū)所介紹的網(wǎng)絡(luò)編程,有一個(gè)控件需要特別提一下,那就是 IP 地址控件(如圖1.18所示)。它在界面上的顯示效果如圖1.19所示。

圖1.18 IP地址控件

圖1.19 地址控件的顯示效果
稍后將會(huì)介紹這個(gè)控件的具體用法,讀者會(huì)看到它是個(gè)很實(shí)用的控件。
選擇工具箱中的控件設(shè)計(jì)程序界面,可以看到VC界面設(shè)計(jì)環(huán)境的使用極其方便,絲毫不比VB遜色。在布局界面時(shí)可以使用工具欄中提供的功能調(diào)整各個(gè)控件的大小、對(duì)齊方式。如圖1.20所示,先選擇“關(guān)于”按鈕控件,再選擇“退出”按鈕控件,然后單擊工具欄中的“使大小相同”按鈕,就可以使先選擇的按鈕與后選擇的按鈕大小一樣。

圖1.20 調(diào)整控件的大小
最終設(shè)計(jì)出的程序界面效果如圖1.21所示。

圖1.21 程序界面
在網(wǎng)絡(luò)編程中,程序使用IP和端口來(lái)標(biāo)識(shí)網(wǎng)絡(luò)上的其他程序,以實(shí)現(xiàn)程序之間的通信(進(jìn)程通信),因此獲取并正確處理對(duì)方進(jìn)程的IP和端口(通常由用戶通過(guò)界面輸入指定)就成為網(wǎng)絡(luò)程序的通用功能。下面的小程序就用來(lái)演示這個(gè)最基本的功能,不過(guò),它只負(fù)責(zé)獲取和處理IP、端口號(hào),并不實(shí)際發(fā)起網(wǎng)絡(luò)連接。
1.1.4 一個(gè)簡(jiǎn)單的Visual C++小程序
這個(gè)程序的界面已經(jīng)設(shè)計(jì)好了,但要讓程序完成一定的功能,還必須為其編寫(xiě)代碼。寫(xiě)代碼之前,首先要定義程序中需要用到的一些變量。在VC中,很多變量都不是孤立的,而是與某個(gè)界面元素(即控件)綁定的,這樣用戶在界面上的輸入就可以很容易地傳遞給程序中相應(yīng)的變量進(jìn)行處理。例如,為了在程序代碼中獲得用戶輸入的IP,需要給IP地址控件關(guān)聯(lián)一個(gè)變量。如圖1.22所示,右擊該控件,在彈出的菜單中選擇“添加變量”命令。

圖1.22 給控件關(guān)聯(lián)變量
出現(xiàn)“添加成員變量向?qū)А睂?duì)話框(如圖1.23所示),將變量命名為“m_ip”,變量類(lèi)別為“Control”。

圖1.23 添加Control型變量
“Control”表示控件變量,它是微軟對(duì)實(shí)現(xiàn)Windows程序的圖形用戶界面元素的一些類(lèi)(類(lèi)名如CEdit、CButton)的總稱。這些類(lèi)大多是由同一個(gè)叫做窗口(CWnd)的C++類(lèi)衍生過(guò)來(lái)的, CWnd及其龐大的衍生類(lèi)家族封裝了Windows的GUI,作為MFC的重要組成部分,是微軟對(duì)基礎(chǔ) C++語(yǔ)言的擴(kuò)充,使其具有了強(qiáng)大的圖形化界面功能。與 CWnd 家族中的類(lèi)關(guān)聯(lián)的變量即控件變量,可以通過(guò)這樣的變量獲取和控制它所關(guān)聯(lián)控件的幾乎一切行為,從而對(duì)程序界面進(jìn)行靈活的編程和定制。
而那些僅僅只是獲取用戶輸入值的變量稱為值類(lèi)型(Value)變量,這種變量與我們以前上C++語(yǔ)言課時(shí)接觸的那些變量差不多,所不同的只是它們都有各自關(guān)聯(lián)的控件,用于獲取和保存特定控件接收的用戶輸入。
除了Control和Value這兩大類(lèi)變量外,用戶在編程時(shí)也可以根據(jù)需要自定義臨時(shí)變量,這種變量就是普通C++里用的那些變量(整型、實(shí)型、字符型之類(lèi))。
下面接著添加變量,給用于接收端口號(hào)的文本框關(guān)聯(lián)Value變量strport(如圖1.24所示)。

圖1.24 添加Value型變量
再設(shè)置該文本框的Number屬性為T(mén)rue(如圖1.25所示),之所以這樣設(shè)置,是為了限定用戶只能在這個(gè)文本框中輸入數(shù)字形式的端口號(hào)。這樣設(shè)置之后,后面運(yùn)行程序時(shí)讀者會(huì)發(fā)現(xiàn):如果試圖輸入非數(shù)字字符(中文、英文字母),則文本框一概不響應(yīng),也就杜絕了用戶的非法輸入。

圖1.25 設(shè)置文本框Number屬性
本程序還有一個(gè)文本框是用于顯示程序獲取的 IP 和端口的,給它關(guān)聯(lián) Control 型變量m_showIpAndPort,并且設(shè)置Read Only屬性為T(mén)rue(作為顯示信息窗口的文本框一般都設(shè)為只讀模式),如圖1.26所示。

圖1.26 設(shè)置顯示框Read Only屬性
至于給控件關(guān)聯(lián)的變量究竟是設(shè)成Control還是Value型,應(yīng)視具體需要而定。一般來(lái)說(shuō),如果希望對(duì)控件的行為進(jìn)行某種控制,設(shè)置變量為Control型較好;如果僅僅想獲得控件接收的用戶輸入值,設(shè)置為Value型就足夠了;有時(shí)候?qū)丶男袨橛休^高的控制要求,同時(shí)又希望能夠非常方便地獲取控件的輸入值,也可以對(duì)一個(gè)控件同時(shí)關(guān)聯(lián)定義這兩類(lèi)變量。
現(xiàn)在,所有的變量都關(guān)聯(lián)好了,界面控件也都進(jìn)行了恰當(dāng)?shù)脑O(shè)置和布局,只剩下編碼工作了。程序界面上的“獲取”按鈕是實(shí)現(xiàn)本程序功能的關(guān)鍵,編程工作主要就是給這個(gè)按鈕添加事件處理程序。右擊“獲取”按鈕,在彈出的功能菜單中選擇“添加事件處理程序”命令,如圖1.27所示。

圖1.27 給“獲取”按鈕添加事件處理程序
在“事件處理程序向?qū)А睂?duì)話框中將這個(gè)處理程序命名為“OnShowIpAndPort”,如圖1.28所示。

圖1.28 給事件處理程序命名
單擊“添加編輯”按鈕,進(jìn)入代碼編輯窗口(如圖1.29所示),VC自動(dòng)打開(kāi)需要編輯的程序代碼文件 GetIPAndPortDlg.cpp 并定位到源文件中相應(yīng)的位置,供用戶添加自己的代碼。以后在編譯、調(diào)試程序時(shí),也可隨時(shí)先選中程序界面上的“獲取”按鈕,然后再在開(kāi)發(fā)環(huán)境右下角“獲取”按鈕的屬性設(shè)置窗口中選擇這個(gè)事件處理過(guò)程。這樣就可以隨時(shí)隨地定位到這個(gè)事件過(guò)程的源碼編輯處,修改完善程序。需要指出的是,事件過(guò)程 OnShowIpAndPort 的代碼必須填寫(xiě)在如圖1.29中VC為我們指定的地方,寫(xiě)在其他任何地方或本工程的其他代碼文件中都是無(wú)法運(yùn)行的。

圖1.29 編輯事件處理過(guò)程代碼
為“獲取”按鈕編寫(xiě)的事件過(guò)程代碼如下:
BYTE nFild[4]; //分別存放IP地址的四個(gè)字段 CString sip; //IP地址的字符串形式(可以直接顯示在界面上的) UpdateData(); //刷新對(duì)話框界面,獲取用戶輸入 //驗(yàn)證輸入是否合法 if(m_ip.IsBlank()) //若用戶沒(méi)有填寫(xiě)IP地址,則提示填寫(xiě) { AfxMessageBox("請(qǐng)?zhí)顚?xiě)IP地址!"); return; } if(strport.IsEmpty()) //若用戶忘了指定端口號(hào),則提醒其指定 { AfxMessageBox("請(qǐng)指定進(jìn)程端口!"); return; } //獲取用戶輸入的IP地址值 m_ip.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); //將IP地址格式化為可以在計(jì)算機(jī)屏幕上顯示的字符串 sip.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]); //在界面上顯示用戶輸入的網(wǎng)絡(luò)進(jìn)程地址(包括所在主機(jī)的IP和端口) m_showIpAndPort.SetWindowTextA(sip + " :" + strport); m_ip.SetFocus(); //焦點(diǎn)回到IP地址欄
雙擊“關(guān)于”按鈕,為其添加事件過(guò)程(如圖1.30所示)。VC也會(huì)自動(dòng)定位到需要添加代碼處,事件處理過(guò)程函數(shù)自動(dòng)命名為OnBnClickedButton2,表示在單擊Button2(即“關(guān)于”按鈕)時(shí)執(zhí)行這個(gè)事件過(guò)程。

圖1.30 添加“關(guān)于”按鈕事件過(guò)程
“關(guān)于”按鈕的Click事件代碼如下:
CAboutDlg dlg; dlg.DoModal(); //顯示“關(guān)于”對(duì)話框
由此可見(jiàn),添加代碼有兩種方式:一種方式是右擊控件后選擇“添加事件處理程序”菜單項(xiàng),另一種方式是直接雙擊該控件。所不同的是第一種方式可以自定義事件處理程序的函數(shù)名,如本例命名“獲取”按鈕的單擊處理過(guò)程函數(shù)名為OnShowIpAndPort,這是個(gè)有意義的名字,表示單擊“獲取”按鈕后,程序就會(huì)顯示(Show)指定的“IP”和“端口(Port)”;而采用第二種方式添加的函數(shù)使用系統(tǒng)自動(dòng)生成的函數(shù)名,如OnBnClickedButton2,雖然這個(gè)名稱也有一定意義,表示事件過(guò)程是在單擊(BnClicked)第二個(gè)按鈕(Button2)時(shí)發(fā)生的,但并沒(méi)有直觀地表示出它要完成的功能。
對(duì)于小程序的開(kāi)發(fā),這兩種方式都是可行的,并沒(méi)有本質(zhì)區(qū)別。但是如果程序規(guī)模稍大,事件處理過(guò)程較多的時(shí)候,就要注意了:采用第一種方式添加的函數(shù)由于其名稱更有意義,將使得最終整個(gè)源程序的可讀性很強(qiáng),便于修改、維護(hù),因此對(duì)于程序的重要功能函數(shù)盡量使用第一種方式添加;而第二種方式也不是完全沒(méi)有用——對(duì)于一些不重要的函數(shù)(并非程序必要的核心功能),若都采用第一種方式添加,都要給它取一個(gè)有意義的名字,勢(shì)必給編程工作造成不便,而且過(guò)多地增加有意義的函數(shù)名也容易造成命名混亂,反而降低了程序的可讀性。在實(shí)際編程中,要根據(jù)具體情況靈活運(yùn)用這兩種方式。
至此,這個(gè)簡(jiǎn)單的VC小程序就編寫(xiě)完成了,下面來(lái)運(yùn)行。
單擊工具欄上的“啟動(dòng)調(diào)試”()按鈕,程序界面如圖1.31所示。

圖1.31 啟動(dòng)程序界面
我們先不填寫(xiě)IP地址而直接單擊“獲取”按鈕,看看會(huì)發(fā)生什么。程序彈出了消息框,提醒填寫(xiě)IP地址(如圖1.32所示)。

圖1.32 提醒填寫(xiě)IP地址
接下來(lái)填寫(xiě)IP地址時(shí),我們故意將最后一個(gè)字段填成300(或任何其他大于255的十進(jìn)制數(shù)),這時(shí)你會(huì)發(fā)現(xiàn):IP地址控件會(huì)自動(dòng)將它重置為255(因?yàn)橹荡笥?55的IP地址字段是不合法的),而且始終無(wú)法在IP地址控件中輸入其他非數(shù)字字符(這就是使用IP地址控件的好處)。如果使用其他控件接收用戶輸入,用戶就要自己編寫(xiě)代碼來(lái)檢查輸入的合法性,IP 地址控件將這種煩瑣的驗(yàn)證過(guò)程封裝起來(lái)自動(dòng)完成,給編寫(xiě)程序帶來(lái)了極大的方便。
填寫(xiě)完合法 IP,再故意不填端口號(hào),單擊“獲取”按鈕后,程序同樣也會(huì)彈出消息框,提醒輸入端口號(hào)(如圖1.33所示)。

圖1.33 提醒填寫(xiě)端口
在IP和端口都合法填寫(xiě)的情況下,單擊“獲取”按鈕,程序就會(huì)將用戶輸入的網(wǎng)絡(luò)進(jìn)程地址(IP+端口)顯示在下方的輸出文本框中,如圖1.34所示。

圖1.34 顯示運(yùn)行結(jié)果
這樣,程序就完成了對(duì)用戶輸入網(wǎng)絡(luò)進(jìn)程地址的獲取工作,在本書(shū)以后的程序示例中,這樣的操作會(huì)經(jīng)常用到。在獲取了進(jìn)程地址后,程序會(huì)進(jìn)一步用這個(gè)地址作為參數(shù)傳遞給不同的網(wǎng)絡(luò)編程接口函數(shù),從而完成豐富的網(wǎng)絡(luò)功能。
單擊“關(guān)于”按鈕,程序彈出“關(guān)于GetIPAndPort”對(duì)話框(如圖1.35所示),這是一個(gè)版本聲明對(duì)話框,每一個(gè) Windows 程序幾乎都有這樣一個(gè)對(duì)話框,用于聲明版本號(hào)和版權(quán)信息。對(duì)話框上顯示的內(nèi)容可以根據(jù)需要進(jìn)行修改和自定義,這個(gè)小程序暫時(shí)保持默認(rèn)內(nèi)容。

圖1.35 “關(guān)于GetIPAndPort”對(duì)話框
通過(guò)以上這個(gè)簡(jiǎn)單的小程序,讀者已經(jīng)初步熟悉了本書(shū)要使用的開(kāi)發(fā)平臺(tái),但要進(jìn)行網(wǎng)絡(luò)編程還必須對(duì)一些基本概念有所了解,下面就來(lái)介紹。
- Qt 5 and OpenCV 4 Computer Vision Projects
- Rust編程:入門(mén)、實(shí)戰(zhàn)與進(jìn)階
- Learning Docker
- PHP 從入門(mén)到項(xiàng)目實(shí)踐(超值版)
- PHP基礎(chǔ)案例教程
- PyTorch自然語(yǔ)言處理入門(mén)與實(shí)戰(zhàn)
- Processing互動(dòng)編程藝術(shù)
- Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
- Building Serverless Applications with Python
- Hands-On Full Stack Development with Go
- NoSQL數(shù)據(jù)庫(kù)原理
- Practical Microservices
- Mastering Bootstrap 4
- Mastering ArcGIS Server Development with JavaScript
- 跟小樓老師學(xué)用Axure RP 9:玩轉(zhuǎn)產(chǎn)品原型設(shè)計(jì)