操作系統(tǒng)課程設(shè)計(jì)winsock+api編程_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)winsock+api編程_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)winsock+api編程_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)winsock+api編程_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)winsock+api編程_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)課程設(shè)計(jì) winsock+api編程操作系統(tǒng)課程設(shè)計(jì)winsock+api編程操作系統(tǒng)課程設(shè)計(jì)學(xué)習(xí)Winsock API編程操作系統(tǒng)課程設(shè)計(jì) 學(xué)習(xí)WinsockAPI編程班級(jí):信計(jì)0501姓名:李寧學(xué)號(hào):305010400? 姓名:宋若軍學(xué)號(hào):3050104025 學(xué)習(xí) Winsock API 編程 Windpows Sockets 是廣 泛應(yīng)用的、開(kāi)放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口,主要由winsock.h頭文件和動(dòng)態(tài)鏈接庫(kù) winsock.dll組成。一、 套接字 套接字(Sockes)是通信的基礎(chǔ),是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元??梢詫⑻捉幼挚醋魇遣煌鳈C(jī)之間的進(jìn)

2、程進(jìn)行雙向通信的端點(diǎn)。根據(jù)通信網(wǎng)絡(luò)的特性,套接字可以分為以下兩類。1、流套接字流套接字提供沒(méi)有邊界的數(shù)據(jù)流(即字節(jié) 流),能夠確保數(shù)據(jù)流以正確的順序無(wú)重復(fù)地被送達(dá),使用 于處理大量數(shù)據(jù)。流套接字是面向連接的。2、數(shù)據(jù)報(bào)套接字 數(shù)據(jù)報(bào)套接字支持雙向數(shù)據(jù)流,此數(shù) 據(jù)流不能保證按順序和不重復(fù)送達(dá),也不能保證數(shù)據(jù)傳輸?shù)?可靠性。數(shù)據(jù)報(bào)套接字是無(wú)連接的。Winsock對(duì)有可能阻塞的函數(shù)提供了兩種處理方式: 阻塞方式和非阻塞方式。在阻塞方式下,收發(fā)數(shù)據(jù)的函數(shù)在被調(diào)用后一直等到傳送 完畢或由錯(cuò)才能返回,期間不能進(jìn)行任何操作。在非阻塞方式下,函數(shù)被調(diào)用后立即返回,當(dāng)網(wǎng)絡(luò)傳送完 后,由Winsock給應(yīng)用程序發(fā)

3、送一個(gè)消息,通知操作完成。在編程時(shí),應(yīng)盡量使用非阻塞模式。二、Winsock的啟動(dòng)和終止 由于 Winsock服務(wù)是以動(dòng)態(tài) 鏈接庫(kù)的形式實(shí)現(xiàn)的,所以在使用前必須調(diào)用WSAStartup函數(shù)對(duì)其進(jìn)行初始化,協(xié)商 Winsock的版本支持,并分配必 要的資源。WSAStartup函數(shù)聲明如下:int WSAStartup(WORD wVersionRequested,LPWSADATA IpWSAData);參數(shù)說(shuō)明: wVersionRequested:指定加載的Winsock版本,通常高位字節(jié)指定 Winsock的副 版本,低位字節(jié)指定 Winsock的主版本,然后用 MAKEWORD(X,Y

4、) 宏獲取該值。 ipWSAData :WSADATA數(shù)據(jù)結(jié)構(gòu)指針,其中 WSADATA結(jié)構(gòu)的定義如下:Typedef struct WSAData WORD wVersion;期望使用的 Winsock 版本 WORD wHighVersion;/ 返回現(xiàn)有 Winsock 最高 版本 char szDescriptionWSADESCRIPTION_LEN+1;/ 套接 字 實(shí) 現(xiàn) 描 述、charszSystemStatusWSASYS_STATUS_LEN+1;/ 狀態(tài)或配置信 息 unsigned short iMaxSockets;/ 最大套 接字?jǐn)?shù) unsigned short

