网络编程实验报告_第1页
网络编程实验报告_第2页
网络编程实验报告_第3页
网络编程实验报告_第4页
网络编程实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE1程序实践报告一、程序实践概述1、题目名称:Linux程序设计基础2、时间进度:2012年6月19日到2012年7月5日3、开发环境:Ubunto10.04二、问题分析1、功能说明:①编程实现快速排序算法;②实现文本文件拷贝函数copy(f_source,f_target);即实现如下功能: $./copyf1f2以上程序执行后当前目录会形成一个新的文件f2,且其内容与f1完全一致。③编写一个程序,要求:输入N个学生的学号和成绩,并保存在stu.txt文本文件中,对学生成绩进行排序并把排序后的结果输出到score.txt文件中,同时在屏幕上输出高于平均成绩的学生的学号和成绩。④编写一个程序找出串str1和串str2的所有最长公共子串。2、解决方案:(1)将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)定义文件指针FILE*fp;表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。(3)创建一个结构体储存学生的学号和成绩,利用文件操作写入文档。对成绩进行排序,将大于平均成绩的输出到屏幕。(4)创建两个数组,搜索字符串,寻找最大的匹配子串。三、方案设计1、模块结构: 模块功能图和模块描述(1)在a[left..right]中任选一个记录作为基准,以此基准将当前无序区划分为左、右两个较小的子区间a[left..pivotpos-1)和a[pivotpos+1..right],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为:a[left..pivotpos-1].keys≤a[pivotpos].key≤a[pivotpos+1..right].keys其中left≤pivotpos≤right。(2)fopen函数用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式)。其中,“文件指针名”必须是被说明为FILE类型的指针变量,“文件名”是被打开文件的文件名。“使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。fclose函数

调用的一般形式是:fclose(文件指针);正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。文件的读写对文件的读和写是最常用的文件操作。(3)创建一个结构体储存学生的学号和成绩,每个学生的信息都储存在一个数组里。利用文件操作写入文档。对成绩进行排序,更新数组信息,将大于平均成绩的输出到屏幕。(4)将两个字符串储存在数组里,从首地址开始查找相同字符。如果遇到相同字符则开始记录位置,从该位置开始计数,到不匹配位置。重新搜索,如果最大长度超过记录则更新。2、数据结构:(1)链表,递归(2)文件操作(3)文件操作,数组(4)数组3、总体流程:给出流程图(1)第一步:(初始化)设置两个指针i和j,它们的初值分别为区间的下界和上界,即i=low,i=high;选取无序区的第一个记录R[i](即R[low])作为基准记录,并将它保存在变量pivot中;第二步:令j自high起向左扫描,直到找到第1个关键字小于pivot.key的记录R[j],将R[j])移至i所指的位置上,这相当于R[j]和基准R[i](即pivot)进行了交换,使关键字小于基准关键字pivot.key的记录移到了基准的左边,交换后R[j]中相当于是pivot;然后,令i指针自i+1位置开始向右扫描,直至找到第1个关键字大于pivot.key的记录R[i],将R[i]移到i所指的位置上,这相当于交换了R[i]和基准R[j],使关键字大于基准关键字的记录移到了基准的右边,交换后R[i]中又相当于存放了pivot;接着令指针j自位置j-1开始向左扫描,如此交替改变扫描方向,从两端各自往中间靠拢,直至i=j时,i便是基准pivot最终的位置,将pivot放在此位置上就完成了一次划分。打开f1文件(2)打开f1文件打开f2文件,如果没有将创建打开f2文件,如果没有将创建打开成功打开成功将f1写入f2将f1写入f2关闭f1,f2文件关闭f1,f2文件从屏幕获取学生信息(3)从屏幕获取学生信息写入文件写入文件求取成绩平均值求取成绩平均值将学生按成绩排序将学生按成绩排序输出大于平均值的学生输出大于平均值的学生(4)找到第一个相等的字符,记录下位置。查找最大的相同字符,如果有大于前一次搜索的,则更新长度。4、关键算法:给出关键算法描述(1)voidquickSort(inta[],intleft,intright){inti,j,temp;i=left;j=right;temp=a[left];if(left>right)return;while(i!=j){while(a[j]>=temp&&j>i)j--;if(j>i)a[i++]=a[j];while(a[i]<=temp&&j>i)i++;if(j>i)a[j--]=a[i];}a[i]=temp;quickSort(a,left,i-1);quickSort(a,i+1,right);}(2)#include<stdio.h>voidmain(intargc,char*argv[]){FILE*f1,*f2;charc;f1=fopen(argv[1],"r");f2=fopen(argv[2],"w");while((c=getc(f1))!=EOF){printf("%c",c);putc(c,f2);}fclose(f1);fclose(f2);}(3)for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(stu[j].score>stu[j+1].score){temp.num=stu[j].num;temp.score=stu[j].score;stu[j].num=stu[j+1].num;stu[j].score=stu[j+1].score;stu[j+1].num=temp.num;stu[j+1].score=temp.score;}}}(4)for(i=1;i<=len1;++i){for(j=1;j<=len2;++j){if(str1[i-1]==str2[j-1]){gg[i][j]=gg[i-1][j-1]+1;max=gg[i][j]>max?gg[i][j]:max;}else{gg[i][j]=0;}}}for(i=len1+1;i>0;--i){for(j=len2+1;j>0;--j){if(gg[i][j]==max){str[max-1]=str2[j-1];max--;break;}}}程序实践概述1、题目名称:Socket编程基础(1)时间服务器(2)远程文件备份服务器2、时间进度:2012年6月19日到2012年7月5日3、开发环境: Ubuntu10.04二、问题分析1、功能说明:①编程实现时间服务器编写一个网络时间服务器timeserver,该服务器能应具有如下功能: 够为网络上的用户提供时间服务,即为网络用户返回服务器的当前时间; 记录发出请求的网络用户的IP地址(保存到文件中),格式如下:IP地址请求时间编写时间服务客户端timeclient,该客户端能够向服务器发送时间服务请求,并把获得的时间返回给用户。②编程实现远程文件备份服务器分别采用TCP或UDP协议编写一个远程数据备份服务器,运行客户端将本地文件备份到远程的服务器中。服务器的功能:接受客户端请求,把客户端的文件进行备份(可以备份到指定的文件夹)。客户端的功能:与远程服务器进行连接,在连接后把本地的文件发送给远程备份服务器。2、解决方案: 服务器端过程就是socket->bind->listen->accpet->Read,write而对于客户端则是socket->connect->read,write三、方案设计1、模块结构: 模块功能图和模块描述服务器端:

