網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)_第1頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)_第2頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)_第3頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)_第4頁(yè)
網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、網(wǎng)絡(luò)編程學(xué)習(xí)小結(jié)幾種網(wǎng)絡(luò)編程方式:ISAPI、CGI、WinInet、Winsock它們之間的區(qū)別:1) ISAPI主要是開(kāi)發(fā)基于瀏覽器客戶(hù)端與服務(wù)器端程序。效率比CGI方式高,而且也擴(kuò)展了CGI沒(méi)有的一些功能。(基于TCP/IP模型中的應(yīng)用層)2) CGI主要是開(kāi)發(fā)基于瀏覽器客戶(hù)端與服務(wù)器端程序。(基于TCP/IP模型中的應(yīng)用層)3) WinInet主要是開(kāi)發(fā)客戶(hù)端程序。(基于TCP/IP模型中的應(yīng)用層)4) Winsock主要是基于socket來(lái)開(kāi)發(fā)客戶(hù)端與服務(wù)器端程序。(基于TCP/IP模型中的各層)要想開(kāi)發(fā)低層協(xié)議的程序的話(huà)就要了解協(xié)議的報(bào)文格式。 網(wǎng)絡(luò)基礎(chǔ)知識(shí):網(wǎng)絡(luò)硬件 數(shù)據(jù)通訊原理

2、 (詳見(jiàn)/source/1196517)OSI七層網(wǎng)絡(luò)模型與TCP/IP四層網(wǎng)絡(luò)模型 (詳見(jiàn)/topic/thread-396621.html)網(wǎng)絡(luò)原理和協(xié)議 (詳見(jiàn)/)Winsock 網(wǎng)絡(luò)編程:建議,把機(jī)械工業(yè)出版社出的Windows網(wǎng)絡(luò)編程技術(shù)看N遍后,再利用MFC或者SDK編寫(xiě)一些小的通信例程,然后編寫(xiě)較大規(guī)模的網(wǎng)絡(luò)程序,最后你就明白了網(wǎng)絡(luò)編程了! Windows網(wǎng)絡(luò)編程技術(shù)專(zhuān)門(mén)討論Windows網(wǎng)絡(luò)編程技術(shù),覆蓋Windows 95/98/NT 4/2000/CE平臺(tái)。內(nèi)容包括NetBIOS和Windows重定向器方法、Winsock方法、客戶(hù)端遠(yuǎn)程訪(fǎng)問(wèn)服務(wù)器方法。本書(shū)論述深入淺出、用

3、大量實(shí)例詳解了微軟網(wǎng)絡(luò)API函數(shù)的應(yīng)用。TCP/IP詳解,卷1:協(xié)議是一本完整而詳細(xì)的TCP/IP協(xié)議指南。描述了屬于每一層的各個(gè)協(xié)議以及它們?nèi)绾卧诓煌僮飨到y(tǒng)中運(yùn)行。網(wǎng)絡(luò)通信編程實(shí)用案例精選是一本介紹利用vlsuaIC+進(jìn)行網(wǎng)絡(luò)通信程序開(kāi)發(fā)的書(shū)籍。書(shū)中精選了大量網(wǎng)絡(luò)實(shí)例,涵蓋了本地汁算機(jī)網(wǎng)絡(luò)編程、局域網(wǎng)網(wǎng)絡(luò)通信編程、IE編程、網(wǎng)絡(luò)通信協(xié)議編程、串口通信編程、代理服務(wù)器編程和高級(jí)網(wǎng)絡(luò)通信編程ACE:ACE自適配通信環(huán)境(ADAPTIVE Communication E/ace_tao/index.html建議在、/網(wǎng)站上找些老外寫(xiě)的網(wǎng)絡(luò)代碼研究研究,最好能參加實(shí)際的網(wǎng)絡(luò)項(xiàng)目,這樣能見(jiàn)識(shí)更多成熟

4、的網(wǎng)絡(luò)類(lèi)庫(kù)。最好能參加實(shí)際的網(wǎng)絡(luò)項(xiàng)目,這樣能見(jiàn)識(shí)更多成熟的網(wǎng)絡(luò)類(lèi)庫(kù)。 開(kāi)源網(wǎng)絡(luò)封裝庫(kù) :ACE,ICE,asio,cppsocket,netclass,poco,SimpleSocket,socketman,Sockets 開(kāi)源下載工具 fdm, eMulePlus,eMule 開(kāi)源FTP FileZilla 開(kāi)源服務(wù)器 Apache 網(wǎng)游服務(wù)器開(kāi)源框架 GNE,HawkNL,RakNet,SDL_net 網(wǎng)絡(luò)協(xié)議分析軟件:Sniffer工具WPE -抓包Ethereal -協(xié)議分析 SockMon5 -抓包及錯(cuò)誤分析 Windows網(wǎng)絡(luò)編程細(xì)節(jié)問(wèn)題: 1. 如果在已經(jīng)處于 ESTABLISH

5、ED狀態(tài)下的socket(一般由端口號(hào)和標(biāo)志符區(qū)分)調(diào)用closesocket(一般不會(huì)立即關(guān)閉而經(jīng)歷TIME_WAIT的過(guò)程)后想繼續(xù)重用該socket: BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL); 2. 如果要已經(jīng)處于連接狀態(tài)的soket在調(diào)用closesocket后強(qiáng)制關(guān)閉,不經(jīng)歷TIME_WAIT的過(guò)程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(c

6、onst char*)&bDontLinger,sizeof(BOOL); 3.在send(),recv()過(guò)程中有時(shí)由于網(wǎng)絡(luò)狀況等原因,發(fā)收不能預(yù)期進(jìn)行,而設(shè)置收發(fā)時(shí)限:int nNetTimeout=1000;/1秒/發(fā)送時(shí)限setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int);/接收時(shí)限setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int); 4.在send()的時(shí)候,返回的是實(shí)際發(fā)送出去的字節(jié)(同步)或

