[計(jì)算機(jī)]發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)報(bào)告及源代碼_第1頁
[計(jì)算機(jī)]發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)報(bào)告及源代碼_第2頁
[計(jì)算機(jī)]發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)報(bào)告及源代碼_第3頁
[計(jì)算機(jī)]發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)報(bào)告及源代碼_第4頁
[計(jì)算機(jī)]發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī)報(bào)告及源代碼_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄 一課程設(shè)計(jì)目的2二. 課程設(shè)計(jì)要求2三相關(guān)知識(shí)2四課程設(shè)計(jì)分析4五程序流程圖7六程序運(yùn)行結(jié)果截圖10七. 課程設(shè)計(jì)心得10八.附錄:參考文獻(xiàn) 11一課程設(shè)計(jì)目的: IP協(xié)議的優(yōu)點(diǎn)是簡潔,但缺少過失控制和查詢機(jī)制,而網(wǎng)際控制報(bào)文協(xié)議ICMP具有補(bǔ)充IP功能的作用。在網(wǎng)絡(luò)管理中,常常要確定當(dāng)前網(wǎng)絡(luò)中處于活動(dòng)狀態(tài)的主機(jī),這時(shí)可以通過使用ICMP的回送和回送響應(yīng)消息來完成這項(xiàng)工作。本課程設(shè)計(jì)的目的就是編制程序,利用ICMP數(shù)據(jù)包,發(fā)現(xiàn)指定網(wǎng)段中的活動(dòng)主機(jī)。通過課程設(shè)計(jì),使學(xué)生更加熟悉ICMP報(bào)文的結(jié)構(gòu),對(duì)ICMP協(xié)議有更好的理解和認(rèn)識(shí)。二課程設(shè)計(jì)要求: 設(shè)計(jì)程序,其功能是發(fā)送ICMP數(shù)據(jù)包,以

2、獲取指定網(wǎng)段中的活動(dòng)主機(jī),并將結(jié)果顯示在標(biāo)準(zhǔn)輸出上。 程序的具體要求如下:1) 用命令行形式運(yùn)行: scanhost Start_IP End_IP其中scanhost為程序名;Start_IP為被搜索網(wǎng)段的開始IP地址;End_IP為被搜索網(wǎng)段的結(jié)束IP地址。2輸出格式為: 活動(dòng)主機(jī)1 活動(dòng)主機(jī)2 三相關(guān)知識(shí):編制程序前首先要對(duì)ICMP報(bào)文的格式有一定的了解,ICMP報(bào)文是在IP數(shù)據(jù)報(bào)內(nèi)部傳輸?shù)模浣Y(jié)構(gòu)如圖10-1所示: IP數(shù)據(jù)報(bào) IP首部 ICMP報(bào)文ICMP報(bào)文的格式如圖10-2所示:0 7 8 15 16 31位類型字段代碼字段校驗(yàn)和字段不同類型和代碼有不同內(nèi)容所有報(bào)文的前4個(gè)字節(jié)都

3、是一樣的,但是其它字節(jié)那么互不相同。其中類型字段可以有15個(gè)不同的值,以描述特定類型的ICMP報(bào)文,某些ICMP報(bào)文還使用代碼字段的值來進(jìn)一步描述不用的條件。按驗(yàn)和字段為2字節(jié),校驗(yàn)的范圍是整個(gè)ICMP報(bào)文。檢驗(yàn)和是必須的,其計(jì)算方法與IP協(xié)議頭部校驗(yàn)和的計(jì)算方法一樣。 各種類型的ICMP報(bào)文如圖10-3所示ICMP報(bào)文類型,不同類型由報(bào)文中的類型字段和代碼字段來共同決定。類 型 代 碼 描 述 0 0 回送響應(yīng)PING應(yīng)答3 目的不可達(dá)0 網(wǎng)絡(luò)不可達(dá)1 主機(jī)不可達(dá)2 協(xié)議不可達(dá)3 端口不可達(dá)4 需要進(jìn)行分片但設(shè)置了禁止分片比特5 源主機(jī)選擇路由失敗6 無法識(shí)別目的網(wǎng)絡(luò)7 無法識(shí)別目的主機(jī)8

