東南大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)第四次實(shí)驗(yàn)_第1頁(yè)
東南大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)第四次實(shí)驗(yàn)_第2頁(yè)
東南大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)第四次實(shí)驗(yàn)_第3頁(yè)
東南大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)第四次實(shí)驗(yàn)_第4頁(yè)
東南大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)第四次實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(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、東南大學(xué)自動(dòng)化學(xué)院實(shí) 驗(yàn) 報(bào) 告課程名稱: 信息通信網(wǎng)絡(luò)概論 第4次實(shí)驗(yàn)實(shí)驗(yàn)名稱: 設(shè)計(jì)協(xié)議 院 (系): 自動(dòng)化 專 業(yè): 自動(dòng)化 姓 名: 學(xué) 號(hào): 實(shí) 驗(yàn) 室: 金智樓 實(shí)驗(yàn)組別: 同組人員: 實(shí)驗(yàn)時(shí)間:2013 年12 月 23日評(píng)定成績(jī): 審閱教師: 目 錄一實(shí)驗(yàn)?zāi)康暮鸵?二實(shí)驗(yàn)原理3三實(shí)驗(yàn)方案與實(shí)驗(yàn)步驟4四實(shí)驗(yàn)設(shè)備與器材配置5五實(shí)驗(yàn)記錄5六實(shí)驗(yàn)總結(jié)9七思考題或討論題9一 實(shí)驗(yàn)?zāi)康暮鸵竽康模?.設(shè)計(jì)簡(jiǎn)單的應(yīng)用層協(xié)議,2.開(kāi)發(fā)基于TCP/IP或UDP/IP的網(wǎng)絡(luò)通信程序,實(shí)現(xiàn)數(shù)據(jù)傳送和文件傳輸。 要求:1.正確理解應(yīng)用層協(xié)議的概念;2.更深入了解客戶/服務(wù)器模式的網(wǎng)絡(luò)程序設(shè)計(jì)。二

2、實(shí)驗(yàn)原理1. 應(yīng)用層協(xié)議應(yīng)用層協(xié)議的定義包括如下內(nèi)容:(1)交換的報(bào)文類型,如請(qǐng)求報(bào)文和響應(yīng)報(bào)文;(2)各種報(bào)文類型的語(yǔ)法,如報(bào)文中的各個(gè)字段公共詳細(xì)描述;(3)字段的語(yǔ)義,即包含在字段中信息的含義;(4)進(jìn)程何時(shí)、如何發(fā)送報(bào)文及對(duì)報(bào)文進(jìn)行響應(yīng)。有些應(yīng)用層協(xié)議是由RFC文檔定義的,因此它們位于公共領(lǐng)域。例如,web的應(yīng)用層的協(xié)議HTTP(超文本傳輸協(xié)議,RFC 2616)就作為一個(gè)RFC供大家使用。如果瀏覽器開(kāi)發(fā)者遵從HTTP RFC規(guī)則,所開(kāi)發(fā)出的瀏覽器就能訪問(wèn)任何遵從該文檔標(biāo)準(zhǔn)的web,服務(wù)器并獲取相應(yīng)的web頁(yè)面。還有很多別的應(yīng)用層協(xié)議是專用的不能隨意應(yīng)用于公共領(lǐng)域。例如,很多現(xiàn)有的P2

3、P文件共享系統(tǒng)使用的是專用應(yīng)用層協(xié)議。目的,應(yīng)用層協(xié)議主要有以下幾種。2)SOCKET編程服務(wù)器要?jiǎng)?chuàng)建一個(gè)用于偵聽(tīng)的套接字,為該套接字分配地址之后,調(diào)用listen()函數(shù)使它處于偵聽(tīng)狀態(tài);客戶機(jī)在創(chuàng)建套接字完畢后,為套接字分配地址,然后調(diào)用connect()函數(shù),請(qǐng)求與服務(wù)器套接字連接;服務(wù)器套接字在收到客戶機(jī)的連接請(qǐng)示后,調(diào)用accept()函數(shù),該函數(shù)創(chuàng)建一個(gè)用于連接的套接字。應(yīng)用該套接字和客戶機(jī)上的連接套接字,用戶就可以在服務(wù)器和客戶機(jī)之間進(jìn)行數(shù)據(jù)傳輸了。在結(jié)束傳輸之后,客戶機(jī)調(diào)用closesocket()函數(shù)關(guān)閉套接字,服務(wù)器也調(diào)用該函數(shù)關(guān)閉用于偵聽(tīng)和連接的套接字。Socket()B