5、iMaxUdpDg;/ 最大數(shù)據(jù)報(bào)長(zhǎng)度 char FAR * IpVendorInfo;/ 保留WSADATA,FAR *LPWSADATA;在應(yīng) 用程序關(guān)閉套接字連接后,還需要調(diào)用 WSACleanup函數(shù)終 止對(duì)Winsock庫(kù)的使用,并釋放資源,函數(shù)聲明如下:int WSACleanup(void); 三、Winsock編程模型 不論是流套 接字還是數(shù)據(jù)報(bào)套接字編程,一般都采用客戶端/服務(wù)器模式,具運(yùn)行原理基本類似。數(shù)據(jù)報(bào)套接字的編程模型如圖一所示。流套接字的編程模型如圖二所示。月艮務(wù)器 socket() bind() closesocket() recvfrom() sendto()

6、socket() 客戶端 closesocket() recvfrom() sendto()月艮務(wù)器 socket() bind() listen () accept() send() recv() closesocket() socket() connect() closesocket() send() recv() 客戶端 圖一 數(shù) 據(jù)報(bào)套接字編程模型圖二流套接字編程模型流套接字的服務(wù)進(jìn)程和客戶端進(jìn)程在通信前必須創(chuàng)建各自的套接字并建立連接,然后才能實(shí)現(xiàn)數(shù)據(jù)傳輸。具體編程步驟如下:(1)服務(wù)器進(jìn)程創(chuàng)建套接字。(2)將本地地址綁定到套接字上以標(biāo)識(shí)該套接字。(3)將套接字置入監(jiān)聽(tīng)模式并準(zhǔn)備接收連

7、接請(qǐng)求。(4)客戶端進(jìn)程調(diào)用socket函數(shù)創(chuàng)建客戶端套接字。(5)客戶端進(jìn)程向服務(wù)進(jìn)程發(fā)生連接請(qǐng)求。(6)數(shù)據(jù)傳輸。(7)關(guān)閉套接字。服務(wù)器進(jìn)程總是先于客戶進(jìn)程啟動(dòng),調(diào)用 socket創(chuàng)建一個(gè)流套接字,該函數(shù)聲明如下:SOCKET socket(int af,int type,int protocol); 參數(shù)說(shuō)明: af:指定網(wǎng)絡(luò)地址族,一般為 AF_INET o type :指定套接字類型,可選的取值如下:SOCK_STREAM 流套接字。SOCK_DGRAM數(shù)據(jù)報(bào)套接字。 protocol :指定網(wǎng)絡(luò)協(xié)議,一般為 0,表示默認(rèn)的TCP/IP協(xié)議。成功創(chuàng)建了 Socket之后,就應(yīng)該選定

8、通信的對(duì)象。調(diào)用bind()函數(shù)可以將本地地址綁定到套接字上,該函數(shù)聲明如下:int bind(SOCKET s,const struct sockaddt FAR* name ,int namelen);參數(shù)說(shuō)明: s:指定一個(gè)未綁定的套接字句柄,用于等待客戶進(jìn)程的連接。 name:指向sockaddr結(jié)構(gòu)對(duì)象的指針。 namelen:指定sockaddr結(jié)構(gòu)的長(zhǎng)度。其中sockddr結(jié)構(gòu)隨選擇的協(xié)議的不同而變化,因此常用的是sockaddr_in結(jié)構(gòu),用來(lái)標(biāo)識(shí) TCP/IP協(xié)議下的地址,該 結(jié)構(gòu)定義如下:struct sockaddr_in shortsin_family;/ 指定地址族,

