版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验报告实验名称:计算机网络课程设计学生姓名:xxxxxxxxxxxxxxx专业:xxxxxxxxxxxxxxx班级:xxxxxxxxxxxxxxx学号:xxxxxxxxxxxxxxx指导教师:xxxxxxxxxxxxxxx实验成绩:实验地点:实验时间:2016年5月6日一、实验目的与实验要求1、实验目的 将书本上抽象的概念与具体实现技术结合,通过网络软件编程的实践,深入理解理论课上学习到的ARP、IP、TCP等重要网络协议的原理,通过自己动手编程封装与发送这些数据包,加深对网络协议的理解,掌握协议帧的结构和工作原理及其对协议栈的贡献。2、实验要求 网络课程设计包含两个部分的内容: 题目一是数据包的封装发送和解析(ARP/IP/TCP),要求使用Winpcap技术和Socket技术,根据ARP/IP/TCP帧的结构,封装数据包发送到局域网中。另外要捕获网络中的TCP/IP/ARP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。 题目二是从可选题目中选择一个,可选题目均是网络应用小程序,要求小组使用网络编程技术设计并实现一个网络应用程序,加深对网络协议协的理解,并锻炼网络编程能力。二、实验设备(环境)及要求1、实验硬件设备:计算机型号:联想ThinkPadT430u处理器型号:Inteli5主频:1.8Hz网卡型号:(1)RealtekPCIeGBE(2)Broadcom802.11n2、实验软件要求:操作系统:Windows10应用软件:VisualStudio2015Pro3、小组成员及分工:三、实验内容与步骤1、实验1:数据包的封装发送和解析(ARP/IP/TCP)(1)实验内容程序目标:根据IP帧的结构,封装IP数据包发送到局域网中。并捕获网络中的IP数据包,解析数据包的内容,并将结果显示,并同时写入日志文件。程序功能:以命令行形式运行在标准输出中显示捕获的IP报文的首部字段的内容。使用winpcap访问网卡,手动封装定义IP首部的数据结构填充数据包,发送数据包,捕获数据包使用winpcap,捕获IP数据包(2)主要步骤总体设计:获取设备列表并打印,打开所选择的适配器;准备工作:定义ip相关的结构体、打开要存放结果的文件,设置过滤器,手写ip数据报(内容有无效的MAC源和目的地址,和均为本机地址的ip源地址和目的地址,即发给自己一个ip报文),设置抓到数据报的解析和输出到文件的操作函数(解析ip报,打印并写入文件:报文的版本、协议、源和目的地址等)。发包、抓包。分析获取的数据。具体实现:#defineHAVE_REMOTE#include"pcap.h"#include"remote-ext.h"#include"stdio.h"#include"stdlib.h"/*4字节的IP地址*/typedefstructip_address{ u_charbyte1; u_charbyte2; u_charbyte3; u_charbyte4;}ip_address;/*IPv4首部*/typedefstructip_header{ u_charver_ihl;//版本(4bits)+首部长度(4bits) u_chartos;//服务类型 u_shorttlen;//总长类型 u_shortidentification;//标识 u_shortflags_fo;//标志位+段偏移量 u_charttl;//存活时间 u_charproto;//协议 u_shortcrc;//首部校验和 ip_addressdaddr;//目的地址 ip_addresssaddr;//源地址 u_intop_pad;//选项与填充}ip_header;voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);/*packethandler函数原型*/voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data);intmain(){ pcap_if_t*alldevs; pcap_if_t*d; intinum; inti=0; pcap_t*adhandle; charerrbuf[PCAP_ERRBUF_SIZE]; u_intnetmask; charpacket_filter[]="ip";//抓包类型 structbpf_programfcode; pcap_dumper_t*dumpfile; /*获取本机设备列表*/ if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1) { fprintf(stderr,"Errorinpcap_findalldevs:%s\n",errbuf); exit(1); } /*打印适配器列表*/ for(d=alldevs;d;d=d->next) { printf("%d.%s",++i,d->name); if(d->description) printf("(%s)\n",d->description); else printf("(Nodescriptionavailable)\n"); } if(i==0) { printf("\nNointerfacesfound!MakesureWinPcapisinstalled.\n"); return-1; } printf("Entertheinterfacenumber(1-%d):",i); scanf("%d",&inum); if(inum<1||inum>i) { printf("\nInterfacenumberoutofrange.\n"); /*释放设备列表*/ pcap_freealldevs(alldevs); return-1; } /*跳转到选中的适配器*/ for(d=alldevs,i=0;i<inum-1;d=d->next,i++); /*打开设备*/ if((adhandle=pcap_open(d->name,//设备名 65536,//65535保证能捕获到不同数据链路层上每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS,//混杂模式 1000,//读取超时时间 NULL,//远程机器验证 errbuf//错误缓冲池 ))==NULL) { fprintf(stderr,"\nUnabletoopentheadapter.%sisnotsupportedbyWinPcap\n",d->name); /*释放设备列表*/ pcap_freealldevs(alldevs); return-1; } /*打开堆文件*/ dumpfile=pcap_dump_open(adhandle,"D:\\save.txt"); if(dumpfile==NULL) { fprintf(stderr,"\nErroropeningoutputfile\n"); return-1; } /*检查数据链路层,只考虑以太网*/ if(pcap_datalink(adhandle)!=DLT_EN10MB) { fprintf(stderr,"nThisprogramworksonlyonEthernetnetwords.n"); /*释放设备列表*/ pcap_freealldevs(alldevs); return-1; } if(d->addresses!=NULL) //获得接口第一个地址的掩码 netmask=((structsockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr; else //如果接口没有地址,那么我们假设一个C类的掩码 netmask=0xffffff; //编译过滤器 if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) { fprintf(stderr,"nUnabletocompilethepacketfilter.Checkthesyntax.n"); //释放设备列表 pcap_freealldevs(alldevs); return-1; } //设置过滤器 if(pcap_setfilter(adhandle,&fcode)<0) { fprintf(stderr,"nErrorsettingthefilter.n"); //释放设备列表 pcap_freealldevs(alldevs); return-1; } printf("\nlisteningon%s...\n",d->description); //释放设备列表 pcap_freealldevs(alldevs); /*手写数据包*/ u_charpacket[100]; /*假设在以太网上,设置MAC的目的地址为1:1:1:1:1:1*/ packet[0]=1; packet[1]=1; packet[2]=1; packet[3]=1; packet[4]=1; packet[5]=1; /*设置MAC的源地址为2:2:2:2:2:2*/ packet[6]=2; packet[7]=2; packet[8]=2; packet[9]=2; packet[10]=2; packet[11]=2; /*设置ip类型*/ packet[12]=0x08; packet[13]=0x00; packet[14]=0x45; packet[15]=0x20; packet[16]=0x00; packet[17]=0x28; packet[18]=0xcb; packet[19]=0x16; packet[20]=0x00; packet[21]=0x00; packet[22]=0x2e; packet[23]=0x06; packet[24]=0x3e; packet[25]=0xe6; packet[26]=0xc0;//192 packet[27]=0xa8;//168 packet[28]=0x01;//1 packet[29]=0x64;//100 packet[30]=0xc0; packet[31]=0xa8; packet[32]=0x01; packet[33]=0x64; packet[34]=0x8f; packet[35]=0x50; /*填充剩下的内容*/ for(i=36;i<100;i++) { packet[i]=i%256; } /*发送数据包*/ if(pcap_sendpacket(adhandle,packet,100/*size*/)!=0) { fprintf(stderr,"nErrorsendingthepacket:n",pcap_geterr(adhandle)); return0; }else{ printf("Sendsuccessed"); } /*开始捕获*/ pcap_loop(adhandle,0,packet_handler,(unsignedchar*)dumpfile);//回调方式捕获数据包 pcap_close(adhandle); return0;}/*每次捕获到数据包时,libpcap都会自动调用这个回调函数*/voidpacket_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data){ structtm*ltime; chartimestr[16]; ip_header*ih; u_intip_len; time_tlocal_tv_sec; //保存数据包到文件中 pcap_dump((u_char*)param,header,pkt_data); /*将时间戳转换成可识别的格式*/ local_tv_sec=header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime(timestr,sizeoftimestr,"%H:%M:%S",ltime); //打印数据包的时间戳和长度 printf("%s,%.6dlen:%d\n",timestr,header->ts.tv_usec,header->len); //获得IP数据包头部的位置 ih=(ip_header*)(pkt_data+14);//以太网头部长度 /*打印IP地址和UDP端口*/ printf("版本+首部长度:[%u]",ih->ver_ihl); printf("协议:[%u]",ih->proto); printf("首部校验和:[%u]",ih->crc); printf("目的地址:[%u.%u.%u.%u]",ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4);printf("源地址:[%u.%u.%u.%u]\n",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4); FILE*fp; fp=fopen("D:\\jiexi.txt","a+"); fprintf(fp,"解析结果:"); fprintf(fp,"版本+首部长度:[%u]",ih->ver_ihl); fprintf(fp,"协议:[%u]",ih->proto); fprintf(fp,"首部校验和:[%u]",ih->crc); fprintf(fp,"目的地址:[%u.%u.%u.%u]",ih->daddr.byte1,ih->daddr.byte2,ih->daddr.byte3,ih->daddr.byte4);fprintf(fp,"源地址:[%u.%u.%u.%u]\n",ih->saddr.byte1,ih->saddr.byte2,ih->saddr.byte3,ih->saddr.byte4); fclose(fp);}2、实验2:子网内文件传送(1)实验内容(明确的实验内容)设计并实现一个局域网内部的文件传送工具,使用TCP协议进行可靠文件传输。以图形界面运行,不同结点上文件自动同步(2)主要步骤(详细的实验步骤(系统/方法/算法等),图文结合)问题定义:实现一个局域网内的文件传送与聊天的软件需求分析:局域网内的文件传送应当具备以下功能:在线用户的及时发现和更新选择一对一或者一对多对话模式与选择用户进行聊天和文件传输用户下线通知与更新用户列表系统设计:参考飞鸽传书的实现原理,总结设计方案如下:架构设计:本系统采用本地应用程序设计,仅适用于在同一局域网的主机通信;互相发现:本系统运行时启动局域网广播线程,发出包含主机名称、主机IP以及新加入标识符的广播表明自己新加入;用户列表:监听到其他用户的广播信息后更新列表,显示当前在线的用户名和用户IP;更新列表:在系统退出时会广播本机信息,标识表明自己离开,其余在线用户接收到信息后更新提示该用户下线;选择用户:可以单独选择或者多项选择用户列表中的用户;发送消息:选择用户后,在输入框中输入聊天信息,点击“发送”按钮系统会发送UDP数据包给对应用户的ip地址,端口是8011;接受消息:系统实时监听8011端口以接受不同用户发来的消息并展示在聊天窗口中;发送文件:选择指定用户,点击“发送文件”按钮,选择本机相应文件后,与目标用户建立TCP连接,发送字节流。端口为8011;接受文件:监听到有TCP连接请求时建立实时连接,系统提示用户是否接收文件,选择接收后选择相应路径与文件名后进行接收,接收成功后再聊天窗口显示提示信息。详细设计:局域网用户列表的建立:软件启动后定时的使用UDP协议向55这个广播地址发送广播包,端口设置为8001。广播包内容包含主机名、IP、标识符等信息,已启动软件的用户通过8001端口收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、IP地址等信息,从而局域网内的本系统用户都能建立起用户列表;传送与接收信息:传送聊天信息时同样使用UDP协议,用户填写消息后点击按钮调用发送消息的函数,然后通过8011端口发送UDP包。系统在启动时通过开辟新线程来监听8011端口,时刻监听发送到本机的信息。发送文件:用户发送文件时建立一个带参数的线程来发送文件,调用相应的TCP发送函数来发送文件,使用的是8001端口,由于协议不同因此与之前的广播并不冲突;接收文件:软件启动时开启一个线程用来接收文件,此线程在正常工作条件下处于阻塞监听状态,直到收到建立TCP连接的请求,之后提示用户收到文件选择是否接受,之后选择保存路径,进行接收。用户离开:用户离线时发送一个离线广播包到55的8001端口,包中含有LEAVE的标识符,收到此广播包的用户,根据包中的IP地址删除用户列表中相应的用户信息,并在聊天窗口显示“XXX用户已经离开”;聊天记录保存:考虑到用户有保存聊天记录的需求,在聊天记录右侧点击“保存”按钮,可以将当前聊天记录保存为txt文件到用户指定目录中。或点击“清空”,清空当前用户聊天记录。具体实现:(C#)usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceIPMessage{publicpartialclassfrmMain:Form{//用户实体publicclassUser{privatestringlocalname;//用户名publicstringlocalName{get{returnlocalname;}set{localname=value;}}privatestringlocalip;//用户IPpublicstringlocalIP{get{returnlocalip;}set{localip=value;}}}//用户数组声明publicstaticList<User>Userslist=newList<User>();//获得本机名和本机IPpublicUsergetInfo(){Useru=newUser();stringlocalName=Dns.GetHostName();//获取主机名//Console.WriteLine("主机名:{0}",localName);u.localName=localName;IPHostEntrylocalHost=Dns.GetHostEntry(localName);//输出对应的IP地址IPAddresslocalIP=null;for(inti=0;i<localHost.AddressList.Length;i++){if(localHost.AddressList[i].AddressFamily==AddressFamily.InterNetwork){localIP=localHost.AddressList[i];break;}}u.localIP=localIP.ToString();returnu;}//发送广播消息publicvoidbroadMessage(){Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Parse("55"),8001);//设置Broadcast值为表示允许套接字发送广播消息,该值默认为不允许socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);Useru=getInfo();//标识符为NEWstringsend="NEW"+","+u.localName+","+u.localIP;byte[]sendM=System.Text.Encoding.Unicode.GetBytes(send);//byte[]sendIP=System.Text.Encoding.Unicode.GetBytes(u.localIP);while(isBroad){socket.SendTo(sendM,iep);Thread.Sleep(200);}//socket.SendTo(sendIP,iep);socket.Close();}publicvoidremove(Useru){Userslist.Remove(u);this.rbChatContent.AppendText("用户:"+u.localName+"离开"+"\n");this.lbUser.Items.Remove(u.localName+"|"+u.localIP);;}//接收广播消息publicvoidreciveBroad(){Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Any,8001);socket.Bind(iep);EndPointep=(EndPoint)iep;//System.Timers.Timert=newSystem.Timers.Timer(1000);//t.Elapsed+=newSystem.Timers.ElapsedEventHandler(theout);while(true){Byte[]getBytes=newbyte[1024];socket.ReceiveFrom(getBytes,refep);stringgetData=System.Text.Encoding.Unicode.GetString(getBytes);getData=getData.TrimEnd('\u0000');string[]sArray=getData.Split(',');//this.rbChatContent.AppendText("新上线用户:"+sArray[1]+"\n");if(sArray.Length>1){boolexist=false;if(Userslist!=null){foreach(UserusinUserslist){if(us.localIP==sArray[2]){exist=true;break;}}}if(exist==false&&sArray[0]=="NEW"){Useru=newUser();u.localName=sArray[1];u.localIP=sArray[2];if(u!=null){Userslist.Add(u);}this.rbChatContent.AppendText("新上线用户:"+u.localName+"\n");this.lbUser.Items.Add(u.localName+"|"+u.localIP);Thread.Sleep(100);}elseif(sArray[0]=="LEAVE"){Useru=newUser();u.localName=sArray[1];u.localIP=sArray[2];if(u!=null){Userslist.Remove(u);}this.rbChatContent.AppendText("用户:"+u.localName+"离开"+"\n");this.lbUser.Items.Remove(u.localName+"|"+u.localIP);}}Thread.Sleep(200);}}///<summary>///通过TcpClient满足多用户发送文件///</summary>///<paramname="ip"></param>publicvoidtcpSend(List<string>ips){FileStreamfs=newFileStream(filePath,FileMode.Open);foreach(stringipinips){TcpClientclient=newTcpClient();client.Connect(ip,8001);NetworkStreamns=client.GetStream();intsize=0;longlen=0;while(len<fs.Length){byte[]buffer=newbyte[1024];size=fs.Read(buffer,0,buffer.Length);ns.Write(buffer,0,size);len+=size;}fs.Flush();ns.Flush();fs.Close();ns.Close();}}///<summary>///使用TcpClient接收文件///</summary>publicvoidRecevieFile(){TcpListenerlistener=newTcpListener(IPAddress.Any,8001);listener.Start();while(true){try{intsize=0;intlen=0;TcpClientclient=listener.AcceptTcpClient();if(client.Connected){this.rbChatContent.AppendText("连接成功");}NetworkStreamstream=client.GetStream();if(stream!=null){DialogResultrs;rs=MessageBox.Show("你收到一个文件,是否接收?","提示",MessageBoxButtons.YesNo);if(rs==DialogResult.Yes){SaveFileDialogsfd=newSaveFileDialog();if(sfd.ShowDialog(this)==System.Windows.Forms.DialogResult.OK){stringfileSavePath=sfd.FileName;//获得用户保存文件的路径FileStreamfs=newFileStream(fileSavePath,FileMode.Create,FileAccess.Write);byte[]buffer=newbyte[1024];while((size=stream.Read(buffer,0,buffer.Length))>0){fs.Write(buffer,0,size);len+=size;}fs.Flush();stream.Flush();stream.Close();client.Close();this.rbChatContent.AppendText("文件接受成功"+fileSavePath+"\n");}}}}catch(Exceptionex){MessageBox.Show(ex.ToString());}}}///<summary>///主函数///</summary>publicfrmMain(){InitializeComponent();ThreadseThread=newThread(this.broadMessage);seThread.Start();ThreadreThread=newThread(this.reciveBroad);reThread.Start();ThreadrfThread=newThread(this.RecevieFile);rfThread.Start();ThreadrmThread=newThread(this.listenMsg);rmThread.Start();}//离开发送广播privatevoidfrmMain_FormClosing(objectsender,FormClosingEventArgse){isBroad=false;this.broadMessage();Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Parse("55"),8001);//设置Broadcast值为表示允许套接字发送广播消息,该值默认为不允许socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);Useru=getInfo();//标识符为LEAVEstringsend="LEAVE"+","+u.localName+","+u.localIP;byte[]sendM=System.Text.Encoding.Unicode.GetBytes(send);//byte[]sendIP=System.Text.Encoding.Unicode.GetBytes(u.localIP);socket.SendTo(sendM,iep);//socket.SendTo(sendIP,iep);socket.Close();System.Environment.Exit(0);}//文件路径publicstringfilePath=null;privatevoidbtnSendFile_Click(objectsender,EventArgse){if(this.lbUser.SelectedItem==null){MessageBox.Show("请选择用户");}else{OpenFileDialogfile1=newOpenFileDialog();if(file1.ShowDialog()==DialogResult.OK){List<string>ips=newList<string>();foreach(objectobjinthis.lbUser.SelectedItems){stringgetData=null;getData=obj.ToString();string[]arrays=null;arrays=getData.Split('|');filePath=file1.FileName;if(arrays[1]!=null){ips.Add(arrays[1]);}}this.rbChatContent.AppendText("发送文件:"+filePath+"\n");//带参数的线程建立ThreadStartstarter=delegate{this.tcpSend(ips);};newThread(starter).Start();}}}publicvoidSendMessage(){if(this.tbSend.Text.Trim()==String.Empty){MessageBox.Show("请输入你的消息!");}elseif(this.lbUser.SelectedIndex==-1){MessageBox.Show("请选择用户!");}else{foreach(objectobjinlbUser.Items){stringgetdata=obj.ToString();string[]array=getdata.Split('|');Useru=newUser();u.localName=array[0];u.localIP=array[1];Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Parse(u.localIP),8011);Userlo=getInfo();stringsend=lo.localName+"|"+lo.localIP+"|"+this.tbSend.Text;byte[]sendM=null;sendM=System.Text.Encoding.Unicode.GetBytes(send);//byte[]sendIP=System.Text.Encoding.Unicode.GetBytes(u.localIP);socket.SendTo(sendM,iep);this.rbChatContent.AppendText("发给"+u.localName+":"+this.tbSend.Text+"\n");//socket.SendTo(sendIP,iep);socket.Close();}this.tbSend.Text="";this.tbSend.Focus();this.tbSend.Select(0,0);}}///<summary>///发送事件///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbtnSend_Click(objectsender,EventArgse){this.SendMessage();}//监听消息publicvoidlistenMsg(){Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Any,8011);socket.Bind(iep);EndPointep=(EndPoint)iep;while(true){Byte[]getBytes=newbyte[1024];socket.ReceiveFrom(getBytes,refep);stringgetData=null;getData=System.Text.Encoding.Unicode.GetString(getBytes);getData=getData.TrimEnd('\u0000');string[]sArray=getData.Split('|');if(sArray.Length>1){Useru=newUser();u.localName=sArray[0];u.localIP=sArray[1];this.rbChatContent.AppendText("来自"+u.localName+":"+sArray[2]+"\n");}Thread.Sleep(200);}}privatevoidbtnSave_Click(objectsender,EventArgse){if(this.rbChatContent.Text==String.Empty){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《生物化学脂代谢》课件
- 初航课件教学课件
- 《GT分流专项》课件
- 2024年新高一数学初升高衔接《函数的概念与性质》综合检测卷含答案解析
- 电子电路市场需求与消费特点分析
- 养蚕机器产品入市调查研究报告
- 胶束化妆水产业运行及前景预测报告
- 头靠家具市场发展现状调查及供需格局分析预测报告
- 滑板市场发展预测和趋势分析
- 塑料套管印字切割机市场洞察报告
- 《食品经营许可证》延续申请表
- 2022年国家公务员考试《行测》真题(行政执法)及答案解析
- 2024年山东省东营市中考语文试题含解析
- 2024年招商引资居间合同
- 食堂承包经营服务项目投标方案(技术方案)
- 2024年公开招聘事业单位工作人员报名登记表
- 2024-2030年中国冻干燕窝行业市场现状分析及竞争格局与投资发展研究报告
- 《电工与电子技术》课程标准
- 建设工程价款结算暂行办法-20220522094514
- 起重机柔性调速节能驱动系统
- 2024统编版新教材道德与法治七年级全册内容解读课件(深度)
评论
0/150
提交评论