局域網(wǎng)通信工具設(shè)計(jì)實(shí)現(xiàn)_第1頁
局域網(wǎng)通信工具設(shè)計(jì)實(shí)現(xiàn)_第2頁
局域網(wǎng)通信工具設(shè)計(jì)實(shí)現(xiàn)_第3頁
局域網(wǎng)通信工具設(shè)計(jì)實(shí)現(xiàn)_第4頁
局域網(wǎng)通信工具設(shè)計(jì)實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一:設(shè)計(jì)任務(wù)近年來,隨著全球信息化進(jìn)程的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,在局域網(wǎng)上運(yùn)行的應(yīng)用越來越多,如知識(shí)庫、網(wǎng)絡(luò)會(huì)議、數(shù)據(jù)庫應(yīng)用和數(shù)據(jù)的同步與備份等,這些應(yīng)用對局域網(wǎng)的信息吞吐、處理能力的要求也越來越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設(shè)計(jì)之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負(fù),容易發(fā)生信息阻塞,此時(shí),局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)發(fā)展的瓶頸。 為了解決上述矛盾,人們提出了許多方法。提

2、升網(wǎng)絡(luò)帶寬及增加服務(wù)器的吞吐能力是解決此矛盾的一種方法。然而,從企業(yè)運(yùn)行的成本方面考慮,無論是單純地提升網(wǎng)絡(luò)帶寬或增加服務(wù)器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對舊有局域網(wǎng)的大規(guī)模硬件改造反而會(huì)增加企業(yè)的負(fù)擔(dān)。本文討論一種基于Socket的局域網(wǎng)通信工具的設(shè)計(jì)與實(shí)現(xiàn)方法?;赟ocket的局域網(wǎng)通信軟件可以為局域網(wǎng)提供一種良好,安全,快速的通信機(jī)制。它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決內(nèi)部局域網(wǎng)的各種通信需求。 基于Socket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實(shí)例之一,它很好地詮釋了Socket通信的原理,并且在局域網(wǎng)內(nèi)部通信、教學(xué)、

3、討論等應(yīng)用中都具有一定的實(shí)用價(jià)值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)?;赟ocket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應(yīng)用前景。本程序要實(shí)現(xiàn)設(shè)計(jì)任務(wù)(1)程序啟動(dòng)之后就能看到當(dāng)前哪些機(jī)器在線,哪些可以與之進(jìn)行對等通信。(2)一旦有某個(gè)網(wǎng)內(nèi)的機(jī)器上線了,要有即時(shí)通知,并能及時(shí)更新用戶界面中的用戶列表。(3)當(dāng)雙擊某個(gè)列表項(xiàng)的時(shí)候,要彈出聊天對話框,可以在其中編輯要發(fā)送的聊天信息,并進(jìn)行發(fā)送。(4)聊天界面要人性化,下面是發(fā)送框,上面有已有聊天

4、記錄,并借助滾動(dòng)條看到當(dāng)次所有的聊天記錄。(5)當(dāng)有人向我發(fā)送信息的時(shí)候,要彈出一個(gè)對話框,顯示用戶接收到的信息,并且知道是誰人所發(fā),并且在當(dāng)前對話框內(nèi)進(jìn)行信息的回復(fù)。二:設(shè)計(jì)方案既然選定了WINDOWS平臺(tái),而又要開發(fā)網(wǎng)絡(luò)通信程序,所以可以選擇WINDOWS的SOCKETS編程接口,Windows Sockets是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口?,F(xiàn)在的Winsock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),你可以使用Winsock來調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Winsockets無疑是我們進(jìn)行網(wǎng)絡(luò)編程的利器。通常的通信工具,都采用客戶機(jī)/服務(wù)器(C/S)體