4、ind()Listen()服務(wù)器偵聽(tīng)套接字Connect()Accept()Closesocket()Send()Recv()創(chuàng)建連接套接字客戶機(jī)連接套接字Socket()Bind()Recv()Send()Closesocket()Closesocket()三 實(shí)驗(yàn)方案與實(shí)驗(yàn)步驟1.基于TCP的socket編程1) 服務(wù)端 1) 建立Socket 初始化WinSock的動(dòng)態(tài)連接庫(kù)后,需要在服務(wù)器端建立一個(gè)監(jiān)聽(tīng)的Socket,為此可以調(diào)用Socket()函數(shù)用來(lái)建立這個(gè)監(jiān)聽(tīng)的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調(diào)用成功返回Socket對(duì)象,失敗則返回INVALID_SOC

5、KET(調(diào)用WSAGetLastError()可得知原因,所有WinSocket 的函數(shù)都可以使用這個(gè)函數(shù)來(lái)獲取失敗的原因)。2) 綁定端口 接下來(lái)要為服務(wù)器端定義的這個(gè)監(jiān)聽(tīng)的Socket指定一個(gè)地址及端口(Port),這樣客戶端才知道待會(huì)要連接哪一個(gè)地址的哪個(gè)端口,為此我們要調(diào)用bind()函數(shù),該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。3) 監(jiān)聽(tīng) 當(dāng)服務(wù)器端的Socket對(duì)象綁定完成之后,服務(wù)器端必須建立一個(gè)監(jiān)聽(tīng)的隊(duì)列來(lái)接收客戶端的連接請(qǐng)求。listen()函數(shù)使服務(wù)器端的Socket 進(jìn)入監(jiān)聽(tīng)狀態(tài),并設(shè)定可以建立的最大連接數(shù)(目前最大值限制為 5, 最小值為1)。該函數(shù)調(diào)用

6、成功返回0,否則返回SOCKET_ERROR。 服務(wù)器端的Socket調(diào)用完listen()后,如果此時(shí)客戶端調(diào)用connect()函數(shù)提出連接申請(qǐng)的話,Server 端必須再調(diào)用accept() 函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動(dòng)作。為了知道什么時(shí)候客戶端提出連接要求,從而服務(wù)器端的Socket在恰當(dāng)?shù)臅r(shí)候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用WSAAsyncSelect()函數(shù),讓系統(tǒng)主動(dòng)來(lái)通知我們有客戶端提出連接請(qǐng)求了。該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。4) 服務(wù)器端接受客戶端的連接請(qǐng)求 當(dāng)Client提出連接請(qǐng)求時(shí),Server

7、端hwnd視窗會(huì)收到Winsock Stack送來(lái)我們自定義的一個(gè)消息,這時(shí),我們可以分析lParam,然后調(diào)用相關(guān)的函數(shù)來(lái)處理此事件。為了使服務(wù)器端接受客戶端的連接請(qǐng)求,就要使用accept() 函數(shù),該函數(shù)新建一Socket與客戶端的Socket相通,原先監(jiān)聽(tīng)之Socket繼續(xù)進(jìn)入監(jiān)聽(tīng)狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個(gè)新產(chǎn)生的Socket對(duì)象,否則返回INVALID_SOCKET。5) 結(jié)束 socket 連接 結(jié)束服務(wù)器和客戶端的通信連接是很簡(jiǎn)單的,這一過(guò)程可以由服務(wù)器或客戶機(jī)的任一端啟動(dòng),只要調(diào)用closesocket()就可以了,而要關(guān)閉Server端監(jiān)聽(tīng)狀態(tài)的sock