4、源主機(jī)被隔離9 目的網(wǎng)絡(luò)被禁止10 目的主機(jī)被禁止11 由于效勞類型TOS,網(wǎng)絡(luò)不可達(dá)12 由于效勞類型TOS,主機(jī)不可達(dá)13 由于過濾,通信被強(qiáng)行禁止14 主機(jī)越權(quán)15 優(yōu)先權(quán)終止生效 4 0 源端被關(guān)閉根本流控制5 重定向0 對(duì)網(wǎng)絡(luò)重定向1 對(duì)主機(jī)重定向2 對(duì)效勞類型和網(wǎng)絡(luò)重定向3 對(duì)效勞類型和主機(jī)重定向 8 0 回送請(qǐng)求PING請(qǐng)求9 0 路由器通告10 0 路由器請(qǐng)求11 超時(shí)0 傳輸期間生存期減為01 數(shù)據(jù)報(bào)組裝期間生存期減為012 參數(shù)問題0 各種IP頭部錯(cuò)誤1 缺少必須的選項(xiàng)13 0 時(shí)間戳請(qǐng)求14 0 時(shí)間戳應(yīng)答15 0 信息請(qǐng)求已作廢16 0 信息應(yīng)答已作廢17 0 地址掩碼

5、請(qǐng)求18 0 地址掩碼應(yīng)答10-3 ICMP報(bào)文類型本課程設(shè)計(jì)的目的是發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī),就是使用ICMP的回送和回送響應(yīng)消息發(fā)現(xiàn)網(wǎng)絡(luò)中的活動(dòng)主機(jī),即Ping消息的請(qǐng)求和應(yīng)答。那幺,發(fā)送的ICMP的數(shù)據(jù)包類型設(shè)置為回送請(qǐng)求類型號(hào)為8。四課程設(shè)計(jì)分析: 本程序使用原始套接字生成ICMP報(bào)文來進(jìn)行活動(dòng)主機(jī)的探查。這個(gè)程序使用的是回送請(qǐng)求與應(yīng)答消息。程序的大致思想是把ICMP的數(shù)據(jù)包類型設(shè)置為回送請(qǐng)求,將它發(fā)送給網(wǎng)絡(luò)上的一個(gè)IP地址,如果這個(gè)IP地址已經(jīng)被占用的話,那幺使用位于這個(gè)IP地址的主機(jī)上的TCP/IP軟件就能夠接收到這個(gè)ICMP回送請(qǐng)求,從而返回一個(gè)ICMP回送響應(yīng)類型號(hào)為0信息。信息封