7、發(fā)送到socket緩沖區(qū)的字節(jié)(異步);系統(tǒng)默認(rèn)的狀態(tài)發(fā)送和接收一次為8688字節(jié)(約為8.5K);在實(shí)際的過(guò)程中發(fā)送數(shù)據(jù)和接收數(shù)據(jù)量比較大,可以設(shè)置socket緩沖區(qū),而避免了send(),recv()不斷的循環(huán)收發(fā):/ 接收緩沖區(qū)int nRecvBuf=32*1024;/設(shè)置為32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int);/發(fā)送緩沖區(qū)int nSendBuf=32*1024;/設(shè)置為32Ksetsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSen

8、dBuf,sizeof(int);5. 如果在發(fā)送數(shù)據(jù)的時(shí),希望不經(jīng)歷由系統(tǒng)緩沖區(qū)到socket緩沖區(qū)的拷貝而影響程序的性能:int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero);6.同上在recv()完成上述功能(默認(rèn)情況是將socket緩沖區(qū)的內(nèi)容拷貝到系統(tǒng)緩沖區(qū)):int nZero=0;setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int);7.一般在發(fā)送UDP數(shù)據(jù)報(bào)的時(shí)候,希望該socket發(fā)送的數(shù)據(jù)具有

9、廣播特性:BOOL bBroadcast=TRUE;setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL);8.在client連接服務(wù)器過(guò)程中,如果處于非阻塞模式下的socket在connect()的過(guò)程中可以設(shè)置connect()延時(shí),直到accpet()被呼叫(本函數(shù)設(shè)置只有在非阻塞的過(guò)程中有顯著的作用,在阻塞的函數(shù)調(diào)用中作用不大)BOOL bConditionalAccept=TRUE;setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const ch

10、ar*)&bConditionalAccept,sizeof(BOOL);9.如果在發(fā)送數(shù)據(jù)的過(guò)程中(send()沒(méi)有完成,還有數(shù)據(jù)沒(méi)發(fā)送)而調(diào)用了closesocket(),以前我們一般采取的措施是從容關(guān)閉shutdown(s,SD_BOTH),但是數(shù)據(jù)是肯定丟失了,如何設(shè)置讓程序滿(mǎn)足具體應(yīng)用的要求(即讓沒(méi)發(fā)完的數(shù)據(jù)發(fā)送出去后在關(guān)閉socket)?struct linger u_short l_onoff;u_short l_linger;linger m_sLinger;m_sLinger.l_onoff=1;/(在closesocket()調(diào)用,但是還有數(shù)據(jù)沒(méi)發(fā)送完畢的時(shí)候容許逗留)/