8、et,同樣也是利用此函數(shù)。2) 客戶端 1) 建立客戶端的Socket 客戶端應(yīng)用程序首先也是調(diào)用WSAStartup() 函數(shù)來(lái)與Winsock的動(dòng)態(tài)連接庫(kù)建立關(guān)系,然后同樣調(diào)用socket() 來(lái)建立一個(gè)TCP或UDP socket(相同協(xié)定的 sockets 才能相通,TCP 對(duì) TCP,UDP 對(duì) UDP)。與服務(wù)器端的socket 不同的是,客戶端的socket 可以調(diào)用 bind() 函數(shù),由自己來(lái)指定IP地址及port號(hào)碼;但是也可以不調(diào)用 bind(),而由 Winsock來(lái)自動(dòng)設(shè)定IP地址及port號(hào)碼。 2) 提出連接申請(qǐng) 客戶端的Socket使用connect()函數(shù)來(lái)提

9、出與服務(wù)器端的Socket建立連接的申請(qǐng),函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR。3) 數(shù)據(jù)的傳送 雖然基于TCP/IP連接協(xié)議(流套接字)的服務(wù)是設(shè)計(jì)客戶機(jī)/服務(wù)器應(yīng)用程序時(shí)的主流標(biāo)準(zhǔn),但有些服務(wù)也是可以通過(guò)無(wú)連接協(xié)議(數(shù)據(jù)報(bào)套接字)提供的。2.基于UDP的socket編程服務(wù)器端1:創(chuàng)建套接字(create)2:將套接字綁定到一個(gè)本地地址和端口上(bind)3:等待接收數(shù)據(jù)(recvfrom)4:關(guān)閉套接字客戶端1:創(chuàng)建套接字( create )2:向服務(wù)器發(fā)送數(shù)據(jù)(sendto)3:關(guān)閉套接字四 實(shí)驗(yàn)設(shè)備與器材配置計(jì)算機(jī)一臺(tái)、軟件Microsoft Visual Studi

10、o 6.0五 實(shí)驗(yàn)記錄打開(kāi)兩個(gè)應(yīng)用程序,一個(gè)選擇“服務(wù)器”,并且點(diǎn)擊“偵聽(tīng)”;另外一個(gè)選擇“客戶端”,并且點(diǎn)擊“連接”,此時(shí)兩個(gè)程序的消息發(fā)送窗口的信息框變?yōu)榭蓪?,輸入消息可以進(jìn)行客戶端-服務(wù)器之間的發(fā)送和接收,發(fā)送和接收的消息可以存儲(chǔ)在信息框內(nèi)??蛻舳撕头?wù)器端可以互發(fā)信息:輸入框輸入/n和/p,接收到的為指定的圖像:主要代碼如下:void CProject2Dlg:OnSelchangeComboCs() / TODO: Add your control notification handler code hereint set = m_cs_set.GetCurSel();if(set=

11、1)m_server=FALSE;this->GetDlgItem(IDC_SET_IPADDR)->EnableWindow(TRUE);m_set_ip=""UpdateData(false);this->SetDlgItemText(IDC_CONNECT,"連接");this->SetWindowText("TCP/IP通信客戶端");else if(set=0)m_server=TRUE;m_set_ip=" "this->GetDlgItem(IDC_SE

12、T_IPADDR)->EnableWindow(FALSE);UpdateData(FALSE);this->SetDlgItemText(IDC_CONNECT,"偵聽(tīng)");this->SetWindowText("TCP/IP通信服務(wù)器端");void CProject2Dlg:OnConnect() / TODO: Add your control notification handler code hereUpdateData(TRUE);int retb,ret,retc;SOCKADDR_IN addr;BOOL nret;

13、CString ServerIP;ServerIP=m_set_ip; if(m_active=TRUE)return;if(m_server=TRUE)if( (m_set_port)<=1024 )|(m_set_port)>4096) )AfxMessageBox("請(qǐng)輸入合理的端口號(hào)!");ret=m_listensocket.Create(m_set_port,SOCK_STREAM);if(ret = false) m_static_state=" 無(wú)法建立服務(wù)器!" UpdateData(FALSE); m_listensock

14、et.Close();retb=m_listensocket.Listen(5);if(retb=false)m_static_state=" 無(wú)法偵聽(tīng)!"UpdateData(FALSE);m_static_state="服務(wù)器建立成功!正在偵聽(tīng)"m_list_msg.ResetContent();m_list_msg.AddString("=>服務(wù)器正在偵聽(tīng)");this->GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);this->GetDlgItem(IDC_C

15、OMBO_CS)->EnableWindow(FALSE);UpdateData(FALSE);m_active=TRUE;elseServerIP.TrimLeft();ServerIP.TrimRight();if( inet_addr(ServerIP)= INADDR_NONE)AfxMessageBox("請(qǐng)輸入正確的服務(wù)器IP地址!");if( (m_set_port)<=1024 )|(m_set_port)>4096) )AfxMessageBox("請(qǐng)輸入合理的端口號(hào)!");retc=m_connectsocket.C