6、裝在一個(gè)IP包中,我們需要解析該IP包,從中找到ICMP數(shù)據(jù)信息。相反,如果這個(gè)IP地址沒有人使用,那幺發(fā)送的ICMP回送請(qǐng)求在設(shè)定的延時(shí)內(nèi)就不可能得到響應(yīng)。 在初始化原始套接字之后,本程序就要開始在一個(gè)IP網(wǎng)段內(nèi)尋找活動(dòng)主機(jī)。因?yàn)橐獙ふ业闹鳈C(jī)可能很多,為節(jié)省時(shí)間可以采用多線程編程。下面接結(jié)合核心代碼對(duì)程序的具體實(shí)現(xiàn)進(jìn)行講解,同時(shí)為使程序流程更加清晰,去掉了錯(cuò)誤檢查等保護(hù)性代碼。1.使用原始套接字 為了實(shí)現(xiàn)發(fā)送/監(jiān)聽ICMP報(bào)文,必須使用原始套接字,創(chuàng)立原始套接字的代碼如下: socket sockRaw; sockRaw = WSAocket (AF_INET, sock_Raw, IPPR

7、OTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED); 在WSASocket函數(shù)中,我們使用IPPROTO_ICMP表示接收ICMP數(shù)據(jù)包,為了使用發(fā)送超時(shí)設(shè)置設(shè)置SO_RCVTIMEO或SO_SNDTIMEO,必須將標(biāo)志位置為WSA_FLAG_OVERLAPPED。然后調(diào)用setsockopt函數(shù)設(shè)置讀取延遲。 Int timeout=1000;Setsockopt(sockRaw,SQL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout);setsockopt(sockRaw,SQL_socket,SO_S

8、NDTIMEO,(char*)&timeout,sizeof(timeout) 在setsockopt函數(shù)中,sockRaw是之前創(chuàng)立的原始套接字,設(shè)置SQL_SOCKET說明使用根本套接字處理ICMP報(bào)文。設(shè)置SO_RCVTIMEO表示使用接收超時(shí)設(shè)置,SO_SNDTIMEO表示使用發(fā)送超時(shí)設(shè)置,在這里,超時(shí)時(shí)間均設(shè)置為1000ms。 2定義IP頭部和ICMP頭部的數(shù)據(jù)結(jié)構(gòu) 由于socket發(fā)送/捕獲的是IP包,因此要分別定義IP頭部的數(shù)據(jù)結(jié)構(gòu)ICMP頭部數(shù)據(jù)結(jié)構(gòu)。 /IP報(bào)頭的數(shù)據(jù)結(jié)構(gòu) typedef struct iphdrunsigned int headlen:4; /IP頭

9、長度unsigned int version:4; /IP版本號(hào)unsigned char tos; /效勞類型unsigned short totallen; /IP包總長度 unsigned short id; /ID號(hào)unsigned short flag; /標(biāo)記unsigned char ttl; /生存時(shí)間unsigned char prot; /協(xié)議UDP TCPnsigned short checksum; /校驗(yàn)和unsigned int sourceIP; /源IPunsigned int destIP; /目的IPIpHeader;/ICMP頭部的數(shù)據(jù)結(jié)構(gòu)typedef

10、struct icmphdr BYTE type; /ICMP類型碼,回送請(qǐng)求的類型碼為8 BYTE code; /子類型碼,保存與特定ICMP報(bào)文類型相關(guān)細(xì)節(jié)信息 USHORT checksum; /校驗(yàn)和 USHORT id; /ICMP報(bào)文ID號(hào)一般用進(jìn)程號(hào)作ID USHORT seq; /ICMP數(shù)據(jù)報(bào)的序列號(hào)IcmpHeader;3填充并發(fā)送回送請(qǐng)求類型的ICMP報(bào)文 為了使收到數(shù)據(jù)包的目的主機(jī)發(fā)送響應(yīng),我們需要向目的主機(jī)發(fā)送回送請(qǐng)求類型的ICMP報(bào)文。從圖10-3中可知,回送請(qǐng)求的類型號(hào)為8。因此ICMP報(bào)文的填充代碼如下:#define ICNP_ECHO 8 /請(qǐng)求回送#def

11、ine DEF_PACKET_SIZE 32 /缺省數(shù)據(jù)報(bào)長度#define MAX_PACKET 1024 /最大數(shù)據(jù)塊長度char icmp_dataMAX_PACKET; /ICMP數(shù)據(jù)報(bào)最大可能的長度memset(icmp_data,0,MAX_PACKET); /將數(shù)據(jù)報(bào)清空初始化int datasize=DEF_PACKET_SIZE; /ICMP數(shù)據(jù)報(bào)報(bào)文體的缺省長度datasize+=sizeof(IcmpHeader); /再加上ICMP頭部的長度IcmpHeader*icmp_hdr:Char *datapart;Icmp_hdr = (IcmpHeader*)icmp_d

12、ata;Icmp_hdr->type = ICMP_ECHO; /設(shè)置類型Icmp_hdr->id = (USHORT)GetCurrentThreadId(); /設(shè)置其ID號(hào)為當(dāng)前線程號(hào)Datapart = icmp_data + sizeof(IcmpHeader); /計(jì)算出數(shù)據(jù)報(bào)的數(shù)據(jù)局部Memset(datapart,A,datasize-sizeof(IcmpHeader); /填入數(shù)據(jù)(IcmpHeader*)icmp_data)->seq= 0; /序列號(hào)為0(IcmpHeader*)icmp_data)->checksum = 0; /先將校驗(yàn)和置0

13、(IcmpHeader*)icmp_data)->checksum = checksum(USHORT*)icmp_data,datasize);checksum為校驗(yàn)和的函數(shù),設(shè)校驗(yàn)和初值為0 ,然后對(duì)數(shù)據(jù)每16為求異或,結(jié)果取反,便得校驗(yàn)和。其代碼如下: USHORT checksum(USHORT *buffer, int size) 計(jì)算校驗(yàn)和 unsigned long cksum = 0; while(size>1) cksum+=*buffer+; size -=sizeof(USHORT);if(size) cksum += UCHAR*buffer; cksum