1、创建套接字;

使用socket()#include<sys/types.h>#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol)建立服务器端的socket套接字2、绑定套接字到一个IP地址和一个端口上;使用bind()#include<sys/types.h>#include<sys/socket.h>intbind(intsockfd,structsockaddr*myaddr,intaddrlen);3、将套接字设置为监听模式,以等待连接请求;使用listen()#include<sys/socket,h>intlisten(intsockfd,intbacklog)4、请求到来后,接受连接请求,并返回一个与此次连接对应的套接字;使用accept()#include<sys/socket.h>intaccept(intsockfd,structsockaddr*addr,int*addrlen)此时新建连接,并创建新的Socket套接字,此时addr为客户端的addr信息。5、用返回的套接字和客户端进行通信;使用recv()和send()intread(intfd,char*buf,intlen)intwrite(intfd,char*buf,intlen)6、关闭当前的连接,进入等待状态,继续等待客户端的连接;使用close()#include<unistd.h>intclose(intsockfd);7、关闭服务器端的套接字描述符;使用close()#include<unistd.h>intclose(intsockfd);客户端:1、创建客户端套接字;使用socket()#include<sys/types.h>#include<sys/socket.h>intsocket(intdomain,inttype,intprotocol)2、向服务器发出连接请求;使用connect()#include<sys/types.h>#include<sys/socket.h>intconnect(intsockfd,structsockaddr*servaddr,intaddrlen)其中参数servaddr指定远程服务器的套接字地址,包括服务器的IP地址和端口号3、和服务器端进行网络通信;使用recv()和send()intread(intfd,char*buf,intlen)intwrite(intfd,char*buf,intlen)4、关闭套接字;使用close()#include<unistd.h>intclose(intsockfd);2、数据结构:文件操作,socket总体流程:serverSSocket()BBind()Listen()clientListen()SSocket()Accept()Accept()建立连接C建立连接Connect()阻塞,直到客户端的连接到达Recv()Recv()Send()处理接收到的数据DatarequestDatarequestRecv()Recv()Send()DatareplyDatareplyClose()Close()Close()4、关键算法:给出关键算法描述1.Client: recv_msg=recv(sockfd,buf,20,0);//尝试接收数据 buf[recv_msg]='\0'; printf("received:%s\n",buf);server: while(1)//尝试获得数据 { sin_size=sizeof(structsockaddr_in); if((client_fd=accept(sockfd,(structsockaddr*)&remote_addr,&sin_size))==-1){ perror("accepterror"); continue; } t=time(NULL);2.client: fp=fopen(filename,"r");//打开文件 if(fp==-1)printf("openfileerror\n");fread(buf,sizeof(buf),1,fp);//读取文件fp=fopen("re","a");server:buf[recv_msg]="\0";printf("%s",buf);fwrite(buf,strlen(buf),1,fp);//写入文件 fcose(fp);一、程序实践概述1、题目名称:Libpcap开发包使用2、时间进度:2012年6月19日到2012年7月5日3、开发环境: Ubuntu10.04二、问题分析1、功能说明:(1)获取网络接口名字和掩码等信息(2)捕获数据包(单个数据包和多个数据包两种情况)(3)以太网数据报捕获(4)ARP数据包捕获2、解决方案:1、 打开、读取设备,设置过滤器部分。1.1pcap_read()1.2pcap_t*pcap_open_live(char*device,intsnaplen,intpromisc,intto_ms,char*errbuf);该函数用于获取一个抽象的包捕捉句柄,1.3intpcap_setfilter(pcap_t*p,structbpf_program*fp);该函数用于设置pcap_compile()解析完毕的过滤规则2、编译、优化、调试过滤规则表达式部分2.1intpcap_compile(pcap_t*p,structbpf_program*fp,char*str,intoptimize,bpf_u_int32netmask);该函数用于解析过滤规则串,填写bpf_program结构。3、脱机方式监听部分。3.1pcap_open_offline()3.2pcap_offline_read()4、本地网络设置检测部分。4.1char*pcap_lookupdev(char*errbuf);该函数返回一个网络设备接口名,4.2intpcap_lookupnet(char*device,bpf_u_int32*netp,bpf_u_int32*maskp,char*errbuf);该函数用于获取指定网络接口的IP地址、子网掩码。5.主控程序及版本部分6.关闭程序voidpcap_close(pcap_t*p)关闭句柄,释放资源三、方案设计1、模块结构: 模块功能图和模块描述(1)charerror_content[PCAP_ERRBUF_SIZE];