11、如果m_sLinger.l_onoff=0;則功能和B)作用相同;m_sLinger.l_linger=5;/(容許逗留的時(shí)間為5秒)setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger);注意點(diǎn): A.在設(shè)置了逗留延時(shí),用于一個(gè)非阻塞的socket是作用不大的,最好不用;B.如果想要程序不經(jīng)歷SO_LINGER需要設(shè)置SO_DONTLINGER,或者設(shè)置l_onoff=0;10.一個(gè)用的比較少的是在SDI或者是Dialog的程序中,可以記錄socket的調(diào)試信息:BOOL bDebug=TRUE;set

12、sockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL);11.往往通過(guò)setsockopt()設(shè)置了緩沖區(qū)大小,但還不能滿(mǎn)足數(shù)據(jù)的傳輸需求,一般習(xí)慣是自己寫(xiě)個(gè)處理網(wǎng)絡(luò)緩沖的類(lèi),動(dòng)態(tài)分配內(nèi)存。 12、#include ,#include沖突問(wèn)題解決方法:在StdAfx.h 頭文件中添加winsock2.h,Afxsock.h先#include 再#include 13、獲取數(shù)據(jù)包,一般來(lái)說(shuō)想獲取數(shù)據(jù)包可以使用IP_HDRINCL選項(xiàng),但是在Windows 2000/XP中setsockopt()中IP_HDRINCL是個(gè)不合

13、法的選項(xiàng),但是可以使用 WSAIoctl() 函數(shù)調(diào)用SIO_RCVALL捕獲IP數(shù)據(jù)包。簡(jiǎn)單步驟如下:1)、Create a raw socket. 2)、Bind the socket to the local IP over which the traffic is to be sniffed. 3)、WSAIoctl() the socket with SIO_RCVALL to give it sniffing powers. 4)、Put the socket in an infinite loop of recvfrom. 5)、n joy! the Buffer from re

14、cvfrom. 14、IP、TCP、UDP、ICMP數(shù)據(jù)包格式/*The IP header */typedef struct tagIPHEADER unsigned char version:4; unsigned char header_len:4; unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sour

15、ceIP; unsigned int destIP;IPHEADER;struct TCPPacketHead WORD SourPort; WORD DestPort; DWORD SeqNo; DWORD AckNo; BYTE HLen; BYTE Flag; WORD WndSize; WORD ChkSum; WORD UrgPtr;struct ICMPPacketHead BYTE Type; BYTE Code; WORD ChkSum;struct UDPPacketHead WORD SourPort; WORD DestPort; WORD Len; WORD ChkSu

16、m; 15、幾種winsock I/O模型比較:select模型核心就是select函數(shù),它可用于判斷套接字上是否存在數(shù)據(jù),或者能否向一個(gè)套接字寫(xiě)入數(shù)據(jù)。這個(gè)函數(shù)可以有效地防止應(yīng)用程序在套接字處于阻塞模式中時(shí),send或recv進(jìn)入阻塞狀態(tài);同時(shí)也可以防止產(chǎn)生大量的WSAEWOULDBLOCK錯(cuò)誤select的優(yōu)勢(shì)是能夠從單個(gè)線(xiàn)程的多個(gè)套接字上進(jìn)行多重連接及I/O。WSAAsyncSelect 模型是以消息機(jī)制為基礎(chǔ),能夠處理一定的客戶(hù)連接量,但是擴(kuò)展性也不是很好。因?yàn)橄⒈煤芸炀蜁?huì)阻塞,降低了消息處理的速度。WSAAsyncSelect和WSAEventSelect模型提供了讀寫(xiě)數(shù)據(jù)能力的異