16、reate(0,SOCK_STREAM);if(retc = false)m_static_state=" 無(wú)法建立客戶端!"UpdateData(FALSE);m_connectsocket.Close();addr.sin_family=AF_INET;addr.sin_port=htons(m_set_port);addr.sin_addr.S_un.S_addr = inet_addr(m_set_ip); nret=m_connectsocket.Connect(SOCKADDR *)&addr,sizeof(SOCKADDR);if( nret=TRUE

17、 )AfxMessageBox("連接服務(wù)器失敗!");m_connectsocket.Close();elsem_static_state=" 正在連接服務(wù)器"this->GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);this->GetDlgItem(IDC_COMBO_CS)->EnableWindow(FALSE);UpdateData(FALSE);m_active=TRUE;void CProject2Dlg:OnServerAccept()if(m_active=TRUE)m

18、_listensocket.Accept(m_connectsocket,NULL,NULL);m_static_state=" 客戶端已連接上"m_list_msg.AddString("=>客戶端連接成功!");UpdateData(FALSE);CString welcome("Welcome my friend!");m_connectsocket.Send(welcome,welcome.GetLength();void CProject2Dlg:OnClientConnect(int nErrorCode)socka

19、ddr_in name;int len;CString buf;if(m_active=TRUE)if(nErrorCode!=0)m_list_msg.AddString("連接服務(wù)器錯(cuò)誤!");m_static_state=" 服務(wù)器連接錯(cuò)誤"this->GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);this->GetDlgItem(IDC_COMBO_CS)->EnableWindow(TRUE);UpdateData(FALSE); m_active=FALSE;m_connect

20、socket.Close();elselen=sizeof(sockaddr_in);m_connectsocket.GetPeerName(SOCKADDR*)&name,&len);m_list_msg.ResetContent();buf="成功連接上服務(wù)器"buf+=inet_ntoa(name.sin_addr);m_list_msg.AddString(buf);m_static_state=" 服務(wù)器連接成功!"UpdateData(FALSE);CString welcome("I am ");welc

21、ome+=CLIENT; m_connectsocket.Send(welcome,welcome.GetLength();void CProject2Dlg:OnServerClose()m_connectsocket.Close();m_static_state=" 正在偵聽(tīng)"m_list_msg.ResetContent();m_list_msg.AddString("=>客戶端已退出");m_list_msg.AddString("=>服務(wù)器正在偵聽(tīng)");UpdateData(FALSE);void CProjec

22、t2Dlg:OnSocketClose()if(m_active=FALSE)return;if(m_server=TRUE)OnServerClose();elseOnClientClose();void CProject2Dlg:OnClientClose()m_connectsocket.Close();m_list_msg.ResetContent();m_list_msg.AddString("服務(wù)器已斷開(kāi)。成功退出");m_static_state=" 已斷開(kāi)連接"this->GetDlgItem(IDC_CONNECT)->En

23、ableWindow(TRUE);this->GetDlgItem(IDC_COMBO_CS)->EnableWindow(TRUE);UpdateData(FALSE);m_active=FALSE;void CProject2Dlg:OnSocketReceive()if(m_server=TRUE)OnServerReceive();elseOnClientReceive();void CProject2Dlg:OnServerReceive()BOOL Act=FALSE;CString nRev,nret;char bufMAX_BUFFER+1;int ret,i,le

24、n;ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR)bufret=NULL;nRev=buf;nret+=CLIENT;nret+=":"len=nret.GetLength();nret=nRev.Right( ( (nRev.GetLength()-len ) ); if(nret.GetAt(0)='/')Act=DoAction(nret);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)nRev);i=m_list_msg.Ge

25、tCount();m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);elseAfxMessageBox("消息接收錯(cuò)誤!");void CProject2Dlg:OnClientReceive()char bufMAX_BUFFER+1;BOOL Act=FALSE;int ret,i,len;CString nRev,nret;ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR)bufret=NULL;n