/*错误信息*/

structpcap_pkthdrprotocol_header;

/*数据包头*/

pcap_t*pcap_handle;

/*Libpcap句柄*/

structbpf_programbpf_filter;

/*bpf过滤规则*/

charbpf_filter_string[]="";

/*过滤规则*/

constu_char*packet_content;

/*数据包内容*/

bpf_u_int32net_mask;

/*网络掩码*/

bpf_u_int32net_ip;

/*网络地址*/

char*net_interface;

/*网络接口*/

net_interface=pcap_lookupdev(error_content);

/*获取网络接口*/

pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);

/*获取网络地址和掩码地址*/

pcap_handle=pcap_open_live(net_interface,

/*网络接口*/

BUFSIZ,

/*数据包大小*/

1,

/*混杂模式*/

0,

/*等待时间*/

error_content);/*错误信息*/

/*打开网络接口*/

pcap_compile(pcap_handle,

/*Libpcap句柄*/

&bpf_filter,

/*BPF过滤规则*/

bpf_filter_string,

/*BPF过滤规则字符串*/

0,

/*优化参数*/

net_ip);/*网络地址*/

/*编译过滤规则*/

pcap_setfilter(pcap_handle,

/*Libpcap句柄*/&bpf_filter);/*BPF过滤规则*/

/*设置过滤规则*/

packet_content=pcap_next(pcap_handle,

/*Libpcap句柄*/&protocol_header);/*数据包信息*/

/*捕获一个数据包,返回此数据包的内容*/

printf("Captureapacketfrom:%s\n",net_interface);

/*输出网络接口名字*/

printf("Thepacketlengthis:%d\n",protocol_header.len);

/*输出捕获的数据包的长度*/

pcap_close(pcap_handle);

/*关闭Libpcap操作*/