17、步通知,但他們不提供異步數(shù)據(jù)傳送,而重疊及完成端口提供異步數(shù)據(jù)的傳送。WSAEventSelect 模型以時(shí)間為基礎(chǔ)的網(wǎng)絡(luò)事件通知,但是與WSAAsyncSelect不同的是,它主要是由事件對(duì)象句柄完成的,而不是通過(guò)窗口。但是一個(gè)線(xiàn)程只能等待64個(gè)事件(需要開(kāi)辟多個(gè)線(xiàn)程解決),伸縮性不如完成端口。重疊模型可以使程序能達(dá)到更佳的系統(tǒng)性能?;驹O(shè)計(jì)原理就是讓?xiě)?yīng)用程序使用重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個(gè)或多個(gè)I/O請(qǐng)求。針對(duì)這些提交的請(qǐng)求,在他們完成之后,應(yīng)用程序可為他們提供服務(wù)。它又分為兩種實(shí)現(xiàn)方法:事件通知和完成例程。重疊I/O模型事件通知依賴(lài)于等待事件通知的線(xiàn)程數(shù)(WSAWaitForMultip

18、leEvents調(diào)用的每個(gè)線(xiàn)程,該I/O模型一次最多都只能支持6 4個(gè)套接字。),處理客戶(hù)通信時(shí),大量線(xiàn)程上下文的切換是它們共同的制約因素。完成端口提供了最好的伸縮性,往往可以使系統(tǒng)達(dá)到最好的性能,是處理成千上萬(wàn)的套接字的首選。從本質(zhì)上說(shuō),完成端口模型要求創(chuàng)建一個(gè)windows完成端口對(duì)象,該對(duì)象通過(guò)指定數(shù)量的線(xiàn)程,對(duì)重疊I/O請(qǐng)求進(jìn)行管理,以便為已經(jīng)完成的重疊I/O請(qǐng)求提供服務(wù)。但是完成端口只是支持NT系統(tǒng)、WIN2000系統(tǒng)。重疊模型和完成端口模型的應(yīng)用程序通知緩沖區(qū)收發(fā)系統(tǒng)直接使用數(shù)據(jù),也就是說(shuō),如果應(yīng)用程序投遞了一個(gè)10KB大小的緩沖區(qū)來(lái)接收數(shù)據(jù),且數(shù)據(jù)已經(jīng)到達(dá)套接字,則該數(shù)據(jù)將直接被

19、拷貝到投遞的緩沖區(qū)。 而select模型、WSAAsyncSelect 模型、WSAEventSelect 模型,數(shù)據(jù)到達(dá)并拷貝到單套接字接收緩沖區(qū)中,此時(shí)應(yīng)用程序會(huì)被告知可以讀入的容量。當(dāng)應(yīng)用程序調(diào)用接收函數(shù)之后,數(shù)據(jù)才從單套接字緩沖區(qū)拷貝到應(yīng)用程序的緩沖區(qū),差別就體現(xiàn)出來(lái)了。 16、服務(wù)器與客戶(hù)端IO模型選擇對(duì)于如何挑選最適合自己應(yīng)用程序的I/O模型已經(jīng)很明晰了。同開(kāi)發(fā)一個(gè)簡(jiǎn)單的運(yùn)行多線(xiàn)程的鎖定模式應(yīng)用相比,其他每種I/O模型都需要更為復(fù)雜的編程工作。因此,針對(duì)客戶(hù)機(jī)和服務(wù)器應(yīng)用開(kāi)發(fā)模型的選擇,有以下原則。1). 客戶(hù)端若打算開(kāi)發(fā)一個(gè)客戶(hù)機(jī)應(yīng)用,令其同時(shí)管理一個(gè)或多個(gè)套接字,那么建議采用重

20、疊I/O或WSAEventSelect模型,以便在一定程度上提升性能。然而,假如開(kāi)發(fā)的是一個(gè)以Windows為基礎(chǔ)的應(yīng)用程序,要進(jìn)行窗口消息的管理,那么WSAAsyncSelect模型恐怕是一種最好的選擇,因?yàn)閃SAAsyncSelect本身便是從Windows消息模型借鑒來(lái)的。采用這種模型,程序需具備消息處理功能。2). 服務(wù)器端若開(kāi)發(fā)的是一個(gè)服務(wù)器應(yīng)用,要在一個(gè)給定的時(shí)間,同時(shí)控制多個(gè)套接字,建議采用重疊I/O模型,這同樣是從性能角度考慮的。但是,如果服務(wù)器在任何給定的時(shí)間,都會(huì)為大量I/O請(qǐng)求提供服務(wù),便應(yīng)考慮使用I/O完成端口模型,從而獲得更佳的性能。 17、shutdown、clos