5、系結(jié)構(gòu),C/S結(jié)構(gòu)是這樣的一種結(jié)構(gòu):它包括一個(gè)客戶機(jī)(或前端),一個(gè)服務(wù)器(或稱后端),客戶機(jī)的作用是訪問和處理遠(yuǎn)程服務(wù)器上的數(shù)據(jù),服務(wù)器的作用是接收和處理客戶機(jī)的數(shù)據(jù)請求。有時(shí),可能有多個(gè)客戶向同一個(gè)服務(wù)器同時(shí)請求服務(wù),這就需要服務(wù)器決定怎樣處理這些請求。Client/Server結(jié)構(gòu)是當(dāng)前數(shù)據(jù)庫應(yīng)用程序中極為流行的一種方式。尤其是網(wǎng)絡(luò)技術(shù)的發(fā)展,使得當(dāng)前很多系統(tǒng)都采用這種方式進(jìn)行構(gòu)造,其最大的優(yōu)點(diǎn)是將計(jì)算機(jī)工作任務(wù)分別由客戶端和服務(wù)器端來共同完成,這樣有利于充分合理的利用系統(tǒng)資源。另外它的服務(wù)器端還可以將信息集中起來,任何客戶機(jī)都可以通過訪問服務(wù)器而獲得所需的信息。Client/Serve

6、r模型最終可歸結(jié)為一種“請求/應(yīng)答”關(guān)系。一個(gè)請求總是首先被客戶發(fā)出,然后服務(wù)器總是被動(dòng)地接收請求,返回客戶需要的結(jié)果。在客戶發(fā)出一個(gè)請求之前,服務(wù)進(jìn)程一直處于休眠狀態(tài)。一個(gè)客戶提出請求后,服務(wù)進(jìn)程被“喚醒”并且為客戶提供服務(wù),對客戶的請求做出所需要的應(yīng)答。但是具體到現(xiàn)在這個(gè)項(xiàng)目,如果要做成C/S結(jié)構(gòu),需要在局域網(wǎng)內(nèi)架設(shè)一個(gè)服務(wù)器,而在一個(gè)局域網(wǎng)中,如果網(wǎng)絡(luò)結(jié)構(gòu)不是集中式的而是分散式的,那么可能沒有一臺(tái)機(jī)器來充當(dāng)服務(wù)器這個(gè)角色,比如我們的校園宿舍網(wǎng)絡(luò)就是如此。所以說,我的設(shè)計(jì)是每個(gè)程序自己既充當(dāng)客戶機(jī)又充當(dāng)服務(wù)器,自己維護(hù)網(wǎng)絡(luò)上的客戶機(jī)列表,每兩個(gè)客戶端要進(jìn)行連結(jié)時(shí)都直接連通而不用通過服務(wù)器來

7、進(jìn)行信息的中轉(zhuǎn),這樣雖然損失了一些性能各帶寬資源,但是對通信量不是很大的局域網(wǎng),這點(diǎn)損失可以由換得的專門架設(shè)服務(wù)器的優(yōu)點(diǎn)來彌補(bǔ)。通信數(shù)據(jù)的一個(gè)流向示意圖不是真正的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),也就是說其中的服務(wù)器可能只是裝了服務(wù)器軟件的一臺(tái)普通工作站。在底層的數(shù)據(jù)流向中,也就是網(wǎng)絡(luò)的物理連結(jié),并非我們這個(gè)軟件所能決定的,我們的所做都是在一個(gè)透明的數(shù)據(jù)通信層之上的。三:系統(tǒng)的原理框圖(程序流程圖)因?yàn)樵诒鞠到y(tǒng)中,每一個(gè)客戶端系統(tǒng)都是相同的也就是具體到通信雙方而言其實(shí)是對稱的,所以只需要考慮一個(gè)系統(tǒng)就可以了。根據(jù)以上的系統(tǒng)需求分析,以及體系結(jié)構(gòu)設(shè)計(jì),可以對系統(tǒng)進(jìn)行如下的功能模塊劃分如圖所示:其中主線程模塊完成對網(wǎng)

8、絡(luò)的初始化,然后啟動(dòng)兩個(gè)子線程:服務(wù)端監(jiān)聽線程以及網(wǎng)絡(luò)掃描模塊線程,然后由網(wǎng)絡(luò)掃描模塊得到當(dāng)前的網(wǎng)絡(luò)用戶分布情況,并填充相關(guān)的數(shù)據(jù)結(jié)構(gòu),然后生成用戶列表界面顯示給用戶。通信模塊又包括兩個(gè)子模塊:數(shù)據(jù)接收模塊和數(shù)據(jù)發(fā)送模塊,這兩個(gè)模塊都由系統(tǒng)定義的網(wǎng)絡(luò)事件來觸發(fā)。輸入/輸出模塊用來響應(yīng)用戶雙擊用戶列表的某一項(xiàng)要準(zhǔn)備發(fā)送信息時(shí)的消息,以及當(dāng)系統(tǒng)接收到某個(gè)網(wǎng)絡(luò)用戶發(fā)送來的消息,要將其顯示給用戶的時(shí)候。網(wǎng)絡(luò)掃描模塊是由主線程模塊啟動(dòng),進(jìn)行網(wǎng)絡(luò)掃描,確定哪些用戶當(dāng)前處于可到達(dá)狀態(tài),以及哪些可到達(dá)狀態(tài)的用戶安裝有相應(yīng)的通信軟件,并啟動(dòng)之可以與之進(jìn)行通信。我覺得這樣的模塊劃分設(shè)計(jì)符合強(qiáng)內(nèi)聚,弱耦合的原則,并