9、一般為 AF_INETu_shortsin_port;/ 指定端口號(hào) structin_addrsin_addr;/指定 IP 地址 charsin_zero8;/填充位;其 中IP地址結(jié)構(gòu)in_addr的定義如下:structin_addrunionstructu_chars_b1,s_b2,s_b3,s_b4;S_un_b;structu_shorts_w1,s_w2;S_un_w; u_long S_addr; S_un; ;綁定成功后,調(diào)用listen函數(shù)用于設(shè)置套接字的等待連接狀態(tài),該函數(shù)聲 明如下:int listen(SOCKET s,int backlog); 參數(shù)說(shuō)明: s:

10、指定一個(gè)已綁定未連接的套接字句柄 backlog :指定正在等待連接的隊(duì)列的最大長(zhǎng)度,可取15 o進(jìn)入監(jiān)聽(tīng)狀態(tài)后,通過(guò)調(diào)用accept函數(shù)使套接字做好接受客戶連接的準(zhǔn)備,該函數(shù)聲明如下:SOCKET accept(SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);參數(shù)說(shuō)明: s:指定處于監(jiān)聽(tīng)狀態(tài)的套接字句柄。 addr:指定一個(gè)有效的 SOCKADDR_IN結(jié)構(gòu)地址。 addrlen :指定SOCKADDR_IN結(jié)構(gòu)的長(zhǎng)度。accept函數(shù)返回后,addr變量中會(huì)包含請(qǐng)求連接的客戶IP地址,并返回一個(gè)新的套接字句柄,對(duì)應(yīng)于已經(jīng)接受的那個(gè)

11、客戶端連接。而原來(lái)的監(jiān)聽(tīng)套接字仍處于監(jiān)聽(tīng)狀態(tài)??蛻暨M(jìn)程調(diào)用connect函數(shù)可以主動(dòng)提由連接請(qǐng)求,該函 數(shù)聲明如下:int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);參數(shù)說(shuō)明: s:指定一個(gè)未連接的套接字句柄 name:指定服務(wù)進(jìn)程的IP地址信息,針對(duì) TCP協(xié)議。 namelen:指定name參數(shù)的長(zhǎng)度。當(dāng)服務(wù)器進(jìn)程接受連接請(qǐng)求后,將生成一個(gè)新的套接字,并向各客戶進(jìn)程返回接受信號(hào)。一旦客戶進(jìn)程收到來(lái)自服務(wù)器的接受信號(hào),表示建立連接,即可進(jìn)行數(shù)據(jù)傳輸了。調(diào)用send函數(shù)用于發(fā)送數(shù)據(jù),調(diào)用recv函數(shù)用于接受數(shù)據(jù),

12、函數(shù)聲明如下:int send(SOCKET s,const char FAR* buf,int len,int flags); int recv(SOCKET s,const char FAR* buf,int len,int flags); 參數(shù)說(shuō) 明 s:指定已建立連接的套接字。 buf:發(fā)送或接受數(shù)據(jù)緩沖區(qū)。 len :指定數(shù)據(jù)緩沖區(qū)的長(zhǎng)度。 flags :標(biāo)志,一般為0。通信結(jié)束,必須關(guān)掉連接以釋放套接字占用的資源。調(diào)用closesocket函數(shù)用于關(guān)閉套接字,該函數(shù)聲明如下:Int closesocket( SOCKET s);為了保證套接字正常關(guān)閉,一 般在調(diào)用closesock

13、et之前先調(diào)用shutdown函數(shù)中斷連接。該函數(shù)聲明如下:int shutdown(SOCKET s,int how); 參數(shù)說(shuō)明: s:指定要中斷的套接字句柄。 how :指定將禁止的操作,可選的取值如下:SD_RECEIVE禁止調(diào)用接受函數(shù)。SD_SEND禁止調(diào)用發(fā)送函數(shù)。ASD_BOTH取消收發(fā)操作。四、Winsock I/O模型Winsock套接字在兩種模式下執(zhí)行I/O操作,即阻塞和非阻塞。默認(rèn)情況下,套接字為阻塞模式。下面的代碼演示了創(chuàng)建一個(gè)套接字,并將其設(shè)置為非阻塞模式的過(guò)程:SOCKET s;/套接字句柄 unsigned long cmd;/指令參數(shù) int nStatus;

