版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 1 緒言1</b></p><p> 2方案的論證及選擇1</p><p> 3 重要結(jié)構(gòu)和函數(shù)1</p><p> 3.1 函數(shù)gethostname1</p><p> 3.2 函數(shù)g
2、ethostbyname2</p><p> 3.3 函數(shù)inet_ntoa2</p><p> 3.4 函數(shù)TextOut3</p><p> 3.5 函數(shù)memcpy3</p><p> 3.6 WSAData結(jié)構(gòu)3</p><p><b> 4 設(shè)計(jì)過程5</b><
3、;/p><p> 4.1 新建對(duì)話框5</p><p> 4.2 添加控件5</p><p> 4.3 添加成員變量6</p><p> 4.4 為控件添加映射消息6</p><p> 4.5 定義函數(shù)7</p><p> 4.6 添加代碼7</p><p
4、> 4.7 設(shè)計(jì)icon并運(yùn)行程序10</p><p> 5 程序運(yùn)行結(jié)果及分析10</p><p><b> 6 心得體會(huì)11</b></p><p><b> 參考文獻(xiàn)11</b></p><p> 附錄1 sanjinDlg.cpp程序12</p>
5、<p> 附錄2 頭文件sanjinDlg.h18</p><p><b> 1 緒言</b></p><p> Microsoft Visual C++是Microsoft公司推出的開發(fā)Win32環(huán)境程序,面向?qū)ο蟮目梢暬删幊滔到y(tǒng)。它不但具有程序框架自動(dòng)生成、靈活方便的類管理、代碼編寫和界面設(shè)計(jì)集成交互操作、可開發(fā)多種程序等優(yōu)點(diǎn),而且通過
6、簡單的設(shè)置就可使其生成的程序框架支持?jǐn)?shù)據(jù)庫接口、OLE2,WinSock網(wǎng)絡(luò)、3D控制界面。它以擁有“語法高亮”,IntelliSense(自動(dòng)完成功能)以及高級(jí)除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動(dòng)正在調(diào)試的程序。其編譯及建置系統(tǒng)以預(yù)編譯頭文件、最小重建功能及累加連結(jié)著稱。這些特征明顯縮短程式編輯、編譯及連結(jié)花費(fèi)的時(shí)間,在大型軟件計(jì)劃上尤其顯著。</p
7、><p> 在網(wǎng)絡(luò)編程中,像獲取主機(jī)名和IP地址這樣的基本應(yīng)用是必不可少的,這些基本的應(yīng)用通過適當(dāng)改變可以很容易地應(yīng)用到網(wǎng)絡(luò)軟件中。因此,獲取主機(jī)名和IP地址是用現(xiàn)實(shí)意義的。</p><p><b> 2方案的論證及選擇</b></p><p> 方案一:用Windows API進(jìn)行設(shè)計(jì)。Windows API可以很容易獲取主機(jī)名和IP地址,
8、但是在窗口設(shè)計(jì)是卻顯得比較繁瑣。</p><p> 方案二:用MFC進(jìn)行設(shè)計(jì)。用MFC設(shè)計(jì)可以更容易的設(shè)計(jì)顯示界面,在獲取主機(jī)名和IP地址方面也比不復(fù)雜。</p><p><b> 綜上,選擇方案二。</b></p><p><b> 3 重要結(jié)構(gòu)和函數(shù)</b></p><p> 3.1 函
9、數(shù)gethostname</p><p><b> 函數(shù)原型為:</b></p><p> int gethostname(char *name,int namelen);</p><p> 其中,參數(shù)name是一個(gè)指向?qū)⒁娣胖鳈C(jī)名的緩沖區(qū)的指針,namelen用于指定緩沖區(qū)的長度。該函數(shù)把本地主機(jī)名存放入由name參數(shù)指定的緩沖區(qū)中。
10、返回的主機(jī)名是一個(gè)以NULL結(jié)束的字符串。主機(jī)名的形式取決于Windows Sockets實(shí)現(xiàn)-它可能是一個(gè)簡單的主機(jī)名,或者是一個(gè)域名。然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。如果沒有錯(cuò)誤發(fā)生,gethostname()返回0。否則它返回SOCKET_ERROR。</p><p> 3.2 函數(shù)gethostbyname</p>
11、;<p><b> 函數(shù)原型為:</b></p><p> struct hostent* gethostbyname(const char* addr);</p><p> 其中,addr為指向主機(jī)名的指針,它一般有函數(shù)gethostname返回。該函數(shù)返回對(duì)應(yīng)于給定主機(jī)名的包含主機(jī)名字和地址信息的hostent結(jié)構(gòu)指針,該結(jié)構(gòu)的格式如下:&
12、lt;/p><p> structhostent {</p><p> char*h_name;</p><p> char**h_aliases;</p><p> inth_addrtype;</p><p> inth_length;</p><p> char**h_addr_l
13、ist;</p><p> #define h_addr h_addr_list[0]</p><p><b> };</b></p><p> 其中,h_name是地址的正式名稱;h_aliases是空字節(jié)-地址的預(yù)備名稱的指針;h_addrtype地址類型,通常是AF_INET;h_length地址的比特長度;h_addr_list是
14、零字節(jié)-主機(jī)網(wǎng)絡(luò)地址指針;網(wǎng)絡(luò)字節(jié)順序;h_addr - h_addr_list中的第一地址。</p><p> 需要注意的是gethostbyname()函數(shù)屬于WinSock API庫,而在使用WinSock API之前,必須調(diào)用WSA-Startup函數(shù),只有該函數(shù)成功返回(表示應(yīng)用程序與WinSock庫成功地建立起連接),應(yīng)用程序才可以調(diào)用其他Windows Sockets DLL中的函數(shù)。當(dāng)程序?qū)⒁Y(jié)
15、束時(shí),又必須調(diào)用WSACleanup 函數(shù)進(jìn)行清理工作,以便釋放其占用的資源。WSACleanup 函數(shù)用來結(jié)束Windows Sockets DLL的使用。</p><p> 3.3 函數(shù)inet_ntoa</p><p><b> 函數(shù)原型為:</b></p><p> char FAR * inet_ntoa( struct in_
16、addr in);</p><p> 該函數(shù)將一個(gè)IP轉(zhuǎn)換成一個(gè)互聯(lián)網(wǎng)標(biāo)準(zhǔn)點(diǎn)分格式的字符串,in為一個(gè)表示Internet主機(jī)地址的結(jié)構(gòu)。如果正確,返回一個(gè)字符指針,指向一塊存儲(chǔ)著點(diǎn)分格式IP地址的靜態(tài)緩沖區(qū)(同一線程內(nèi)共享此內(nèi)存);錯(cuò)誤,返回NULL。</p><p> 3.4 函數(shù)TextOut</p><p><b> 函數(shù)原型為:</b
17、></p><p> BOOL TextOut(</p><p><b> HDC hdc,</b></p><p> int nXStart,</p><p> int nYStart, </p><p> LPCTSTR lpString,</p><p&g
18、t; int cbString </p><p><b> );</b></p><p> Hdc:設(shè)備環(huán)境的句柄</p><p> nXStart: 指定用于字符串對(duì)齊的基準(zhǔn)點(diǎn)的邏輯X坐標(biāo)。</p><p> nYStart:指定用于字符串對(duì)齊的基準(zhǔn)點(diǎn)的邏輯Y坐標(biāo)。</p><p>
19、 lpString:指向?qū)⒈焕L制字符串的指針。此字符串不必為以\0結(jié)束的,因?yàn)閏bString中指定了字符串的長度。</p><p> cbString:指定了字符串的長度。</p><p> 該函數(shù)用當(dāng)前選擇的字體、背景顏色和正文顏色將一個(gè)字符串寫到指定位置。如果函數(shù)調(diào)用成功,返回值為非零值。如果函數(shù)調(diào)用失敗,返回值為0。</p><p> 3.5 函數(shù)me
20、mcpy</p><p><b> 函數(shù)原型為:</b></p><p> void *memcpy(void *dest, const void *src, size_t n);</p><p> 該函數(shù)從源src所指的內(nèi)存地址的起始位置開始拷貝n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。</p><p>
21、 3.6 WSAData結(jié)構(gòu)</p><p><b> 結(jié)構(gòu)原型為:</b></p><p> structWSAData {</p><p> WORD wVersion;</p><p> WORD wHighVersion;</p><p> char szDescript
22、ion[WSADESCRIPTION_LEN+1];</p><p> char szSystemStatus[WSASYSSTATUS_LEN+1];</p><p> unsigned short iMaxSockets;</p><p> unsigned short iMaxUdpDg;</p><p> char
23、 *lpVendorInfo;</p><p><b> };</b></p><p> wVersion:Windows Sockets DLL期望調(diào)用者使用的Windows Sockets規(guī)范的版本。 高位字節(jié)存儲(chǔ)副版本號(hào), 低位字節(jié)存儲(chǔ)主版本號(hào),可以用WORD MAKEWORD(BYTE,BYTE ) 返回這個(gè)值,例如:MAKEWORD(1,1)<
24、/p><p> wHighVersion:這個(gè)DLL能夠支持的Windows Sockets規(guī)范的最高版本。通常它與wVersion相同。</p><p> szDescription:以null結(jié)尾的ASCII字符串,Windows Sockets DLL將對(duì)Windows Sockets實(shí)現(xiàn)的描述拷貝到這個(gè)字符串中,包括制造商標(biāo)識(shí)。文本(最多可以有256個(gè)字符)可以包含任何字符,但是要
25、注意不能包含控制字符和格式字符,應(yīng)用程序?qū)ζ渥羁赡艿氖褂梅绞绞前阉赡鼙唤財(cái)啵╋@示在在狀態(tài)信息中。</p><p> szSystemStatus:以null結(jié)尾的ASCII字符串,Windows Sockets DLL把有關(guān)的狀態(tài)或配置信息拷貝到該字符串中。Windows Sockets DLL應(yīng)當(dāng)僅在這些信息對(duì)用戶或支持人員有用時(shí)才使用它們,它不應(yīng)被作為szDescription域的擴(kuò)展。</p&g
26、t;<p> iMaxSockets:單個(gè)進(jìn)程能夠打開的socket的最大數(shù)目。Windows Sockets的實(shí)現(xiàn)能提供一個(gè)全局的socket池,可以為任何進(jìn)程分配;或者它也可以為socket分配屬于進(jìn)程的資源。這個(gè)數(shù)字能夠很好地反映Windows Sockets DLL或網(wǎng)絡(luò)軟件的配置方式。應(yīng)用程序的編寫者可以通過這個(gè)數(shù)字來粗略地指明Windows Sockets的實(shí)現(xiàn)方式對(duì)應(yīng)用程序是否有用。例如,X Windows
27、服務(wù)器在第一次啟動(dòng)的時(shí)候可能會(huì)檢查iMaxSockets的值:如果這個(gè)值小于8,應(yīng)用程序?qū)@示一條錯(cuò)誤信息,指示用戶重新配置網(wǎng)絡(luò)軟件(這是一種可能要使用szSystemStatus文本的場合)。顯然無法保證某個(gè)應(yīng)用程序能夠真正分配iMaxSockets個(gè)socket,因?yàn)榭赡苡衅渌黈indowsSockets應(yīng)用程序正在使用。</p><p> iMaxUdpDg:Windows Sockets應(yīng)用程序能夠發(fā)送
28、或接收的最大的用戶數(shù)據(jù)包協(xié)議(UDP)的數(shù)據(jù)包大小,以字節(jié)為單位。如果實(shí)現(xiàn)方式?jīng)]有限制,那么iMaxUdpDg為零。在Berkeley sockets的許多實(shí)現(xiàn)中,對(duì)于UDP數(shù)據(jù)包有個(gè)固有的限制(在必要時(shí)被分解),大小為8192字節(jié)。Windows Sockets的實(shí)現(xiàn)可以對(duì)碎片重組緩沖區(qū)的分配作出限制。對(duì)于適合的WindowsSockets 實(shí)現(xiàn),iMaxUdpDg的最小值為512。注意不管iMaxUdpDg的值是什么,都不推薦你發(fā)回
29、一個(gè)比網(wǎng)絡(luò)的最大傳送單元(MTU)還大的廣播數(shù)據(jù)包。(Windows Sockets API 沒有提供發(fā)現(xiàn)MTU的機(jī)制,但是它不會(huì)小于512個(gè)字節(jié))。WinSock2.0版中已被廢棄。</p><p> lpVendorInfo:指向銷售商的數(shù)據(jù)結(jié)構(gòu)的指針。這個(gè)結(jié)構(gòu)的定義(如果有)超出了WindowsSockets規(guī)范的范圍。WinSock2.0版中已被廢棄。</p><p><b
30、> 4 設(shè)計(jì)過程</b></p><p><b> 4.1 新建對(duì)話框</b></p><p> 啟動(dòng)Visual C++ 6.0,新建對(duì)話框應(yīng)用程序,工程名為sanjin,對(duì)話框標(biāo)題改為“主機(jī)名和IP地址”。</p><p><b> 4.2 添加控件</b></p><p&
31、gt; 刪除掉對(duì)話框模板上的控件,添加新控件,如下表所示。</p><p> 表1 控件及其屬性一覽表</p><p> 添加完控件后的對(duì)話框模板如下圖所示。</p><p> 圖1 添加完控件后的對(duì)話框模板圖</p><p> 4.3 添加成員變量</p><p> 打開ClassWizard對(duì)話框的
32、Member Variables標(biāo)簽,為下列控件添加成員變量。如下表所示。</p><p> 表2 控件及變量屬性</p><p> 4.4 為控件添加映射消息</p><p> 選擇MFC ClassWizard對(duì)話框的Message Maps標(biāo)簽,為以下控件添加映射消息。如下表所示。</p><p> 表3 控件映射消息&l
33、t;/p><p><b> 4.5 定義函數(shù)</b></p><p> 在sanjinDlg.h中定義一個(gè)Draw函數(shù)。</p><p><b> public:</b></p><p> void Draw();</p><p><b> 4.6 添加代碼&
34、lt;/b></p><p> 在sanjinDlg.cpp文件中添加代碼,實(shí)現(xiàn)功能。</p><p><b> 添加程序代碼如下:</b></p><p> void CSanjinDlg::OnButton1() </p><p><b> {</b></p><
35、;p> // TODO: Add your control notification handler code here</p><p> Invalidate();</p><p><b> }</b></p><p> void CSanjinDlg::OnButton2() </p><p><
36、b> {</b></p><p> // TODO: Add your control notification handler code here</p><p><b> OnOK();</b></p><p><b> }</b></p><p> void CSa
37、njinDlg::OnCheck1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> m_Chk1=!m_Chk1;//初始化</p><p><b> Dra
38、w();</b></p><p><b> }</b></p><p> void CSanjinDlg::Draw()</p><p><b> {</b></p><p> CClientDC dc(this);</p><p> int heigh
39、t;</p><p> CFont font;</p><p> height=75;</p><p> if(m_Chk1)</p><p> font.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,</p><p> GB2312_CHARSET,OUT
40、_DEVICE_PRECIS,</p><p> CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,</p><p> DEFAULT_PITCH,"宋體");</p><p><b> else</b></p><p> font.CreateFont(20,10,0,
41、0,FW_NORMAL,false,false,false,</p><p> GB2312_CHARSET,OUT_DEVICE_PRECIS,</p><p> CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,</p><p> DEFAULT_PITCH,"楷體_GB2312");</p><
42、;p> CRect rect(15,25,336,276);</p><p> dc.FillSolidRect(&rect,RGB(215,210,206));</p><p> dc.SelectObject(&font);</p><p> dc.SetBkMode(TRANSPARENT);</p><p&g
43、t; //初始化:如果不初始化,以下代碼將無法執(zhí)行</p><p> WSAData data;</p><p> if(WSAStartup(MAKEWORD(1,1),&data)!=0)</p><p><b> {</b></p><p> dc.TextOut(25,45,"初始化錯(cuò)
44、誤,無法獲取主機(jī)信息...");</p><p><b> }</b></p><p> char host[255];</p><p><b> //獲取主機(jī)名</b></p><p> if(gethostname(host,sizeof(host))==SOCKET_ERRO
45、R)</p><p><b> {</b></p><p> dc.TextOut(25,45,"無法獲取主機(jī)名");</p><p><b> }</b></p><p><b> else</b></p><p><
46、b> {</b></p><p> dc.TextOut(25,45,"本機(jī)主機(jī)名為:");</p><p> dc.TextOut(75,75,host);</p><p><b> }</b></p><p> //獲取計(jì)算機(jī)IP:gethostbyname也需要初始化
47、(上面已初始化)</p><p> struct hostent *p=gethostbyname(host);</p><p><b> if(p==0)</b></p><p><b> {</b></p><p> dc.TextOut(25,45,"無法獲取計(jì)算機(jī)主機(jī)名及I
48、P...");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> //本機(jī)IP:利用循環(huán),輸出本機(jī)所有IP</p><p> for(int i=
49、0;p->h_addr_list[i]!=0;i++)</p><p><b> {</b></p><p> struct in_addr in;</p><p> memcpy(&in,p->h_addr_list[i],sizeof(struct in_addr));</p><p>
50、dc.TextOut(25,height+(i+1)*height/3,"塊網(wǎng)卡IP為:");//除以3只能正常</p><p> //顯示兩個(gè)IP,要想顯示多個(gè)IP地址還需添加一個(gè)計(jì)算IP地址個(gè)數(shù)的循環(huán)</p><p> dc.TextOut(75,height+(i+1)*height*2/3,inet_ntoa(in));</p><p&g
51、t;<b> }</b></p><p><b> }</b></p><p> WSACleanup();</p><p><b> }</b></p><p> 程序說明:函數(shù)OnButton1()調(diào)用Invalidate()實(shí)現(xiàn)擦除功能,函數(shù)OnButton1
52、()調(diào)用OnOK()實(shí)現(xiàn)退出功能,OnCheck1()作為觸發(fā)主要功能程序Draw()運(yùn)行的函數(shù)。Draw()函數(shù)定義了一個(gè)CClientDC類的對(duì)象dc,和一個(gè)Cfont類的對(duì)象font。定義對(duì)象dc來實(shí)現(xiàn)將所獲得的主機(jī)名和IP地址顯示在對(duì)話框上,定義對(duì)象font來設(shè)置字體樣式。</p><p> 4.7 設(shè)計(jì)icon并運(yùn)行程序</p><p> 在Resource View中擦除原
53、icon,為自己設(shè)計(jì)一個(gè)Icon。然后將程序編譯并鏈接,運(yùn)行程序,查看運(yùn)行結(jié)果。</p><p> 5 程序運(yùn)行結(jié)果及分析</p><p> 程序運(yùn)行的最終效果如圖所示。</p><p> 圖2 最終效果圖</p><p> 點(diǎn)擊運(yùn)行后,調(diào)用Draw()函數(shù),Draw()函數(shù)調(diào)用gethostname()和getbyhostnam
54、e()得到本地主機(jī)名和IP地址,并調(diào)用TextOut()顯示在窗口的指定位置。</p><p><b> 6 心得體會(huì)</b></p><p> 本次課設(shè)實(shí)現(xiàn)了獲取本地主機(jī)名和IP地址的功能,并用基本對(duì)話框顯示所獲得的結(jié)果,可以說是成功的。有一個(gè)小缺點(diǎn)是要使程序顯示出主機(jī)名和IP地址是通過點(diǎn)擊復(fù)選框,這不符合通常我們都是點(diǎn)擊按鈕的習(xí)慣。但總體上我以為是成功的。&l
55、t;/p><p> 為了做這個(gè)課設(shè),我確實(shí)花了一番心思。雖說有C語言的基礎(chǔ),但實(shí)際上從我拿到題目查資料到最終做出來,我有一種從零學(xué)起的感覺。這主要是因?yàn)閂C++內(nèi)容太多,一時(shí)之間難以接受這么多。當(dāng)然,這也從另一方面反映了VC++功能之強(qiáng)大,對(duì)這一點(diǎn)還從我查資料的過程中有所體會(huì)。這次課設(shè)最大的收獲可以說是更進(jìn)一步了解了什么是學(xué)習(xí),最大的進(jìn)步是學(xué)會(huì)了如何面對(duì)問題。以前遇到問題,我通常都會(huì)變得心浮氣躁,甚至?xí)搿傲T工”,
56、但這一次卻沒有。這一次的課設(shè)過程還是我的一個(gè)新認(rèn)識(shí)的落實(shí)。說實(shí)話,我是這學(xué)期才明白“鉆研”是什么意思,我覺得所謂“鉆研”其實(shí)和“死磕”很有點(diǎn)像,只不過“鉆研”需要心平氣和,因?yàn)椴恍钠綒夂途筒蝗菀组L久。我覺得我這次的課設(shè)就有點(diǎn)在和VC++“死磕”的感覺。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]管皓,高永麗.別樣詮釋—一個(gè)Visual C
57、++老鳥10年學(xué)習(xí)與開發(fā)心得.北京:北京航空航天大學(xué)出版社,2012.11</p><p> [2]梁海英.Visual C++程序設(shè)計(jì).北京:清華大學(xué)出版社,2013</p><p> [3]唐文超.Visual C++網(wǎng)絡(luò)編程.北京:清華大學(xué)出版社,2013</p><p> [4]趙永發(fā),劉莉莉.Visual C++入門經(jīng)典.北京:機(jī)械工業(yè)出版社,201
58、3</p><p> [5]張水波,董志鵬.Visual C++網(wǎng)絡(luò)大講堂.北京:清華大學(xué)出版社,2013</p><p> 附錄1 sanjinDlg.cpp程序</p><p> // sanjinDlg.cpp : implementation file</p><p><b> //</b><
59、/p><p> #include "stdafx.h"</p><p> #include "sanjin.h"</p><p> #include "sanjinDlg.h"</p><p> #ifdef _DEBUG</p><p> #defin
60、e new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////
61、////////////////////////////////////////</p><p> // CSanjinDlg dialog</p><p> CSanjinDlg::CSanjinDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CSanjinDlg::IDD, pParent)</p>
62、;<p><b> {</b></p><p> //{{AFX_DATA_INIT(CSanjinDlg)</p><p> m_Chk1 = FALSE;</p><p> //}}AFX_DATA_INIT</p><p> // Note that LoadIcon does not re
63、quire a subsequent DestroyIcon in Win32</p><p> m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);</p><p><b> }</b></p><p> void CSanjinDlg::DoDataExchange(CDataExcha
64、nge* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CSanjinDlg)</p><p> DDX_Check(pDX, IDC_CHECK1, m_Chk1);</p&
65、gt;<p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CSanjinDlg, CDialog)</p><p> //{{AFX_MSG_MAP(CSanjinDlg)</p><p> ON_WM_PAINT
66、()</p><p> ON_WM_QUERYDRAGICON()</p><p> //添加消息響應(yīng)函數(shù),為每個(gè)消息處理函數(shù)加入一個(gè)入口</p><p> ON_BN_CLICKED(IDC_BUTTON1, OnButton1)</p><p> ON_BN_CLICKED(IDC_BUTTON2, OnButton2)</
67、p><p> ON_BN_CLICKED(IDC_CHECK1, OnCheck1)</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> //////////////////////////////////////////////////////////////////
68、///////////</p><p> // CSanjinDlg message handlers</p><p> BOOL CSanjinDlg::OnInitDialog()</p><p><b> {</b></p><p> CDialog::OnInitDialog();</p>
69、<p> // Set the icon for this dialog. The framework does this automatically</p><p> // when the application's main window is not a dialog</p><p> SetIcon(m_hIcon, TRUE);// Set b
70、ig icon</p><p> SetIcon(m_hIcon, FALSE);// Set small icon</p><p> // TODO: Add extra initialization here</p><p> return TRUE; // return TRUE unless you set the focus to a c
71、ontrol</p><p><b> }</b></p><p> // If you add a minimize button to your dialog, you will need the code below</p><p> // to draw the icon. For MFC applications using
72、 the document/view model,</p><p> // this is automatically done for you by the framework.</p><p> void CSanjinDlg::OnPaint() </p><p><b> {</b></p><p>
73、if (IsIconic())</p><p><b> {</b></p><p> CPaintDC dc(this); // device context for painting</p><p> SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);</p&
74、gt;<p> // Center icon in client rectangle</p><p> int cxIcon = GetSystemMetrics(SM_CXICON);</p><p> int cyIcon = GetSystemMetrics(SM_CYICON);</p><p> CRect rect;</p&g
75、t;<p> GetClientRect(&rect);</p><p> int x = (rect.Width() - cxIcon + 1) / 2;</p><p> int y = (rect.Height() - cyIcon + 1) / 2;</p><p> // Draw the icon</p>&l
76、t;p> dc.DrawIcon(x, y, m_hIcon);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> CDialog::OnPaint();</p>
77、<p><b> }</b></p><p><b> }</b></p><p> // The system calls this to obtain the cursor to display while the user drags</p><p> // the minimized win
78、dow.</p><p> HCURSOR CSanjinDlg::OnQueryDragIcon()</p><p><b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p><b> }</b></p><p>
79、 void CSanjinDlg::OnButton1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> Invalidate();//設(shè)置無效</p><p><b
80、> }</b></p><p> void CSanjinDlg::OnButton2() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> OnOK()
81、;//退出</p><p><b> }</b></p><p> void CSanjinDlg::OnCheck1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code her
82、e</p><p> m_Chk1=!m_Chk1;//初始化</p><p> Draw();//調(diào)用函數(shù)</p><p><b> }</b></p><p> void CSanjinDlg::Draw()</p><p><b> {</b></p&g
83、t;<p> CClientDC dc(this);//定義對(duì)象dc以調(diào)用CClientDC中的成員函數(shù)</p><p> int height;</p><p> CFont font;//定義對(duì)象font以設(shè)置字體</p><p> height=75;</p><p> if(m_Chk1)</p>
84、<p> font.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,</p><p> GB2312_CHARSET,OUT_DEVICE_PRECIS,</p><p> CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,</p><p> DEFAULT_PITCH,&q
85、uot;宋體");</p><p><b> else</b></p><p> font.CreateFont(20,10,0,0,FW_NORMAL,false,false,false,</p><p> GB2312_CHARSET,OUT_DEVICE_PRECIS,</p><p> CLIP
86、_DEFAULT_PRECIS,DEFAULT_QUALITY,</p><p> DEFAULT_PITCH,"楷體_GB2312");</p><p> CRect rect(15,25,336,276);//畫矩形框</p><p> dc.FillSolidRect(&rect,RGB(215,210,206));//設(shè)置矩
87、形框的顏色</p><p> dc.SelectObject(&font);</p><p> dc.SetBkMode(TRANSPARENT);</p><p> //初始化:如果不初始化,以下代碼將無法執(zhí)行</p><p> WSAData data;</p><p> if(WSAStartu
88、p(MAKEWORD(1,1),&data)!=0)</p><p> //在使用WinSock API之前,必須調(diào)用WSA-Startup函數(shù),</p><p> //只有該函數(shù)成功返回(表示應(yīng)用程序與WinSock庫成功地建立起連接),</p><p> //應(yīng)用程序才可以調(diào)用其他Windows Sockets DLL中的函數(shù)。當(dāng)程序?qū)⒁Y(jié)束時(shí),&
89、lt;/p><p> //又必須調(diào)用WSACleanup 函數(shù)進(jìn)行清理工作,以便釋放其占用的資源。</p><p><b> {</b></p><p> dc.TextOut(25,45,"初始化錯(cuò)誤,無法獲取主機(jī)信息...");//調(diào)用TextOut函數(shù)</p><p><b> }
90、 </b></p><p> char host[255];</p><p><b> //獲取主機(jī)名</b></p><p> if(gethostname(host,sizeof(host))==SOCKET_ERROR)</p><p> //把本地主機(jī)名存放入由host參數(shù)指定的緩沖區(qū)中&l
91、t;/p><p><b> {</b></p><p> dc.TextOut(25,45,"無法獲取主機(jī)名");</p><p><b> }</b></p><p><b> else</b></p><p><b>
92、; {</b></p><p> dc.TextOut(25,45,"本機(jī)主機(jī)名為:");</p><p> dc.TextOut(75,75,host);</p><p><b> }</b></p><p> //獲取計(jì)算機(jī)IP:gethostbyname也需要初始化(上面已
93、初始化)</p><p> struct hostent *p=gethostbyname(host);</p><p> //返回對(duì)應(yīng)于給定主機(jī)名的包含主機(jī)名字和地址信息的hostent結(jié)構(gòu)指針</p><p><b> if(p==0)</b></p><p><b> {</b><
94、;/p><p> dc.TextOut(25,45,"無法獲取計(jì)算機(jī)主機(jī)名及IP...");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>
95、 //本機(jī)IP:利用循環(huán),輸出本機(jī)所有IP</p><p> for(int i=0;p->h_addr_list[i]!=0;i++)</p><p><b> {</b></p><p> struct in_addr in;</p><p> memcpy(&in,p->h_addr_
96、list[i],sizeof(struct in_addr));</p><p> //從源p->h_addr_list[i]所指的內(nèi)存地址的起始位置</p><p> //開始拷貝sizeof(struct in_addr)個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中</p><p> dc.TextOut(25,height+(i+1)*heigh
97、t/3,"IP地址為:");</p><p> dc.TextOut(75,height+(i+1)*height*2/3,inet_ntoa(in));</p><p> //函數(shù)inet_ntoa將一個(gè)IP轉(zhuǎn)換成一個(gè)互聯(lián)網(wǎng)標(biāo)準(zhǔn)點(diǎn)分格式的字符串</p><p><b> }</b></p><p&
98、gt;<b> }</b></p><p> WSACleanup();//來結(jié)束Windows Sockets DLL的使用。</p><p><b> }</b></p><p> 附錄2 頭文件sanjinDlg.h</p><p> // sanjinDlg.h : heade
99、r file</p><p><b> //</b></p><p> #if !defined(AFX_SANJINDLG_H__351C02BB_27DD_410A_968A_AE76FDF3C7CE__INCLUDED_)</p><p> #define AFX_SANJINDLG_H__351C02BB_27DD_410A_96
100、8A_AE76FDF3C7CE__INCLUDED_</p><p> #if _MSC_VER > 1000</p><p> #pragma once</p><p> #endif // _MSC_VER > 1000</p><p> ////////////////////////////////////////
101、/////////////////////////////////////</p><p> // CSanjinDlg dialog</p><p> class CSanjinDlg : public CDialog</p><p><b> {</b></p><p> // Construction<
102、;/p><p><b> public:</b></p><p> CSanjinDlg(CWnd* pParent = NULL);// standard constructor</p><p> void Draw();//定義一個(gè)Draw函數(shù)</p><p> // Dialog Data</p>
103、<p> //{{AFX_DATA(CSanjinDlg)</p><p> enum { IDD = IDD_SANJIN_DIALOG };</p><p> BOOLm_Chk1;//IDC_CHECK1對(duì)應(yīng)的變量</p><p> //}}AFX_DATA</p><p> // ClassWizard ge
104、nerated virtual function overrides</p><p> //{{AFX_VIRTUAL(CSanjinDlg)</p><p> protected:</p><p> virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support</p>&
105、lt;p> //}}AFX_VIRTUAL</p><p> // Implementation</p><p> protected:</p><p> HICON m_hIcon;</p><p> // Generated message map functions</p><p> //{{A
106、FX_MSG(CSanjinDlg)</p><p> virtual BOOL OnInitDialog();</p><p> afx_msg void OnPaint();</p><p> afx_msg HCURSOR OnQueryDragIcon();</p><p> afx_msg void OnButton1();
107、//添加的控件對(duì)應(yīng)的函數(shù)</p><p> afx_msg void OnButton2();</p><p> afx_msg void OnCheck1();</p><p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };&
108、lt;/b></p><p> //{{AFX_INSERT_LOCATION}}</p><p> // Microsoft Visual C++ will insert additional declarations immediately before the previous line.</p><p> #endif // !defined(A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信試題
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信試題(含答案)
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信課程設(shè)計(jì)---小型網(wǎng)吧局域網(wǎng)設(shè)計(jì)方案
- 計(jì)算機(jī)網(wǎng)絡(luò)與通信實(shí)驗(yàn)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)----ip地址的合法性及子網(wǎng)判斷
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-監(jiān)控ip包流量
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---ip地址的合法性及子網(wǎng)判斷
- 發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)--計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---網(wǎng)絡(luò)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--小規(guī)模ip網(wǎng)絡(luò)的建立
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告--監(jiān)控ip包流量
評(píng)論
0/150
提交評(píng)論