14、= (cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >> 16);return(USHORT)(-cksum); 填充ICMP報(bào)文之后,應(yīng)在ICMP報(bào)文之前加上IP報(bào)頭并發(fā)送出去??烧{(diào)用下面的代碼發(fā)送數(shù)據(jù)包。注意,這里的DEST是填入目的主機(jī)IP地址的一個(gè)sockaddr_in數(shù)據(jù)結(jié)構(gòu),IPSTRING是目的主機(jī)的IP地址字符串。 Struct sockaddr_in dest; dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr(IP_STRING)

15、; /填入搜索的IP地址 sendto(sockRaw,icmp_data,datasize,0,(sockaddr*)&dest,sizeof(dest);如果所Ping的目的主機(jī)所在,那么它會(huì)發(fā)送一個(gè)回送應(yīng)答包。這是一個(gè)IP包,收到后解析此數(shù)據(jù)包并獲取其中的ICMP信息。根據(jù)IP報(bào)頭信息中的IP報(bào)頭長度字段,就可以得到ICMP報(bào)文的真實(shí)地址。ICMP數(shù)據(jù)包中的IP地址就是活動(dòng)主機(jī)的IP。代碼如下: #define ICMP_MIN 8 /ICMP報(bào)文頭長度最小ICMP報(bào)文長度 #define MAX_PING_PACKET_SIZE (MAX_PACKET + SIZEOF(IPH

16、eader) char *recvbuf=new charMAX_PING_PACKET_SIZE; /保證大與發(fā)送包的大小 /from是一個(gè)sockaddr_in數(shù)據(jù)結(jié)構(gòu),用于保存響應(yīng)的目的的主機(jī)的地址 struct sockaddr_in from; int fromlen = sizeof(from); int bytes = recvfrom(sockRaw,recvbuf,MAX_PACKET, 0,(struck sockaddr*)&from),&fromlen); IpHeader *iphdr; IcmpHeader *icmphdr; Unsigned sh