14、/返回值 s = socket(AF_INET,SOCK_STREAM,0); / 創(chuàng)建流套接字 nStatus = ioctlsocket(s,FIOBIO,/設(shè)置為非阻塞 模式將一個(gè)套接字設(shè)置為非阻塞模式之后,Winsock API調(diào) 用會(huì)立即返回。Winsock提供了幾種不同的套接字I/O模型,如選擇(Select)、異步選擇(WSAAsyncSelect )、事件選擇 (WSAEventSelect)和重疊(Overlapped)等。1. WSAAsyncSelect模型 利用異步選擇模型,應(yīng)用程序可 以在一個(gè)套接字上接收以Windows消息為基礎(chǔ)的網(wǎng)絡(luò)事件通知。該模型的實(shí)現(xiàn)方法是通過(guò)

15、調(diào)用WSAAsyncSelect函數(shù)自動(dòng)將套接字設(shè)置為非阻塞模式,并注冊(cè)一個(gè)或多個(gè)網(wǎng)絡(luò)事件, 提供一個(gè)消息通知的窗口句柄。當(dāng)注冊(cè)的網(wǎng)絡(luò)事件發(fā)生時(shí),對(duì)應(yīng)的窗口將接收到一個(gè)基于 消息的通知。WSAAsyncSelect函數(shù)聲明如下:int WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long IEwent); 參數(shù)說(shuō)明: s:指定需要事件通知的套接句柄。 hWnd :指定接收消息的窗口句柄。 wMsg : 指定發(fā)送的消息。 IEvent:指定網(wǎng)絡(luò)事件集合,可以是以下取值的和:FD_READ想要接收讀準(zhǔn)備好的通知。 FD_WRITE想要接收

16、寫準(zhǔn)備好的通知。 FD_OOB想要接收帶外數(shù)據(jù)到達(dá)的通知。 FD_ACCEPT想要接收連接準(zhǔn)備好的通知。 FD_CONNECT想要接收已經(jīng)連接的通知。 FD_CLOSE想要接收套接字關(guān)閉的通知。如果要取消所有的通知,則將Event參數(shù)設(shè)置為0即可。2. WSAEventSelect模型與異步選擇模型相似,利用事件選擇模型應(yīng)用程序可以在一個(gè)或多個(gè)套接字上接收以事件為基礎(chǔ)的網(wǎng)絡(luò)事件通知,并且它支持的網(wǎng)絡(luò)事件與異步選擇模型一樣。它與 WSAAsyncSelect模型最主要的區(qū)別在于,網(wǎng)絡(luò)事件 會(huì)被發(fā)送到一個(gè)事件對(duì)象句柄,而不是一個(gè)窗口句柄。首先需要調(diào)用 WSACreateEvent函數(shù)創(chuàng)建事件對(duì)象來(lái)

17、接收網(wǎng)絡(luò)事件,該函數(shù)聲明如下:WSAEVENT WSACreateEvent(void);返回的事件對(duì)象具有兩種工作狀態(tài):有信號(hào)和無(wú)信號(hào)。接著調(diào)用WSAEventSelect函數(shù)將所創(chuàng)建的事件對(duì)象與套接字關(guān)聯(lián)起來(lái),并注冊(cè)網(wǎng)絡(luò)事件,該函數(shù)聲明如下:Int WSAEventSelect(SOCKET s,WSAEVENT hEventObject,Long INetworkEvents); 參數(shù)說(shuō)明: s:指定需要事件通知的套接字句柄。 hEventObject:指定事件對(duì)象句柄。 InetworkEvent :指定網(wǎng)絡(luò)事件集合。在完成一個(gè)I/O操作之后應(yīng)用程序需要調(diào)用 WSAResetEvent