21、esocket區(qū)別shutdown 從容關(guān)閉,為了保證通信雙方都能夠收到應(yīng)用程序發(fā)出的所有數(shù)據(jù),一個(gè)合格的應(yīng)用程序的做法是通知接受雙發(fā)都不在發(fā)送數(shù)據(jù)!這就是所謂的“正常關(guān)閉”套接字的方法,而這個(gè)方法就是由shutdown函數(shù),傳遞給它的參數(shù)有SD_RECEIVE,SD_SEND,SD_BOTH三種,如果是SD_RECEIVE就表示不允許再對(duì)此套接字調(diào)用接受函數(shù)。這對(duì)于協(xié)議層沒(méi)有影響,另外對(duì)于tcp套接字來(lái)說(shuō),無(wú)論數(shù)據(jù)是在等候接受還是即將抵達(dá),都要重置連接(注意對(duì)于udp協(xié)議來(lái)說(shuō),仍然接受并排列傳入的數(shù)據(jù),因此udp套接字而言shutdown毫無(wú)意義)。如果選擇SE_SEND,則表示不允許再調(diào)用

22、發(fā)送函數(shù)。對(duì)于tcp套接字來(lái)說(shuō),這意味著會(huì)在所有數(shù)據(jù)發(fā)送出并得到接受端確認(rèn)后產(chǎn)生一個(gè)FIN包。如果指定SD_BOTH,答案不言而喻。 closesocket 正式關(guān)閉,關(guān)閉連接,釋放所有相關(guān)的資源。因?yàn)闊o(wú)連接協(xié)議沒(méi)有連接,所以不會(huì)有正式關(guān)閉和從容關(guān)閉,直接調(diào)用closesocket函數(shù)。 18、TCP鏈接三次握手、終止鏈接四次握手 19、getpeername 、getsocknamegetpeername 函數(shù)用于獲得通信方的套接字地址信息,該信息上關(guān)于已建立連接的那個(gè)套接字的。getsockname 函數(shù)是getpeername的對(duì)應(yīng)函數(shù)。它返回的是指定套接字的本地接口的地址信息。 20、

23、MFC下CSocket編程注意事項(xiàng)1)、在使用MFC編寫(xiě)socket程序時(shí),必須要包含都文件。2)、AfxSocketInit() 這個(gè)函數(shù),在使用CSocket前一定要先調(diào)用該函數(shù),否則使用CSocket會(huì)出錯(cuò)。3)、CSocket:Create 的接口就是, 實(shí)現(xiàn)上還執(zhí)行了 CSocket:Bind , 非常不容易被發(fā)現(xiàn)。如果是以 Create 方法初始化的前提下不能再調(diào)用 Bind ,要不一定出錯(cuò)。一般寫(xiě)服務(wù)器程序都不要用Create 為好,用下面的 CSocket:Socket 初始化然后Bind。 21、winsock 有兩個(gè)不同的版本winsock 有兩個(gè)不同的版本,第一版很old

24、了,win95時(shí)代的,win2000后推崇第二版winsock 2, 出了主板本號(hào)外,還有子版本號(hào),這些功能上有差別,winsock2 支持原始套接字編程, MFC 還封裝了winsock,使用WINSOCK.h 要用到WSOCK32.LIB, 還有一些擴(kuò)展api功能,需要MSWSOCK.h MSWSOCK.DLL 。 現(xiàn)在winsock.h winsock2.h 都用ws2_32.lib。 22、sockaddr_in , sockaddr , in_addr區(qū)別struct sockaddr unsigned short sa_family; char sa_data14; ; 上面是通用

25、的socket地址,具體到Internet socket,用下面的結(jié)構(gòu),二者可以進(jìn)行類(lèi)型轉(zhuǎn)換 struct sockaddr_in short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; ; struct in_addr就是32位IP地址。 struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S

26、_addr; S_un; #define s_addr S_un.S_addr ; inet_addr()是將一個(gè)點(diǎn)分制的IP地址(如)轉(zhuǎn)換為上述結(jié)構(gòu)中需要的32位IP地址(0 xC0A80001)。填值的時(shí)候使用sockaddr_in結(jié)構(gòu),而作為函數(shù)(如socket, listen, bind等)的參數(shù)傳入的時(shí)候轉(zhuǎn)換成sockaddr結(jié)構(gòu)就行了,畢竟都是16個(gè)字符長(zhǎng)。通常的用法是: int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_a

溫馨提示

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

評(píng)論

0/150

提交評(píng)論