26、Rev=buf;nret+=SERVER;nret+=":"len=nret.GetLength();nret=nRev.Right( ( (nRev.GetLength()-len ) );if(nret.GetAt(0)='/')Act=DoAction(nret);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)nRev);i=m_list_msg.GetCount();m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);elseA

27、fxMessageBox("消息接收錯(cuò)誤!");void CProject2Dlg:OnSendMsg() / TODO: Add your control notification handler code hereCString buf;int nret;BOOL Act=FALSE;int nLen,i;UpdateData(TRUE);m_outmsg.TrimLeft();if(m_outmsg.IsEmpty()AfxMessageBox("對(duì)不起,不能發(fā)送空消息!");return;if(m_server=TRUE)buf+=SERVER;

28、buf+=":"elsebuf+=CLIENT;buf+=":"buf+=m_outmsg;nLen=buf.GetLength();nret = m_connectsocket.Send(LPCTSTR)buf,nLen);if(nret!=SOCKET_ERROR)if(m_outmsg.GetAt(0)='/')Act=DoAction(m_outmsg);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)buf);m_outmsg.Empty();i=m_list_msg.GetCount();m

29、_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);elseAfxMessageBox("消息發(fā)送失敗! :(");m_sListenSocket.Accept(m_sConnectSocket);/激活消息輸入和相關(guān)控件GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);GetDlgItem(IDOK)->EnableWindow(TRUE);GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE)

30、;void CTalkDlg:OnConnect()/對(duì)于客戶機(jī)GetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);GetDlgItem(IDOK)->EnableWindow(TRUE);GetDlgItem(IDC_STATIC_MSG)->EnableWindow(TRUE);GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(TRUE);void CTalkDlg:OnReceive()char* pBuf = new char1025;/char pBuf1025;int nBufSize =

31、1024;int nReceived;CString strReceived;/接收消息nReceived = m_sConnectSocket.Receive(pBuf,nBufSize); /判斷消息接收是否成功?if(nReceived!=SOCKET_ERROR)/保留接收消息的有效部分pBufnReceived = NULL;/將消息轉(zhuǎn)化為CString對(duì)象strReceived = pBuf;/將消息添加到“已接收的消息”列表框m_listReceived.AddString(strReceived);/更新對(duì)話框UpdateData(FALSE);elseAfxMessageBo

32、x("信息接收錯(cuò)誤!",MB_OK|MB_ICONSTOP); delete pBuf;void CTalkDlg:OnSendMsg() int nLen; /消息長(zhǎng)度int nSent; /已發(fā)送消息的長(zhǎng)度/從對(duì)話框取回?cái)?shù)據(jù)UpdateData(TRUE);/判斷要發(fā)送的消息是否為空if(!m_strMsg.IsEmpty()/獲取消息的長(zhǎng)度nLen = m_strMsg.GetLength();/發(fā)送消息nSent = m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen);/發(fā)送是否成功if(nSent!=SOCKET_ERROR

33、)/將消息添加到“已發(fā)送列表框”m_listSent.AddString(m_strMsg);/更新對(duì)話框UpdateData(FALSE);elseAfxMessageBox("信息發(fā)送錯(cuò)誤",MB_OK|MB_ICONSTOP);/清除當(dāng)前信息m_strMsg.Empty();/更新對(duì)話框UpdateData(FALSE);void CTalkDlg:OnClose() /關(guān)閉連接的套接字m_sConnectSocket.Close();/禁用消息輸入和發(fā)送的相關(guān)控件GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);Get

34、DlgItem(IDOK)->EnableWindow(FALSE);GetDlgItem(IDC_STATIC_MSG)->EnableWindow(FALSE);GetDlgItem(IDC_BTN_CLOSE)->EnableWindow(FALSE);/清除列表框內(nèi)容while(m_listSent.GetCount()!=0)m_listSent.DeleteString(0);while(m_listReceived.GetCount()!=0)m_listReceived.DeleteString(0);/是否為客戶機(jī)if(m_cmbType.GetCurSel

35、()=0)/對(duì)于客戶機(jī) /激活與連接設(shè)置相關(guān)的控件GetDlgItem(IDC_BTN_CONNECT)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE); GetDlgItem(IDC_STATIC_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_STATIC_SERVPORT)->EnableWindow(TRUE);GetDlgItem(IDC_STATIC_TYPE)->E

溫馨提示

  • 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)論