18、函數(shù)重置該事件對(duì)象,函數(shù)聲明如下:BOOL WSAResetEvent(WSAEVENT hEvent);參數(shù)說(shuō)明 hEvent:用于指定事件對(duì)象句柄。一個(gè)套接字與一個(gè)事件對(duì)象句柄關(guān)聯(lián)起來(lái)之后,應(yīng)用程序就可以通過(guò)WSAWaitForMultipleEvents函數(shù)等待網(wǎng)絡(luò)事件來(lái)觸發(fā)事件句柄的工作狀態(tài),進(jìn)行 I/O操作,該函數(shù)聲明如 下:DWORD WSAWaitForMultipleEvents(DWORD cEvents, const WSAEVENT FAR *IphEvents, BOOL fWaitAll,DWORD dwTimeOUT,BOOL fAlertable);參數(shù)說(shuō)明: c

19、Event:指定事件對(duì)象句柄數(shù)組的元素的個(gè)數(shù)。、 IphEvents :指向一個(gè)事件對(duì)象句柄數(shù)組的指針。 fWaitAll :指定是否等待所有事件對(duì)象同時(shí)有信號(hào)。 dwTimeOUT : 指定超時(shí)等待時(shí)間。 fAlertable :指定當(dāng)系統(tǒng)將I/O例程放入隊(duì)列時(shí),函數(shù)是否返回。五、應(yīng)用實(shí)例:基于Winsock API調(diào)用的聊天室 1、服務(wù)器端應(yīng)用程序設(shè)計(jì) 首先建立一個(gè)空的工作空間E1701。(2)在空間E1701里建立一個(gè)對(duì)話框工程 Server作為服務(wù) 端。對(duì)話框設(shè)計(jì)如圖三所示。圖三服務(wù)器端窗口設(shè)計(jì)(3)在類CServerDlg中給顯示聊天內(nèi)容和發(fā)送聊天內(nèi)容的文本框添加變量/ Dialog

20、 DataAFX_DATA(CServerDlg)enum IDD =IDD_SERVER_DIALOG ; CEditm_Show;/聊天記錄顯示控件對(duì)象 CStringm_strShow;/ 聊天記錄字符串 CStringm_strMsg;/ 聊天內(nèi)容字符串/AFX_DATA (4) 在服務(wù)器端要保存客戶端的socket連接,故引入鏈表支持,在ServerDlg.h中添加代碼:#include typedef CList SOCKET_ARRAY; (5) 要調(diào)用 WinsockAPI必須包含 winsock.h頭文件和動(dòng)態(tài)鏈接庫(kù)winsock.dll。在StdAfx.h文件中添加如下代碼

21、:#include #pragma comment(lib, "wsock32.lib (6)月定義消 息,并添加消息處理函數(shù)。在Server.h中添加:#define WM_SERVERMSG (WM_USER+100) / Generated message map functions /AFX_MSG(CServerDlg) afx_msg long OnServerMsg(WPARAM wParam, LPARAM lParam); /AFX_MSG (7)初始化服務(wù)器窗口,創(chuàng)建服務(wù)器端 socket。BOOLCServerDlg:OnInitDialog() CDialog

