




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 . . . XXXXX大學(xué)C+面向?qū)ο笳n程設(shè)計(jì)報告院(系): 計(jì)算機(jī)工程學(xué)院 專業(yè): 計(jì)算機(jī)網(wǎng)絡(luò)工程 學(xué)生: XXXXXX 班級:網(wǎng)絡(luò)081學(xué)號: 200807255 題目: 局域網(wǎng)聊天程序 起迄日期: 2010.12.20 2010.12.31 設(shè)計(jì)地點(diǎn): XX理工大學(xué)2#401 指導(dǎo)教師: XXXXXX 完成日期: 2010 年 12 月 31 日目錄一 需求分析31.1 客戶機(jī)端31.2 服務(wù)器端3二 設(shè)計(jì)容42.1 程序整體結(jié)構(gòu)42.2 各部分子模塊功能52.3 各子模塊代碼編寫6三 調(diào)試分析83.1 實(shí)際完成情況83.2 出現(xiàn)的問題與解決方案83.3 可以改進(jìn)的地方93.4 可以擴(kuò)
2、充的功能10四 用戶手冊114.1 程序主界面114.2 獲取本地信息114.3 發(fā)送信息124.4 接收信息124.5 總體演示12五 設(shè)計(jì)總結(jié)13六 參考文獻(xiàn)14七 附錄151 需求分析此次開發(fā)的網(wǎng)絡(luò)聊天工具可作為個人的交流工具使用,通信的安全性不是很高,但要求信息的響應(yīng)速度要較快,讓用戶充分享受到網(wǎng)絡(luò)即時消息的方便和快捷。本聊天工具由服務(wù)器端程序和客戶端程序兩部分組成,整體采用C+平臺開發(fā),沒有使用管理數(shù)據(jù)庫。服務(wù)器和與客戶端都包含與用戶的交互式界面,它有必要的界面的按鈕,向用戶提供網(wǎng)絡(luò)即時消息的功能。本聊天需要包含如下本功能:1.1 客戶機(jī)端ü 獲取本地IP地址ü
3、獲取本地通信端口ü 獲取遠(yuǎn)程IP地址ü 獲取本地主機(jī)名ü 獲取從服務(wù)器端發(fā)送過來的信息ü 給服務(wù)器發(fā)送用戶自定義的數(shù)據(jù)1.2 服務(wù)器端ü 獲取本地IP地址ü 獲取本地通信端口ü 獲取遠(yuǎn)程IP地址ü 獲取本地主機(jī)名ü 獲取從服務(wù)器端發(fā)送過來的信息ü 向客戶機(jī)發(fā)送用戶自定義的數(shù)據(jù)2 設(shè)計(jì)容2.1 程序整體結(jié)構(gòu)WinMain()(主函數(shù))DialogBoxParam()(生成對話框)DialogProc()(對話框消息處理函數(shù))消息隊(duì)列用戶操作(點(diǎn)擊確定、點(diǎn)擊關(guān)閉)WM_INITDIALOG(對話框初
4、始化)WM_COMMAND(用戶命令)WM_USE+1(用注冊消息)IDOK(用戶點(diǎn)擊確定)IDCANCEL(用戶點(diǎn)擊關(guān)閉)FD_READ(讀取信息消息)2.2 各部分子模塊功能WM_INITDIALOG(對話框初始化)IDOK(用戶點(diǎn)擊確定)IDCANCEL(用戶點(diǎn)擊關(guān)閉)FD_READ(讀取信息消息)WSAStartup()(啟動網(wǎng)絡(luò)動態(tài)鏈接庫)Socket()(產(chǎn)生套接字)Bind()(套接字綁定)WSAAsyncSelect()(注冊自定義網(wǎng)絡(luò)消息)Sendto()(向遠(yuǎn)程主機(jī)發(fā)送信息)Recv()(接收遠(yuǎn)程數(shù)據(jù))GetDlgItemText()(獲取用戶的信息輸入)SetDlgIte
5、mText()(設(shè)定對話框控件數(shù)據(jù))WSAAsyncSelect()注冊自定義網(wǎng)絡(luò)消息Closesocket()關(guān)閉套接字WSACLeanup()(卸載網(wǎng)絡(luò)動態(tài)鏈接庫)2.3 各子模塊代碼編寫1) WM_INITDIALOG模塊switch(UMsg)case WM_INITDIALOG:CLIENT.INIT_MYSOCKET(hwndDlg);=void MYSOCKET:INIT_MYSOCKET(HWND &hwndDlg)WSAStartup(0x0101, &wsaData);udp_sd=socket(AF_INET, SOCK_DGRAM, 0);bind(ud
6、p_sd, (LPSOCKADDR)&Local_PC, sizeof(Local_PC);WSAAsyncSelect(udp_sd, hwndDlg, WM_USER+1, FD_READ);2) IDOK模塊switch(LOWORD(wParam)case IDOK:CLIENT.MYSOCK_SEND(hwndDlg);break;=void MYSOCKET:MYSOCK_SEND(HWND &hwndDlg)GetDlgItemText(hwndDlg, IDC_SEND, Buffer, sizeof(Buffer);sendto(udp_sd, Buffer,
7、 strlen(Buffer), 0, (struct sockaddr *)&Remote_PC, len); 3) IDCANCEL模塊case IDCANCEL:CLIENT.END_MYSOCKET(hwndDlg);EndDialog(hwndDlg, 0);break;=void END_MYSOCKET(HWND &hwndDlg)WSAAsyncSelect(udp_sd, hwndDlg, 0, 0);closesocket(udp_sd);WSACleanup(); 4) FD_READ模塊case WM_USER+1:switch(LOWORD(lPara
8、m)case FD_READ:CLIENT.MYSOCK_RECV(hwndDlg);break;=void MYSOCKET:MYSOCK_RECV(HWND &hwndDlg)recv(udp_sd, Buffer, sizeof(Buffer), 0);SetDlgItemText(hwndDlg, IDC_RECV, Buffer);3 調(diào)試分析3.1 實(shí)際完成情況經(jīng)過幾天的學(xué)習(xí)與調(diào)試,該“局域網(wǎng)聊天程序”僅僅能實(shí)現(xiàn)點(diǎn)對點(diǎn)通信,不能實(shí)現(xiàn)一對多、多對多、多對一等通信模式,也就是說,只能開啟一個客戶機(jī)和一個服務(wù)器,若有多個程序副本在運(yùn)行,則可能導(dǎo)致接收以與發(fā)送數(shù)據(jù)的混亂。用戶在輸入
9、數(shù)據(jù)的時候不能包含換行符號,即只能輸入一行信息。用戶在接受數(shù)據(jù)的時候,不能判定它是來自哪臺主機(jī)。服務(wù)器端不能自動發(fā)現(xiàn)上線的客戶端,同樣客戶端也不能自動發(fā)現(xiàn)上線的服務(wù)器端,兩者都是在假設(shè)對方在線的前提下發(fā)送數(shù)據(jù)的,這是因?yàn)樵摗熬钟蚓W(wǎng)聊天程序”是基于UDP協(xié)議編寫的,它是無連接的協(xié)議。3.2 出現(xiàn)的問題與解決方案1) C+類的封裝性封裝就是把對象的屬性和操作結(jié)合成一個獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對象的部細(xì)節(jié)。通過對抽象結(jié)果進(jìn)行封裝,將一部分行為作為外部訪問的接口與外部發(fā)送聯(lián)系,而將數(shù)據(jù)和其他行為進(jìn)行有效隱藏,就可以達(dá)到對數(shù)據(jù)訪問權(quán)限的合理控制。通過這種有效隱藏和合理控制,就可以增強(qiáng)數(shù)據(jù)的安全性,減
10、輕開發(fā)軟件系統(tǒng)的難度。在類中,封裝是通過存取權(quán)限實(shí)現(xiàn)的。雖然封裝性是C+的一個重要特點(diǎn),但在編寫“局域網(wǎng)聊天程序”的時候給我造成了很大的阻礙。起初我是把負(fù)責(zé)“接收”、“發(fā)送”數(shù)據(jù)的緩沖變量“Buffer”封裝在類中(私有成員),但操作Buffer的函數(shù)(如GetDlgItemText、 SetDlgItemText)都是在類外訪問Buffer變量,開始以為通過return語句把指針傳送到對象外就能操作對象里面的Buffer變量,但經(jīng)過一段時間的測試,程序不能正常運(yùn)行。所以我改變了類的封裝方式,不但把Buffer變量封裝在類里面,而且把操作Buffer變量的函數(shù)也封裝為類中的某些成員函數(shù),這樣就
11、解決了C+類的封裝特性給我?guī)淼膯栴}。2) 對象是自動變量局部變量,如不作專門說明為靜態(tài)變量,都是動態(tài)分配存儲空間,存儲在動態(tài)存儲區(qū)中。這種變量叫自動變量。這種變量只在定義它們的時候才創(chuàng)建,在定義它們的函數(shù)返回時系統(tǒng)回收變量所占存儲空間。對這些變量存儲空間的分配和回收是由系統(tǒng)自動完成的,所以也叫自動變量。一般情況下,不作專門說明的局部變量,均是自動變量。BOOL DialogProc(HWND hwndDlg,UINT UMsg,WPARAM wParsam,LPARAM lParam)static MYSOCKET CLIENT(TEXT(""), 43
12、21, TEXT(""), 6321);switch(UMsg)case WM_INITDIALOG:CLIENT.INIT_MYSOCKET(hwndDlg); /初始化套接字.DialogProc函數(shù)是系統(tǒng)指定的對話框消息處理回調(diào)函數(shù),它是被系統(tǒng)自動地根據(jù)用戶消息調(diào)用。而且發(fā)送給該函數(shù)的消息“WM_INITDIALOG”只有在初始化對話框時才被調(diào)用,由于局部變量默認(rèn)是自動變量,所以由MYSOCKET類構(gòu)造的CLIENT對象在每次系統(tǒng)回調(diào)該函數(shù)的時候,都會被初始化一遍,而這種操作破壞了套接字與本地信息的綁定,因此服務(wù)器端于客戶機(jī)端程序不能正常通信。解決這
13、個問題的方法就是使用static操作符使變量變成靜態(tài)值,使CLIENT對象在函數(shù)在多次被調(diào)用時,能夠維持它的原始值。即把語句MYSOCKET CLIENT(TEXT(""), 4321, TEXT(""), 6321);改變?yōu)檎Z句static MYSOCKET CLIENT(TEXT(""), 4321, TEXT(""), 6321);程序正常運(yùn)行3) 端口沖突程序給服務(wù)器端分配的的端口號是5000, 給客戶機(jī)端分配的端口號是4000。程序一
14、直運(yùn)行的很正常,但偶然的一次測試發(fā)現(xiàn)程序間不能正常通信,經(jīng)過反復(fù)的調(diào)試、測試并沒有發(fā)現(xiàn)代碼中存在什么問題。我試著改了改端口號服務(wù)器端:6321;客戶機(jī)端:4321。測試通過了。3.3 可以改進(jìn)的地方1) 用戶界面用VC+開發(fā)的界面生硬、死板,并不友好,若能使用一些開發(fā)程序皮膚的庫文件,使用戶界面更加友好。3.4 可以擴(kuò)充的功能1) 多用戶聊天本程序的邏輯拓?fù)淇梢詮幕赨DP無連接協(xié)議的“點(diǎn)對點(diǎn)”拓?fù)洌D(zhuǎn)化為基于TCP面向連接的“星型”拓?fù)?,以?shí)現(xiàn)多用戶之間的回話。若能采用TCP協(xié)議,用戶間的通信時通過服務(wù)器的轉(zhuǎn)發(fā)功能實(shí)現(xiàn)的,服務(wù)器端程序不修改接收的的信息,只充當(dāng)“數(shù)據(jù)轉(zhuǎn)發(fā)角色”,把數(shù)據(jù)按照用戶
15、想要傳送的目的地發(fā)送到目的。假設(shè)客戶機(jī)A想要把數(shù)據(jù)發(fā)送給客戶機(jī)B,客戶機(jī)A先把數(shù)據(jù)發(fā)送給服務(wù)器端,然后服務(wù)器將數(shù)據(jù)轉(zhuǎn)發(fā)給客戶機(jī)B,這樣對客戶機(jī)A而言,服務(wù)器端是透明的,好像是客戶機(jī)直接在跟客戶機(jī)B通信一樣。具體的拓?fù)淙缦聢D所示:2) 自動發(fā)現(xiàn)功能假設(shè)服務(wù)器端程序在線,當(dāng)客戶端程序上線的時候,服務(wù)器端能夠自動偵測到客戶機(jī)端上線,并獲取客戶機(jī)端的用戶名、IP地址、通信端口號等必要通信信息,并記錄在自己的數(shù)據(jù)庫中登記。3) 文件發(fā)送共更能在聊天功能(即發(fā)送字符信息)成功實(shí)現(xiàn)的前提下,可以再加入文件傳送功能,使這個“局域網(wǎng)聊天程序”的功能更加強(qiáng)大。4 用戶手冊4.1 程序主界面雖然本程序是基于客戶機(jī)/
16、服務(wù)器(C/S)模式的通信,但兩者的用戶界面是一致的,所以在使用上不會給用戶帶來困難。服務(wù)器端、客戶端都包含一個接受信息的控件(IDC_RECV)、一個用于發(fā)送信息的控件(IDC_SEND)、一個發(fā)送按鈕(IDOK)、部分靜態(tài)文本(IDC_STATIC)、部分本機(jī)信息控件(本地主機(jī)名(IDC_HOST)、本地IP地址(IDC_IP)、本地端口號(IDC_PORT)、遠(yuǎn)程IP地址(IDC_IP_REMOTE)。4.2 獲取本地信息服務(wù)器端和客戶機(jī)端的信息是自動獲取的,不需要用戶干預(yù)。它將自動獲取本地主機(jī)名、本地IP地址、本地端口號、遠(yuǎn)程通信IP地址。下面是在不同計(jì)算機(jī)上運(yùn)行客戶機(jī)端的本地信息截圖
17、。4.3 發(fā)送信息只要在“發(fā)送:”下面的控件窗口中填入您想要發(fā)送的信息,然后按“發(fā)送”按鈕,即可發(fā)送到遠(yuǎn)程計(jì)算機(jī)。4.4 接收信息客戶端、服務(wù)器端接收的信息,都會顯示在“接收”控件中。4.5 總體演示1. 同時運(yùn)行UDP Client和UDP Server。2. 在Server端發(fā)送“Hello, IM Server!”,在Client端發(fā)送“Hello, IM Client”。3. 在程序、網(wǎng)絡(luò)正常的情況下,Server端會接收到Client端發(fā)送的信息“Hello, IM Client”;同樣,Client端會接收到Server端發(fā)送的信息“Hello, IM Server!”。5 設(shè)計(jì)總
18、結(jié)經(jīng)過兩個兩個星期的實(shí)踐學(xué)習(xí),使我對C+語言、WINDOWS編程、WINDOWS SOCKET編程有了更進(jìn)一步的認(rèn)識和了解,要想學(xué)好它重要在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它,通過實(shí)踐,我也發(fā)現(xiàn)我的好多不足之處,首先是自己在指法上還不行,經(jīng)常按錯字母,通過學(xué)習(xí)也有所改進(jìn);再有對SOCKET API中的一些標(biāo)準(zhǔn)函數(shù)庫不太了解,還有對函數(shù)調(diào)用的正確使用不夠熟悉,還有對C+語言中經(jīng)常出現(xiàn)的錯誤也不了解,通過實(shí)踐,使我在這幾個方面的認(rèn)識有所提高。通過實(shí)踐的學(xué)習(xí),我認(rèn)識到學(xué)好計(jì)算機(jī)要重視實(shí)踐操作,不僅僅是學(xué)習(xí)C+語言,還是WINDOWS編程,以與其它的計(jì)算機(jī)方面的知識都要重在實(shí)踐,所以以后再學(xué)習(xí)
19、過程中,我會更加注重實(shí)踐操作,使自己更好地學(xué)好計(jì)算機(jī)。尤其是在使用SDK編寫基于對話框的程序時,接觸了全新的WINDOWS的“消息處理”機(jī)制。在參考了眾多資料后,成功調(diào)試了“局域網(wǎng)聊天程序”的用戶界面,這為后期編寫SOCKET核心代碼提供了基礎(chǔ)。編寫通信部分核心代碼時,也加深了對“套接字”、“綁定”、“動態(tài)庫”、“端口”等屬于的理解。由于本次設(shè)計(jì)接觸到了兩個全新的領(lǐng)域,一是網(wǎng)絡(luò)通信程序的編寫,另一個是C+面向?qū)ο蟪绦虻木帉?,為了在開發(fā)后期更好的分離錯誤的出處,我先是用C語言獨(dú)立編寫了網(wǎng)絡(luò)通信部分、用戶界面部分,然后再由C+將其封裝為類,但中間的調(diào)試花費(fèi)了我大量的時間,就是因?yàn)闆]有充分理解C+類
20、的封裝性與C面向過程程序設(shè)計(jì)的異同。所以本次開發(fā)使我更好的認(rèn)識了C+、C、Windows以與網(wǎng)絡(luò)通信的知識。通過分析、設(shè)計(jì)、編碼、調(diào)試等各環(huán)節(jié)的訓(xùn)練,深刻理解、C+程序設(shè)計(jì)技術(shù),掌握分析、解決實(shí)際問題的能力。綜合運(yùn)用所學(xué)知識,上機(jī)解決一些與實(shí)際應(yīng)用結(jié)合緊密的、規(guī)模較大的問題,逐步掌握軟件開發(fā)的基本思想、方法和實(shí)現(xiàn)步驟,提高實(shí)際應(yīng)用水平。這次課程設(shè)計(jì)基本上含蓋了本學(xué)期學(xué)習(xí)到的C+語言知識點(diǎn),課設(shè)題目要求不僅要求對課本知識有較深刻的了解,同時要求程序設(shè)計(jì)者有較強(qiáng)的動手能力以與自學(xué)能力。這次課設(shè)使我了解我編程思想和編程技巧,也認(rèn)識了軟件生命周期的各個環(huán)境,包括構(gòu)思、設(shè)計(jì)、編寫、調(diào)試、發(fā)布、文檔化、維
21、護(hù)和修訂。編程的風(fēng)格也很重要,程序有了良好的編程風(fēng)格,有良好的程序注釋,會在后期調(diào)試程序、程序排錯過程中獲益的;若只關(guān)心程序運(yùn)行的結(jié)果,而對程序代碼的結(jié)構(gòu)的良好絲毫不在意,是非常不可取的,如果我們希望將來從事編程工作,在這一點(diǎn)上該引起足夠的重視。這是嚴(yán)謹(jǐn)?shù)膽B(tài)度,很重要!6 參考文獻(xiàn)1. Jeffrey Richter,Christophe Nasarre. Windows核心編程(第五版). :清華大學(xué). 2008.92. Charles Petzold.Windows程序設(shè)計(jì)(第五版). :大學(xué). 1999.113. Kenneth A.Reek.C和指針。 :人名郵電. 2008.44.
22、蘭,任鳳華. C+面向?qū)ο蟪绦蛟O(shè)計(jì). :電子科技大學(xué). 2010.95. W.Richard Stevens. TCP/IP詳解 卷1:協(xié)議. :機(jī)械工業(yè). 2000.46. 莉C+語言程序設(shè)計(jì)(第3版):清華大學(xué),2005.77. 錢能C+程序設(shè)計(jì)教程(第2版):清華大學(xué),2005.88. 譚浩強(qiáng). C+程序設(shè)計(jì). :清華大學(xué). 20017 附錄/ 服務(wù)器端與客戶機(jī)端所使用的類/ COMMON.Hclass MYSOCKETpublic:/*MYSOCKET類構(gòu)造函數(shù)* 1.保存通信端口到成員變量* A.本地:Local_Port_Num* B.遠(yuǎn)程:Remote_Port_Num* 2.設(shè)
23、置通信地址與端口* A.本地::local_port* B.遠(yuǎn)程::remote_port* 3.獲取"struct sockaddr"類型長度*/MYSOCKET(TCHAR *Local_IP,WORD local_port,TCHAR *Remote_IP, WORD remote_port)Local_Port_Num=local_port;Remote_Port_Num=remote_port;memset(&Local_PC, 0, sizeof(Local_PC);Local_PC.sin_family=AF_INE
24、T;Local_PC.sin_addr.s_addr=inet_addr(Local_IP);Local_PC.sin_port=htons(local_port);memset(&Remote_PC, 0, sizeof(Remote_PC);Remote_PC.sin_family=AF_INET;Remote_PC.sin_addr.s_addr=inet_addr(Remote_IP);Remote_PC.sin_port=htons(remote_port);len=sizeof(struct sockaddr_in);/*初始化套接字* 1.用WSAStartup函數(shù)啟動網(wǎng)
25、絡(luò)動態(tài)庫* 2.用socket函數(shù)生成UDP套接字* 3.用bind函數(shù)將UDP套接字與本機(jī)綁定* 4.用WSAAsyncSelect函數(shù)注冊網(wǎng)絡(luò)異步選擇事件消息*/void INIT_MYSOCKET(HWND &hwndDlg)WSAStartup(0x0101, &wsaData);udp_sd=socket(AF_INET, SOCK_DGRAM, 0);bind(udp_sd, (LPSOCKADDR)&Local_PC, sizeof(Local_PC);WSAAsyncSelect(udp_sd, hwndDlg, WM_USER+1, FD_READ);
26、/*發(fā)送消息* 1.用GetDlgItemText函數(shù)從控件IDC_SEND獲取用戶即將發(fā)送的數(shù)據(jù)* 2.用sendto函數(shù)向目的主機(jī)發(fā)送UDP數(shù)據(jù)報*/void MYSOCK_SEND(HWND &hwndDlg)GetDlgItemText(hwndDlg, IDC_SEND, Buffer, sizeof(Buffer);sendto(udp_sd, Buffer, strlen(Buffer), 0, (struct sockaddr *)&Remote_PC, len);/*接收消息* 1.用recv函數(shù)接受數(shù)據(jù),并存儲于Buffer緩沖區(qū)* 2.用SetDlgIte
27、mText函數(shù)設(shè)置控件IDC_RECV,使信息顯示在屏幕上*/void MYSOCK_RECV(HWND &hwndDlg)recv(udp_sd, Buffer, sizeof(Buffer), 0);SetDlgItemText(hwndDlg, IDC_RECV, Buffer);/*設(shè)定本地與遠(yuǎn)程主機(jī)IP*/void MYSOCK_SET_REMOTE(const TCHAR *remote_IP)/功能還未實(shí)現(xiàn)/*獲取本地主機(jī)名* 1.將主機(jī)名保存于成員變量HOSTNAME中* 2.用wsprintf函數(shù)將主機(jī)名傳送到形參中*/void MYSOCK_GET_HOSTNAME
28、(TCHAR *HOST_BUFFER)gethostname(HOSTNAME, sizeof(HOSTNAME);wsprintf(HOST_BUFFER, "%s", HOSTNAME);/*獲取本地通信端口(字符串格式)* 直接用wsprintf函數(shù)轉(zhuǎn)換*/void MYSOCKET_GET_PORTNUM(TCHAR *PORT_BUFFER)wsprintf(PORT_BUFFER, "%d", Local_Port_Num);/*獲取本地通信地址(字符串格式)* 1.用gethostbyname函數(shù)取得相關(guān)信息* 2.用inet_ntoa函
29、數(shù)將網(wǎng)絡(luò)地址轉(zhuǎn)換為點(diǎn)分字符串形式* 3.用wsprintf函數(shù)轉(zhuǎn)換格式并輸出*/void MYSOCKET_GET_LOCALIP(TCHAR *IP_BUFFER)HOSTENT=gethostbyname(HOSTNAME);wsprintf(IP_BUFFER, "%s", inet_ntoa(*(struct in_addr *)HOSTENT->h_addr_list0);/*結(jié)束套接字過程* 1.注銷網(wǎng)絡(luò)異步選擇事件消息。* 2.關(guān)閉套接口* 3.卸載網(wǎng)絡(luò)動態(tài)庫*/void END_MYSOCKET(HWND &hwndDlg)WSAAsyncSe
30、lect(udp_sd, hwndDlg, 0, 0);closesocket(udp_sd);WSACleanup();private:/*WSADATA以與SOCKET變量* 相關(guān)函數(shù):MYSOCKET:INIT_MYSOCKET(HWND &hwndDlg)*/WSADATAwsaData;SOCKET udp_sd;/*1.Local_Port_Num => 本地端口號* Remote_Port_Num => 目的端口號*2.Local_PC => 本地通信結(jié)構(gòu)* Remote_PC => 遠(yuǎn)程通信結(jié)構(gòu)*3.len => "struct
31、sockaddr"類型的長度* 相關(guān)函數(shù):MYSOCKET:MYSOCKET(WORD local_port,WORD remote_port)*/WORD Local_Port_Num, Remote_Port_Num;struct sockaddr_in Local_PC, Remote_PC;int len;/*數(shù)據(jù)接收、發(fā)送緩沖區(qū)* 相關(guān)函數(shù):MYSOCKET:MYSOCK_RECV(HWND &hwndDlg)* MYSOCKET:MYSOCK_SEND(HWND &hwndDlg)*/TCHAR Buffer100;/*保存本地主機(jī)名* 相關(guān)函數(shù):MYSO
32、CKET:MYSOCK_GET_HOSTNAME(TCHAR *HOST_BUFFER)*/TCHAR HOSTNAME10;/* * struct hostent*char FAR * h_name;*char FAR * FAR * h_aliases;*short h_addrtype;*short h_length;*char FAR * FAR * h_addr_list;*;*/struct hostent *HOSTENT;/ 服務(wù)器端源代碼/ SERVER.CPP#include <windows.h>#include <winsock.h>#inclu
33、de ".SERVERresource.h"#include ".COMMON.H"/TCHAR PORT_BUFFER10;TCHAR HOST_BUFFER10;TCHAR IP_BUFFER20;/TCHAR IP_REMOTE_BUFFER20;/BOOL DialogProc(HWND hwndDlg,UINT UMsg,WPARAM wParam,LPARAM IParam);/int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, i
34、nt nShowCmd)DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_SERVER), NULL, (DLGPROC)DialogProc, 0);return 0;/BOOL DialogProc(HWND hwndDlg,UINT UMsg,WPARAM wParam,LPARAM lParam)/*!構(gòu)造靜態(tài)CLIENT對象!* 1.本地::4321* 2.遠(yuǎn)程::6321*/static MYSOCKET SERVER(TEXT(""), 4321, TEXT(""), 6321);switch(UMsg)case WM_INITDIALOG:/*初始化套接字*/SERVER.INIT_MYSOCKET(hwndDlg);/*1.將本地IP地址保存于IP_BUFFER變量*2.將其顯示在IDC_IP控件中*/SERVER.MYSOCKET_GET_LOCALIP(IP_BUFFER);SetDlgItemText(hwndDlg, IDC_IP, IP_BUFFER);/*1
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- EPS、EPP發(fā)泡新材料生產(chǎn)項(xiàng)目可行性研究報告寫作模板-備案審批
- DB21T 4085-2025汽車制造業(yè)溫室氣體排放核算與報告指南
- 復(fù)合涂料企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 木質(zhì)包裝行業(yè)直播電商戰(zhàn)略研究報告
- 雞毛吊飾行業(yè)跨境出海戰(zhàn)略研究報告
- 經(jīng)濟(jì)電視節(jié)目制作服務(wù)行業(yè)跨境出海戰(zhàn)略研究報告
- 家具園區(qū)建設(shè)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 防震機(jī)箱企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報告
- 單杠行業(yè)跨境出海戰(zhàn)略研究報告
- 兒童營養(yǎng)乳品行業(yè)跨境出海戰(zhàn)略研究報告
- 知識產(chǎn)權(quán)合規(guī)管理體系解讀
- 城中村房屋拆除及安置方案
- 護(hù)理不良事件之管路脫出
- 區(qū)域醫(yī)學(xué)檢測中心的建設(shè)與管理V3
- 未成年人權(quán)益保護(hù)培訓(xùn)
- 技能競賽(電工電氣設(shè)備賽項(xiàng))備考試題庫(含答案)
- 2020年全國II卷英語高考真題試題(答案+解析)
- 物理學(xué)家楊振寧課件
- 腦洞大開背后的創(chuàng)新思維學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 語法填空難題練習(xí)8篇(附答案)
- 支持企業(yè)建設(shè)中試平臺實(shí)施方案
評論
0/150
提交評論