return0;

}(2)①intmain(){charerror_content[PCAP_ERRBUF_SIZE];structpcap_pkthdrprotocol_header;pcap_t*pcap_handle;structbpf_programbpf_filter;charbpf_filter_string[]="";constu_char*packet_content;bpf_u_int32net_mask;bpf_u_int32net_ip;char*net_interface;net_interface=pcap_lookupdev(error_content);pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);pcap_handle=pcap_open_live(net_interface, BUFSIZ, 1, 0, error_content);pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);pap_setfilter(pcap_handle, &bpf_filter);packet_content=pcap_next(pcap_handle, &protocol_header);printf("Captureapacketfrom:%s\n",net_interface);printf("Thepacketlengthis:%d\n",protocol_header.len);pcap_close(pcap_handle);}②voidmain(){pcap_t*pcap_handle;charerror_content[PCAP_ERRBUF_SIZE];char*net_interface;structbpf_programbpf_filter;charbpf_filter_string[]="ip";bpf_u_int32net_mask;bpf_u_int32net_ip;net_interface=pcap_lookupdev(error_content);pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);pcap_handle=pcap_open_live(net_interface, BUFSIZ, 1, 0, error_content);pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);pcap_setfilter(pcap_handle, &bpf_filter);pcap_loop(pcap_handle, 10, callback, NULL);pcap_close(pcap_handle);}(3)structether_header{u_int8_tether_dhost[6];u_int8_tether_shost[6];u_int16_tether_type;};voidmain(){charerror_content[PCAP_ERRBUF_SIZE];pcap_t*pcap_handle;constu_char*packet_content;u_char*mac_string;u_shortethernet_type;bpf_u_int32net_mask;bpf_u_int32net_ip;char*net_interface;structpcap_pkthdrprotocol_header;structbpf_programbpf_filter;structether_header*ethernet_protocol;charbpf_filter_string[]="ip";net_interface=pcap_lookupdev(error_content);pcap_lookupnet(net_interface, &net_ip,&net_mask,error_content);pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,0,error_content);pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);pcap_setfilter(pcap_handle,&bpf_filter);if(pcap_datalink(pcap_handle)!=DLT_EN10MB)return;packet_content=pcap_next(pcap_handle,&protocol_header);printf("CaptureaPacketfromnet_interface:\n");printf("%s\n",net_interface);printf("CaptureTimeis:\n");printf("%s",ctime((consttime_t*)&protocol_header.ts.tv_sec));printf("PacketLengthis:\n");printf("%d\n",protocol_header.len);ethernet_protocol=(structether_header*)packet_content;printf("Ethernettypeis:\n");ethernet_type=ntohs(ethernet_protocol->ether_type);printf("%04x\n",ethernet_type);switch(ethernet_type){case0x0800:printf("thenetworklayerisIPprotocol\n");break;case0x0806:printf("thenetworklayerisARPprotocol\n");break;case0x8035:printf("thenetworklayerisRARPprotocol\n");break;default:break;}printf("MacSourceAddressis:\n");mac_string=ethernet_protocol->ether_shost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));printf("MacDesinationAddressis:\n");mac_string=ethernet_protocol->ether_dhost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));pcap_close(pcap_handle);}(4)structether_header{u_int8_tether_dhost[6];u_int8_tether_shost[6];u_int16_tether_type;};typedefu_int32_tint_addr_t;structin_addr{int_addr_ts_addr;};structarp_header{u_int16_tarp_hardware_type;u_int16_tarp_protocol_type;u_int8_tarp_hardware_length;u_int8_tarp_protocol_length;u_int16_tarp_operation_code;u_int8_tarp_source_ethernet_address[6];u_int8_tarp_source_ip_address[4];u_int8_tarp_destination_ethernet_address[6];u_int8_tarp_destination_ip_address[4];};voidarp_protocol_packet_callback(u_char*argument,conststructpcap_pkthdr*packet_header,constu_char*packet_content){structarp_header*arp_protocol;u_shortprotocol_type;u_shorthardware_type;u_shortoperation_code;u_char*mac_string;structin_addrsource_ip_address;structin_addrdestination_ip_address;u_charhardware_length;u_charprotocol_length;printf("ARPProtocol(NetworkLayer)\n");arp_protocol=(structarp_header*)(packet_content+14);hardware_type=ntohs(arp_protocol->arp_hardware_type);protocol_type=ntohs(arp_protocol->arp_protocol_type);operation_code=ntohs(arp_protocol->arp_operation_code);hardware_length=arp_protocol->arp_hardware_length;protocol_length=arp_protocol->arp_protocol_length;printf("ARPHardwareType:%d\n",hardware_type);printf("ARPProtocolType:%d\n",protocol_type);printf("ARPHardwareLength:%d\n",hardware_length);printf("ARPProtocolLength:%D\n",protocol_length);printf("ARPOperation:%d\n",operation_code);switch(operation_code){case1:printf("ARPRequestProtocol\n");break;case2:printf("ARPReplyProtocol\n");break;case3:printf("RARPRequestProtocol\n");break;case4:printf("RARPReplyProtocol\n");break; default:break;}printf("EthernetSourceAddressis:\n");mac_string=arp_protocol->arp_source_ethernet_address;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));memcpy((void*)&source_ip_address,(void*)&arp_protocol->arp_source_ip_address,sizeof(structin_addr));printf("SourceIPAddress:%s\n",inet_ntoa(source_ip_address));printf("EthernetDestinationAddressis:\n");mac_string=arp_protocol->arp_destination_ethernet_address;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));memcpy((void*)&destination_ip_address,(void*)&arp_protocol->arp_destination_ip_address,sizeof(structin_addr));printf("DestinationIPAddress:%s\n",inet_ntoa(destination_ip_address));}voidethernet_protocol_packet_callback(u_char*argument,conststructpcap_pkthdr*packet_header,constu_char*packet_content){u_shortethernet_type;structether_header*ethernet_protocol;u_char*mac_string;staticintpacket_number=1;printf("the%dARPpacketiscaptured.\n",packet_number);printf("EthernetProtocol(LINKLayer)");ethernet_protocol=(structether_header*)packet_content;printf("Ethernettypeis:\n");ethernet_type=ntohs(ethernet_protocol->ether_type);printf("%04x\n",ethernet_type);switch(ethernet_type){case0x0800:printf("layerisip\n");break;case0x0806:printf("layerisARP\n");break;case0x8035:printf("layerisRARP\n");break;default:break;}printf("MacSourceAddressis:\n");mac_string=ethernet_protocol->ether_shost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));printf("MacdestinationAddressis:\n");mac_string=ethernet_protocol->ether_dhost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));switch(ethernet_type){case0x0806:arp_protocol_packet_callback(argument,packet_header,packet_content);break;default:break;}packet_number++;}intmain(){pcap_t*pcap_handle;charerror_content[PCAP_ERRBUF_SIZE];char*net_interface;structbpf_programbpf_filter;charbpf_filter_string[]="arp";bpf_u_int32net_mask;bpf_u_int32net_ip;net_interface=pcap_lookupdev(error_content);pcap_lookupnet(net_interface,&net_ip,&net_mask,error_content);pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,0,error_content);pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,net_ip);pcap_setfilter(pcap_handle,&bpf_filter);if(pcap_datalink(pcap_handle)!=DLT_EN10MB)return;pcap_loop(pcap_handle,-1,ethernet_protocol_packet_callback,NULL);pcap_close(pcap_handle);return0;}2、数据结构:libpcap总体流程:给出流程图打开、读取设备,设置过滤器部分打开、读取设备,设置过滤器部分编译、优化、调试过滤规则表达式部分编译、优化、调试过滤规则表达式部分脱机方式监听部分脱机方式监听部分本地网络设置检测部分本地网络设置检测部分主控程序及版本部分主控程序及版本部分关闭句柄,释放资源关闭句柄,释放资源4、关键算法:给出关键算法描述(1)charerror_content[PCAP_ERRBUF_SIZE];structin_addrnet_ip_address;获得ip地址structin_addrnet_mask_address;获得子网掩码char*net_interface;char*net_ip_string;char*net_mask_string;(2)捕获一个数据包:packet_content=pcap_next(pcap_handle,&protocol_header);捕获多个数据包:pcap_loop(pcap_handle, 10, callback, NULL);(3)ethernet_type=ntohs(ethernet_protocol->ether_type);printf("%04x\n",ethernet_type);switch(ethernet_type){case0x0800:printf("thenetworklayerisIPprotocol\n");break;case0x0806:printf("thenetworklayerisARPprotocol\n"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论