9、且易于實(shí)現(xiàn)。由于系統(tǒng)首先要維護(hù)一個(gè)網(wǎng)絡(luò)用戶列表,所以要設(shè)計(jì)一個(gè)數(shù)組。這個(gè)數(shù)組具體可為255行2列數(shù)組,每一行代表局域網(wǎng)中的一臺(tái)主機(jī),然后第一列代表其是否處于可到達(dá)狀態(tài),第二列代表其是否處于可通信狀態(tài)。因?yàn)槌绦騽倖?dòng)時(shí)的網(wǎng)絡(luò)掃描階段耗時(shí)較久,所以應(yīng)當(dāng)在程序啟動(dòng)后以一個(gè)人性化的界面提示用戶不要以為程序無法響應(yīng)了,暫時(shí)的緩慢是正常反應(yīng)。因此我決定設(shè)計(jì)一個(gè)啟動(dòng)畫面,這個(gè)啟動(dòng)畫面可由VC+6.0提供的Splash screen組件來實(shí)現(xiàn),它將向工程中插入一個(gè)類CSplashWnd.我只需要在合適的地方調(diào)用該類,并進(jìn)行具體的定制即可。其它的相關(guān)類皆由MFC的應(yīng)用程序向?qū)ё詣?dòng)生成,我只需要在其中進(jìn)行具體的功

10、能代碼添加即可。四:程序設(shè)計(jì)當(dāng)掃描完畢時(shí)后,在主顯示界面中就會(huì)顯示出局域網(wǎng)內(nèi)所有當(dāng)前在線的用戶列表,并且顯示哪些主機(jī)可以進(jìn)行聊天。并且由于顯示是即時(shí)的,也就是掃描完一臺(tái)馬上顯示出來,并且用戶可以看到當(dāng)前正在掃描哪一臺(tái)機(jī)器,這樣的設(shè)計(jì)也是比較合理的,如下圖45所示。本程序還有一個(gè)附加非常方便的功能就是上線提示,當(dāng)局域網(wǎng)內(nèi)某用戶打開了對應(yīng)的程序,那么就會(huì)彈出相應(yīng)的提示,并即時(shí)更新用戶列表。程序主顯示界面 當(dāng)雙擊列表中的某一項(xiàng)時(shí),會(huì)彈出聊天對話框,來實(shí)現(xiàn)消息發(fā)送功能,或者當(dāng)程序接收到某個(gè)網(wǎng)內(nèi)用戶發(fā)來的信息時(shí),也要彈出對話框向用戶進(jìn)行顯示,實(shí)際效果如下圖所示:程序聊天界面服務(wù)端線程的具體作就是首先創(chuàng)建