22、:OnInitDialog(); / TODO: Add extra initialization here try WSADATA wsaData;/ WSADATA 結(jié)構(gòu)對(duì)象 WORD wVersionRequested=MAKEWORD(2, 0);/ 指定 Winsock 版本為 2.0 WSAStartup(wVersionRequested, / 啟動(dòng) Winsock m_hSocket = socket(AF_INET, SOCK_STREAM, 0);/ 創(chuàng)建流套接字UINT len=WSAGetLastError();/ 獲取錯(cuò)誤代碼 if(len!=0) throw len

23、;/拋曲異常錯(cuò)誤 m_saList.RemoveAll();/ 清 空 套 接 字 列 表 WSAAsyncSelect(m_hSocket, this->m_hWnd, / 接收消息的 窗 口為對(duì)話框 WM_SERVERMSG, /指定消息 FD_ACCEPT | FD_READ | FD_WRITE| FD_CLOSE); 指定 事件 m_uPort = 8080;/設(shè)置端口號(hào)/設(shè)置套接字地址結(jié)構(gòu)m_addr.sin_family = AF_INET;m_addr.sin_addr.S_un.S_addr = INADDR_ANY; m_addr.sin_port=htons(m_u

24、Port);bind(m_hSocket,(LPSOCKADDR)/ 綁 定 套 接 字 listen(m_hSocket, 3);/ 進(jìn) 入 監(jiān) 聽(tīng) 狀 態(tài) len=WSAGetLastError(); if(len!=0) throw len; m_strShow = _T(服務(wù)器啟 動(dòng)成功 “); catch(UINT m_strShow =_T(創(chuàng)建 套接字 失?。?“); break; case WSAEINV AL: MessageBox(監(jiān)聽(tīng)端口已被占用! “); m_strShow = _T(服務(wù)“ 器啟動(dòng)失敗 ");break; default: MessageBo

25、x('監(jiān)聽(tīng)端口已被占 用!"); m_strShow = _T("服務(wù)器啟動(dòng)失敗"); UpdateData(FALSE);/ 更新顯示return TRUE; (8)修改OnDestroy()函 數(shù) void CServerDlg:OnDestroy() CDialog二OnDestroy(); WSAAsyncSelect(m_hSocket, this->m_hWnd, 0, 0);/ 取消異步選擇模式WSACleanup();/清理 Winsock (9)編寫發(fā)送按鈕函數(shù) void CServerDIg二OnButton1() UpdateD

26、ata(TRUE); m_strShow += _T( "n ");回車、換行 m_strShow += m_strMsg; 添加聊 天內(nèi)容 SOCKET s; for (int i=0; i #pragma comment(lib, “ wsock32.lib'勺密義消息,并添加消息處理函數(shù)。在Client.h中添加:#define WM_CLIENTMSG (WM_USER+200) / Generated message map functions /AFX_MSG(CClientDlg) afx_msg long OnClientMsg(WPARAM wPa

27、ram, LPARAM IParam); /AFX_MSG (5) 初始化客戶端窗口,創(chuàng)建 socket。準(zhǔn)備建立連接 BOOL CClientDlg:OnInitDialog() / 窗口初 始化函數(shù) CDialog:OnInitDialog(); / TODO: Add extra initialization here WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2,0);WSAStartup(wVersionRequested, m_hSocket=socket(AF_INET,SOCK_STREAM,0);調(diào) 用socket

28、函數(shù)創(chuàng)建套接字 WSAAsyncSelect(m_hSocket, this->m_hWnd, WM_CLIENTMSG , FD_CONNECT | FD_READ | FD_WRITE | FD_CLOSE);禾用異步選擇模型, 自動(dòng)設(shè)置為非阻塞模式return TRUE; return TRUE unlessyou set the focus to a control (6)編寫連接按鈕函數(shù) void CClientDlg二OnButton2() UpdateData(true); BYTE f0,f1,f2,f3; m_ip.GetAddress(f0,f1,f2,f3);CSt

29、ringaddr;addr.Format( " d.%d.%d.%d ",f0, f1, f2, f3); m_addr.sin_family = AF_INET; m_addr.sin_addr.S_un.S_addr = inet_addr(addr.GetBuffer(0);m_addr.sin_port =htons(m_uPort); connect(m_hSocket,(LPSOCKADDR)/ 連接月艮 務(wù)器 UINT tt=WSAGetLastError(); switch(tt) case 10035: break;default:UpdateData(false);closesocket(this->m_hSocket);this->OnInitDialog();this->OnButton2(); (7)編寫發(fā)送函數(shù) voidCClientDlg二OnButton1() UpdateData(TRUE); m_strShow +=“ n " ;m_strShow+=m_strMsg;send(m_hSock

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論