17、ort iphdrlen; Iphdr=(Ipheader *)buf; Iphdrlen = iphdr->headlen*4 ; /IP報(bào)頭的長度 Icmphdr=(Icmpheader *)(buf+iphdrlen); /跳過IP報(bào)頭 /數(shù)據(jù)包太短,丟棄 if(bytes<iphdrlen+ICMP_MIN) return; /不是回送響應(yīng)Ping應(yīng)答,丟棄 if(icmphdr->type !=ICMP_ECHO_REPLY) return; /Id號(hào)不相符,丟棄 if(icmphdr->id!=(USHOT)GetCurrentThreadId() retu

18、rn; /輸出正在使用的IP地址。 Cout<<活動(dòng)主機(jī):<<inet_ntoa(from->sin_addr)<<endl;五程序流程圖:一個(gè)用多線程實(shí)現(xiàn)的程序在第三局部中給出課程設(shè)計(jì)分析中的第三局部,以下分別是子程序流程圖和主程序流程圖程序見附錄:1子程序流程圖:開 始填充ICMP數(shù)據(jù)報(bào)發(fā)送數(shù)據(jù)報(bào)接收數(shù)報(bào)去掉IP報(bào)頭,獲取ICMP信息數(shù)據(jù)包太短? Y N不是回送響應(yīng)? Y NID不符合? Y N輸出數(shù)據(jù)報(bào)中的IP地址 結(jié) 束2主程序流程圖:開 始將Start_IP添入到dest中起始IP地址Start_IP結(jié)束IP地址End_IP建立并初始化目的主

19、機(jī)的Sockaddr_in數(shù)據(jù)結(jié)構(gòu)dest構(gòu)造原始套接字,并初始化Start_IPEnd_IP? N Y Y線程數(shù)目太多?等待一定時(shí)間 N創(chuàng)立一個(gè)線程并執(zhí)行Start_IP+ Y 還有線程在執(zhí)行?等待一定時(shí)間 N結(jié) 束 六程序運(yùn)行結(jié)果截圖: 七課程設(shè)計(jì)心得:附錄:參考文獻(xiàn)源代碼:#pragma pack(4)/#include "stdafx.h"#pragma comment (lib,"Ws2_32.lib")#define WIN32_LEAN_AND_MEAN#include <winsock2.h>#include <stdi

20、o.h>#include <stdlib.h>#include <iostream.h>#include <stdio.h>#include <sys/timeb.h>#include <time.h>typedef struct iphdrunsigned int headlen:4;unsigned int version:4;unsigned char tos;unsigned short totallen;unsigned short id;unsigned short falg;unsigned char ttl;un

21、signed char prot;unsigned short checksum;unsigned int sourceIP;unsigned int destIP;IpHeader;typedef struct icmphdrBYTE type;BYTE code;USHORT checksum;USHORT id;USHORT seg;IcmpHeader;#define ICMP_RCHO 8#define ICMP_RCHO_REPLY 0#defineICMP_MIN 8#define STATUS_FAILED 0xFFFF#defineDEF_PACKET_SIZE 32#def

22、ine MAX_PACKET 1024#define MAX_PING_PACKET_SIZE (MAX_PACKET+sizeof(IpHeader)void fill_icmp_data(char *,int);USHORT checksum(USHORT *,int);void decode_resp(char *,int,struct sockaddr_in *);DWORD WINAPI FindIP(LPVOID pIPAddrTemp);WSADATA wsaData;SOCKET sockRaw;struct sockaddr_in dest,from,end;int from

23、len =sizeof(from);char *recvbuf=new charMAX_PING_PACKET_SIZE;unsigned int addr=0;long ThreadNumCounter=0,ThreadNumLimit=20;long *aa=&ThreadNumCounter;void main(int argc,char *argv)/*if(argc!=3)cout<<"輸入格式錯(cuò)誤: start_ip end_ip"<<endl;return;*/if(WSAStartup(MAKEWORD(2,1),&w

24、saData)!=0)cout<<"WASStartup failed"<<GetLastError()<<endl;ExitProcess(STATUS_FAILED);sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(sockRaw=INVALID_SOCKET)cout<<"WASSocketet() falied"<<WSAGetLastError()<<endl;Ex

25、itProcess(STATUS_FAILED);int timeout=1000;int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;ExitProcess(STATUS_FAILED); timeout=1000; bread=setsockopt(

26、sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout); if(bread=SOCKET_ERROR)cout<<"FAILED TO SEY RECV TIMEOUT"<<WSAGetLastError()<<endl;ExitProcess(STATUS_FAILED);memset(&dest,0,sizeof(dest);unsigned long startIP,endIP;dest.sin_family=AF_INET;dest.sin_a

27、ddr.s_addr=inet_addr(argv1);startIP=inet_addr(argv1);end.sin_family=AF_INET;end.sin_addr.s_addr=inet_addr(argv2);endIP=inet_addr(argv2);HANDLE hThread;while(htonl(startIP)<=htonl(endIP)if(ThreadNumCounter>ThreadNumLimit)Sleep(5000);continue;DWORD ThreadID;sockaddr_in *pIPAddrTemp=new (sockaddr

28、_in);if(!pIPAddrTemp)cout<<"memory alloc failed"<<endl;return ;*pIPAddrTemp=dest;clock_t start;start=clock();hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID);long i=60000000L;while(i-);TerminateThread(hThread,0);InterlockedDecrement(aa);memset(&

29、from,0,sizeof(from);startIP=htonl(htonl(startIP)+1);dest.sin_addr.s_addr=startIP;while(ThreadNumCounter!=0)Sleep(2000);return;cout<<"error"<<endl;void fill_icmp_data(char *icmp_data,int datasize)IcmpHeader *icmp_hdr;char *datapart;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->ty

30、pe=ICMP_RCHO;icmp_hdr->id=(USHORT)GetCurrentThreadId();datapart=icmp_data+sizeof(IcmpHeader);memset(datapart,'A',datasize-sizeof(IcmpHeader);void decode_resp(char *buf,int bytes,struct sockaddr_in *from)IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr=(IpHeader*) buf;iphd

31、rlen=iphdr->headlen*4;icmphdr=(IcmpHeader *)(buf+iphdrlen);if(bytes<iphdrlen+ICMP_MIN)return;if(icmphdr->type!=ICMP_RCHO_REPLY)return;if(icmphdr->id!=(USHORT)GetCurrentThreadId()return;cout<<"活動(dòng)主機(jī): "<<endl;cout<<" "<<inet_ntoa(from->sin_addr

32、)<<endl;USHORT checksum(USHORT *buffer,int size)unsigned long cksum=0;while(size>1)cksum+=*buffer+;size-=sizeof(USHORT);if(size)cksum+=*(UCHAR*)buffer;cksum=(cksum>>16)+(cksum& 0xffff);cksum+=(cksum>>16);return (USHORT)(cksum);DWORD WINAPI FindIP(LPVOID pIPAddrTemp)InterlockedIncrement(aa);char icmp_dataMAX_PACKET;memset(icmp_data,0,MAX_PACKET);int datasize=DEF_PACKET_SIZE;datasize+=sizeof(IcmpHeader);fill_icmp_data(icmp_data,datasize);(Icmp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論