11、一個(gè)SOCKETS,然后將該套接字綁定到本地主機(jī)的某一個(gè)固定的端口上,在本程序中選擇了41786端口。接著將該套接字設(shè)置為異步非阻塞模式,并為它注冊各種網(wǎng)絡(luò)異步事件,最后開始監(jiān)聽。具體代碼如下:void CNetTestWithAPIDlg:SevThreadFunc(LPVOID lpParam)CNetTestWithAPIDlg* TempObject=(ServerParam*)lpParam->tempdlg; SOCKET tempServer=(ServerParam*)lpParam)->ServerSocket; sockaddr_in localaddr;/*/

12、Bind to a local port localaddr.sin_family=AF_INET; localaddr.sin_port=htons(41786); if(bind(tempServer,(struct sockaddr*)&localaddr,sizeof(sockaddr)=SOCKET_ERROR) AfxMessageBox("綁定地址失敗!"); closesocket(tempServer); WSACleanup(); return ; /將SeverSock設(shè)置為異步非阻塞模式,并為它注冊各種網(wǎng)絡(luò)異步事件 if(WSAAsyncSe

13、lect(tempServer, TempObject->m_hWnd,NETWORK_EVENT,FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) = SOCKET_ERROR) AfxMessageBox("注冊網(wǎng)絡(luò)異步事件失敗!"); WSACleanup(); return; listen(tempServer, 5);/設(shè)置偵聽模式然后啟動(dòng)掃描線程:SearchDisplay(); /Serach Lan and display the result to the user!上面調(diào)用了SearchDisplay()來啟動(dòng)網(wǎng)

14、絡(luò)掃描線程,該函數(shù)的實(shí)現(xiàn)如下:void CNetTestWithAPIDlg:SearchDisplay()hScanThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ScanThreadFunc,this,0,&ScanThreadID);CloseHandle(hScanThread);具體的掃描過程在網(wǎng)絡(luò)掃描模塊詳細(xì)設(shè)計(jì)中闡述。網(wǎng)絡(luò)掃描模塊詳細(xì)設(shè)計(jì) 網(wǎng)絡(luò)掃描基于ICMP協(xié)議,所以需要先定義兩個(gè)數(shù)據(jù)結(jié)構(gòu):typedef struct unsigned char Ttl; / Time To Live unsigned char T

15、os; / Type Of Service unsigned char Flags; / IP header flags unsigned char OptionsSize; /Size in bytes of options data unsigned char *OptionsData; / Pointer to options data IP_OPTION_INFORMATION, * PIP_OPTION_INFORMATION;typedef struct DWORD Address; / Replying address unsigned long Status; / Reply

16、status unsigned long RoundTripTime; / RTT in milliseconds unsigned short DataSize; / Echo data size unsigned short Reserved; / Reserved for system use void *Data; / Pointer to the echo data IP_OPTION_INFORMATION Options; / Reply options IP_ECHO_REPLY, * PIP_ECHO_REPLY;然后在網(wǎng)絡(luò)掃描線程的線程函數(shù)中加入以下代碼,完成掃描網(wǎng)絡(luò)并顯示

17、用戶列表的功能:char HostName255;PHOSTENT HostInfo;gethostname(HostName,sizeof(HostName);/get localhost infoHostInfo=gethostbyname(HostName);LPCSTRip=inet_ntoa(*(structin_addr *)*HostInfo->h_addr_list);in_addr* pip=(struct in_addr *)*HostInfo->h_addr_list;CString temp=ip;int n=0;int a=temp.Find('.

18、');a=temp.Find('.',a+1);a=temp.Find('.',a+1);a=temp.GetLength()-a;CString temp2=temp.Right(a-1);n=atoi(temp2);HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");if (hIcmp = 0) AfxMessageBox("Unable to locate ICMP.DLL!"); return ;/ 裝載ICMP.DLL連接庫typedef HANDLE (WINAPI* p

19、fnHV)(VOID);/定義函數(shù)三個(gè)指針類型typedef BOOL (WINAPI* pfnBH)(HANDLE);typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD, PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); / evil, no?pfnHV pIcmpCreateFile;/定義三個(gè)指針函數(shù) pfnBH pIcmpCloseHandle; pfnDHDPWPipPDD pIcmpSendEcho; pIcmpCreateFile = (pfnHV)Get

20、ProcAddress(hIcmp,"IcmpCreateFile"); pIcmpCloseHandle=(pfnBH)GetProcAddress(hIcmp,"IcmpCloseHandle"); pIcmpSendEcho=(pfnDHDPWPipPDD)GetProcAddress(hIcmp,"IcmpSendEcho"); /從ICMP.DLL中得到函數(shù)入口地址 if(pIcmpCreateFile = 0)|(pIcmpCloseHandle = 0)|(pIcmpSendEcho = 0) AfxMessageBox

21、("Failed to get proc addr for function."); return ; HANDLE hIP = pIcmpCreateFile();/ 打開ping服務(wù) if (hIP = INVALID_HANDLE_VALUE) AfxMessageBox("Unable to open ping service."); return ; char acPingBuffer64;/ 構(gòu)造ping數(shù)據(jù)包 memset(acPingBuffer, 'xAA', sizeof(acPingBuffer); PIP_ECHO

22、_REPLY pIpe=(PIP_ECHO_REPLY)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,sizeof(IP_ECHO_REPLY)+sizeof(acPingBuffer); if(pIpe = 0) AfxMessageBox("Failed to allocate global ping packet buffer."); return ;pIpe->Data = acPingBuffer;pIpe->DataSize = sizeof(acPingBuffer); /構(gòu)造探測41786端口的連接SocketSOCK

23、ET DetectSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);sockaddr_in remoteaddr;remoteaddr.sin_family=AF_INET; remoteaddr.sin_port=htons(41786);int n_item=0;CNetTestWithAPIDlg* TempObject=(CNetTestWithAPIDlg*)lpParam;CString ClientHostName;/ 發(fā)送ping數(shù)據(jù)包for(int i=0,row_num=0;i<255;i+)/do ping here if(i

24、=n) continue;char status100=0;TempObject->GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(status); DWORD dwStatus = pIcmpSendEcho(hIP, *(DWORD*)pip), acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, sizeof(IP_ECHO_REPLY)+sizeof(acPingBuffer),100);if (dwStatus!=0) /the host is awaken ! TempObject-&

25、gt;hostesi0=1; hostent * host=gethostbyaddr(const char*)(pip),4,AF_INET); if(host!=NULL) ClientHostName=host->h_name; CString temp; temp=inet_ntoa(*pip);n_item=TempObject->m_pcList.InsertItem(row_num,"row",NULL); TempObject->m_pcList.SetItemText(n_item,0,temp); TempObject->m_pc

26、List.SetItemText(n_item,1,ClientHostNme); TempObject->m_pcList.SetItemText(n_item,2,"已開機(jī)"); remoteaddr.sin_addr=*pip; int result=connect(DetectSock,(struct sockaddr *)&remoteaddr,sizeof(sockaddr); if(result=0) TempObject->hostesi1=1; TempObject->m_pcList.SetItemText(n_item,3,&

27、quot;可聊天"); else TempObject->hostesi1=0; TempObject->m_pcList.SetItemText(n_item,3,"不可聊天"); TempObject->m_pcList.SetItemText(n_item,4,"傳文件"); row_num+;char finishscan40="Scan finished!"/掃描完畢。TempObject->GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(fi

28、nishscan);closesocket(DetectSock);/Close the detect socket!GlobalFree(pIpe);/ 關(guān)閉,回收資源信息發(fā)送模塊詳細(xì)設(shè)計(jì)信息發(fā)送事件是由用戶在雙擊位于ListCtrl控件中的某一個(gè)用戶列表的時(shí)候發(fā)生的,所以對ListCtrl的列表項(xiàng)雙擊事件添加事件響應(yīng)函數(shù)如下:void CNetTestWithAPIDlg:OnDblclkPclist(NMHDR* pNMHDR, LRESULT* pResult) if(dlg.m_hWnd!=0) return; int nItem=-1; nItem=m_pcList.GetNext

29、Item(nItem,LVNI_SELECTED); if(nItem=-1) return; CString strSelectedItem; strSelectedItem=m_pcList.GetItemText(nItem,0); CString temp=strSelectedItem; int n=0; int a=temp.Find('.'); a=temp.Find('.',a+1); a=temp.Find('.',a+1); a=temp.GetLength()-a; CString temp2=temp.Right(a-1)

30、; n=atoi(temp2); if(hostesn1=1)/If the host cliked can be talked dlg.Create(IDD_SEND_DIALOG,this); dlg.ShowWindow(SW_SHOW); else AfxMessageBox("There's no client in goal host!"); *pResult = 0;信息接收模塊詳細(xì)設(shè)計(jì)信息接收由前面注冊的網(wǎng)絡(luò)事件被系統(tǒng)所觸發(fā),當(dāng)void CNetTestWithAPIDlg:OnAccept(SOCKET CurSock) SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR);/為新的socket注冊異步事件CurrentConn=accept(ServerSocket,(sockaddr*)&addrClient,&len); dlg.ClientHost=addrClient.sin_addr;if(hostesn1=1)hostesn1=1; CString ClientIp=inet_ntoa(addrClient.sin_addr); ClientI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論