




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、tcp/ip 协 议 编 程 大 作 业课题名称基于 tcp的网络通信专业计算机科学与技术班级计算机 1206 学号1030412612 学生姓名王 成 义物联网工程学院摘要此 tcp/ip 课程设计实现了基于tcp的客户 / 服务器通信程序, 具体实验过程通过有连接服务为主体,无连接服务为辅并利用事件对象i/o 管理来实现。客户机具有注册,登陆,单聊,私聊,在线人数列表,退出等功能。目录一、总体设计 . 4 1、基本通信协议选取. 4 2、通信过程设计. 4 3、通信过程数据包设计. 4 4、 程序流程图 . 5 二、客户端程序 . 6 1、功能: . 6 2、原理: . 6 3、程序清单
2、. 6 三、服务器端程序. 19 1、功能: . 19 2、原理: . 19 3、程序清单:. 19 四、运行结果 . 35 1、 服务器端截图. 35 2、客户端截图. 37 一、总体设计1、基本通信协议选取tcp (transmission control protocol)和 udp(user datagram protocol)协议属于传输层协议。 tcp提供 ip 环境下的数据可靠传输, 它提供的服务包括数据流传送、 可靠性、有效流控、全双工操作和多路复用。 通过面向连接、端到端和可靠的数据包发送。而udp则不为 ip 提供可靠性、流控或差错恢复功能。 tcp对应的是可靠性要求高的应
3、用,而udp对应的则是可靠性要求低、传输经济的应用。本次实验基于 tcp/ip 协议利用事件对象i/o 管理实现基本的聊天功能,包括注册,登录,群聊,私聊及在线人数统计。2、通信过程设计2.1 客户端设计a. 本地服务器主要功能:1)接收远程服务器转发的消息并显示消息。b. 本地客户端主要功能:1)发送建立 tcp连接的请求操作;2)发送注册信息,登陆消息及退出请求;3)发送群聊消息,私聊消息,在线人数统计及退出请求。2.2 服务器端设计a. 远程服务端主要功能:1)监听客户端的连接请求;2)提供注册服务,验证登陆请求和验证功能;3)查看在线人数,发送在线状态;4)发送群聊消息及私聊消息。3、
4、通信过程数据包设计3.1 客户端数据包设计:a. 注册:0user( 用户名 ) password(密码) b. 登陆:1user( 用户名 ) password(密码) c. 聊天:0)群聊:2user( 用户名 ) str( 内容) 1)单聊:5str1( 单聊对象名 ) user( 用户名 ) * str( 内容) 2)在线用户4user( 用户名 ) str( 内容) 3)退出(登录):3user( 用户名 ) 3.2 服务端数据包设计:a. 注册应答:00注册成功01注册失败用户名已存在b. 登陆应答:c. 聊天:1)单聊:61单聊对象不在线50单聊对象在线60单聊对象不存在2)群聊
5、:30广播消息31非正确用户的消息,不广播3)在线人数:40显示当前在线人数并发给查询客户4、程序流程图10登陆成功12用户名不存在11密码不正确1 该用户已登陆二、客户端程序1、功能:1.1 注册:向服务器发送注册信息。然后接收服务器返回的应答信息。1.2 登陆:向服务器发送登陆信息。接收服务器返回的应答信息。1.3 聊天:登陆成功后 , 选择群聊或单聊进行聊天,选择在线用户可进行查询当前在线用户,选择退出可退出登录。a. 单聊:从在线用户中选择一个,与其单聊b. 群聊:向所有在线的用户发送消息c. 退出聊天:退出此次聊天,但不断开连接d. 退出登陆,断开连接,退出时不需要发送下线信息,直接
6、退出1.4 面向连接的客户 / 服务器程序工作模型:2、原理:客户机在注册或登陆时首先和服务器连接,注册完或登陆失败断开连接,登陆成功不断开连接,使用send 和 recv 发送接收数据,根据上述的数据报的定义,发送相应的数据报。3、程序清单3.1 客户端接收器(本地服务器)代码#include #include #include #include #pragma comment(lib,ws2_32.lib) #define default_port 5051/for recv #define buffer_length 1000 void mysendmessage(socket ssoc
7、ket,char *response,int responselen, struct sockaddr* cli,int clilen); void main() int iport=default_port; wsadata wsadata; socket ssocket,wchyssocket; int ilen,wchyilen; int isend; int irecv; char send_buf1000; char recv_bufbuffer_length; struct sockaddr_in ser,cli,wchy; printf(-n); printf(cserver w
8、aitingn); printf(-n); if(wsastartup(makeword(2,2),&wsadata)!=0) printf(failed to load winsock.n);return; ssocket=socket(af_inet,sock_dgram,0); if(ssocket=invalid_socket)printf(socket()faild:%dn,wsagetlasterror();return; ser.sin_family=af_inet; ser.sin_port=htons(iport); ser.sin_addr.s_addr=htonl
9、(inaddr_any); if(bind(ssocket,(lpsockaddr)&ser,sizeof(ser)=socket_error) printf(bind()faild:%dn,wsagetlasterror();return; ilen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf); while(1) / 接收数据包确定 cli 表示 cli存有客户端发来的 ip和 port irecv=recvfrom(ssocket,recv_buf,buffer_length,0,(sockaddr*)&cli,&
10、ilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetlasterror();return; else if(irecv=0) break; else / 接收到了正确数据/printf(+%sn,recv_buf); / 控制信息的种类有00 01 10 11 12 20 21 30 31 /00注册成功 01 注册失败 10 登陆成功 11.12表示登陆失败 20表示一次成功会话 21 表示错误会话 30 表示成功推出 31表示错误推出switch(recv_buf0) case 0: if(recv_buf1=0)p
11、rintf(注册成功 n); else printf(注册失败 n); break; case 1: if(recv_buf1=0) printf(登陆成功 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();retur
12、n; wchyilen=sizeof(wchy); strcpy(send_buf,#); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); else if(recv_buf1=) printf(已经在其他地方登陆n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,s
13、ock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,*); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); else printf(登陆失败 n); wchy.sin_family=af_inet; wchy.sin_port=htons(505
14、3); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyil
15、en); break; case 2: printf(群聊%sn,recv_buf+2); break; case 4: printf(在线用户列表: %sn,recv_buf+2); break; case 5: printf(单聊); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socke
16、t()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,%); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); printf(%sn,recv_buf+2); break; case 6: if(recv_buf1=0) printf(单聊对象不存在 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053);
17、wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen);
18、 else if(recv_buf1=1) printf(单聊对象未在线 n); wchy.sin_family=af_inet; wchy.sin_port=htons(5053); wchy.sin_addr.s_addr=inet_addr(127.0.0.1); wchyssocket=socket(af_inet,sock_dgram,0); if(wchyssocket=invalid_socket) printf(socket()failed:%dn,wsagetlasterror();return; wchyilen=sizeof(wchy); strcpy(send_buf,
19、&); mysendmessage(wchyssocket,send_buf,sizeof(send_buf),(struct sockaddr*)&wchy,wchyilen); break; closesocket(ssocket); wsacleanup(); void mysendmessage(socket ssocket,char *response,int responselen, struct sockaddr* cli,int clilen) int isend; /int sendto ( socket s , const void * msg, int l
20、en, unsigned int flags, const struct sockaddr * to , int tolen ) ; isend=sendto(ssocket,response,responselen,0,(sockaddr*)cli,clilen); / isend=sendto(sclient,send_buf,sizeof(send_buf),0,(struct sockaddr*)&ser,ilen); if(isend=socket_error) printf(sendto()failed.:%dn,wsagetlasterror(); else if(ise
21、nd=0) ; else /printf(sendto() succeeded !n); /printf(-n); 3.1 客户端代码#include #include #include #pragma comment(lib, ws2_32.lib) #define buffer_size 1024 void mysendmessage(socket ssocket,char *response,int responselen); int main(int argc, char *argv) wsadata wsadata; sockaddr_in ser,cli; socket sclie
22、nt,wchysclient; int ilen,wchyilen; int irecv; char send_buf1000; char recv_bufbuffer_size; if (wsastartup(makeword(2, 2), &wsadata) != 0) printf(wsastartup()n); return 0; printf( 手动连接模式中.n); char szserver256; / 连接的服务器地址,ip地址printf( 请输入即将连接的服务器ip地址 :); gets(szserver); ser.sin_family = af_inet; se
23、r.sin_port = htons(5050); ser.sin_addr.s_addr = inet_addr(szserver); char user20,password20; char str100,str1100,wchystr100; bool haslogin=false; / 只能绑定一次,开始放在了循环里,555 wchysclient=socket(af_inet,sock_dgram,0); if(wchysclient=invalid_socket)printf(socket()faild:%dn,wsagetlasterror();return 0; cli.sin
24、_family=af_inet; cli.sin_port=htons(5053); cli.sin_addr.s_addr=htonl(inaddr_any); if(bind(wchysclient,(lpsockaddr)&cli,sizeof(cli)=socket_error) printf(bind()faild:%dn,wsagetlasterror();return 0; wchyilen=sizeof(cli); memset(recv_buf,0,sizeof(recv_buf); sclient = socket(af_inet, sock_stream, 0);
25、 if (sclient = invalid_socket) printf(socket()n); return 0; if (connect(sclient, (sockaddr*)&ser, sizeof(ser) = invalid_socket) printf(socket()n); return 0; else bool haslogin=false; while(!haslogin) printf(-n); printf(0. 注册 n); printf(1. 登陆 n); printf(2. 退出 n); printf( 请输入相应的数字:n); scanf(%s,&am
26、p;str); switch(str0) case 0: printf( 用户名: ); scanf(%s,user); printf( 密码: ); scanf(%s,password); strcpy(send_buf,0); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,password); mysendmessage(sclient, send_buf, sizeof(send_buf); break; case 1: printf( 用户名: ); scanf(%s,user); printf( 密码:); sca
27、nf(%s,password); strcpy(send_buf,1); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,password); mysendmessage(sclient, send_buf, sizeof(send_buf); irecv=recvfrom(wchysclient,recv_buf,buffer_size,0,(sockaddr*)&cli,&wchyilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetl
28、asterror();return 0; else if(irecv=0) break; else / 接收到了正确数据printf(recv:%sn,recv_buf); if(recv_buf0=&recv_buf1=) haslogin=0; system(cls); printf( 登录失败!请重新登录或注册后登录_n); if(recv_buf0=*&recv_buf1=*) haslogin=0; system(cls); printf( 已经在其他地方登陆n); printf( 登录失败!请重新选择用户登录或注册后登录_n); if(recv_buf0=#&
29、;recv_buf1=#) haslogin=1; system(cls); printf( 登录成功 _n); bool wchyhaslogin=false; while(!wchyhaslogin) printf(-n); printf(0. 群聊 n); printf(1. 单聊 n); printf(2. 在线用户 n); printf(3. 退出 n); printf( 请输入相应的数字:n); scanf(%s,&wchystr); switch(wchystr0) case 0: wchyhaslogin=1; printf( 输入 exit 退出。 n); print
30、f(-n); while(wchyhaslogin) printf(); scanf(%s,&str); if(strcmp(str,exit)!=0) strcpy(send_buf,2); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,str); mysendmessage(sclient, send_buf, sizeof(send_buf); else system(cls); wchyhaslogin=0; break; case 1: wchyhaslogin=1; printf( 请输入单聊对象的用户名
31、:); scanf(%s,&str1); strcpy(send_buf,5); strcat(send_buf,str1); strcat(send_buf,); strcat(send_buf,user); strcat(send_buf,*); strcat(send_buf,_welcome_to_single_chat.); mysendmessage(sclient, send_buf, sizeof(send_buf); irecv=recvfrom(wchysclient,recv_buf,buffer_size,0,(sockaddr*)&cli,&w
32、chyilen); if(irecv=socket_error) printf(recvfrom()faild:%dn,wsagetlasterror();return 0; else if(irecv=0) break; else / 接收到了正确数据/printf(recv:%sn,recv_buf); if(recv_buf0=&recv_buf1=) wchyhaslogin=0; system(cls); printf( 单聊对象不存在,退出了单聊模式n); if(recv_buf0=&recv_buf1=&) wchyhaslogin=0; system(c
33、ls); printf( 单聊对象未在线,退出了单聊模式n); if(recv_buf0=%&recv_buf1=%) printf( 输入 exit 退出。 n); printf(-n); while(wchyhaslogin) printf(); scanf(%s,&str); if(strcmp(str,exit)!=0) strcpy(send_buf,5); strcat(send_buf,str1); strcat(send_buf,); strcat(send_buf,user); strcat(send_buf,*); strcat(send_buf,str);
34、 mysendmessage(sclient, send_buf, sizeof(send_buf); else system(cls); wchyhaslogin=0; break; case 2: strcpy(send_buf,4); strcat(send_buf,user); strcat(send_buf,); strcat(send_buf,str); mysendmessage(sclient, send_buf, sizeof(send_buf); system(cls); break; case 3: strcpy(send_buf,3); strcat(send_buf,
35、user); strcat(send_buf,); mysendmessage(sclient, send_buf, sizeof(send_buf); haslogin=0; wchyhaslogin=1; system(cls); break; default: system(cls); printf( 请输入正确信息n); break; break; case 2: exit(0); break; default: system(cls); printf( 请输入正确信息); system(pause); closesocket(sclient); wsacleanup(); retur
36、n 0; void mysendmessage(socket ssocket,char *response,int responselen) int isend; isend=send(ssocket,response,responselen,0); if(isend=socket_error) printf(send()failed.:%dn,wsagetlasterror(); else if(isend=0) ; else /printf(send() succeeded !n); printf(-n); 三、服务器端程序1、功能:1.1 接收客户机发来的注册信息,给客户注册。其中注册的
37、信息记录在当前文件夹下的config.txt中,注册时,检查用户名是否已存在。如果注册信息合格,那么将用户名和密码记录在文件中。向客户机发送注册结果。1.2 接收客户机发来的登陆信息。获取用户名和密码,在文件中查找用户名和密码是否合法。如果合法,开始聊天。否则,返回错误信息。用户登陆成功后,选择群聊或单聊进行聊天,选择在线用户可进行查询当前在线用户,选择退出可退出登录。1.3 接收客户机发来的聊天信息。将聊天信息转发给所有在线的ip 。其中聊天信息有两类:a)单聊:客户机指定在线用户中的一个用户名,与其进行聊天。b)群聊:客户机向所有在线的用户发送消息。1.4 面向连接的客户 / 服务器程序工
38、作模型:2、原理:服务器使用事件对象i/o 模式,监听套接口开启监听,创建事件,注册接收连接事件和关闭套接口事件。发生接收连接事件后,创建新事件,注册读事件和关闭套接口事件, 保存响应的套接字, 客户机的 ip ,是否登陆等必要信息。3、程序清单:3.1 头文件/deal.h int finduser(userdata *data,int num,char *name) int i; for(i=0;iusername)=0) return i; return -1; void deal(char *str,userdata *data,int &num,char *response,
39、char *ip) char userusernamelen; char passpasswordlen; / 第一位字符是功能号/ 0 注册/ 1 登陆/ 2 会话/ 3 退出int i,t; if(str0=0) / 注册的消息格式为 0+name+password for(i=1;iusername,user); strcpy(datanum-password,pass); datanum-log=0; memset(datanum-ip,0,sizeof(datanum-ip); printf(%s 用户注册成功 n,user); /-注册完成/ 返回成功信息strcpy(respon
40、se,00);/第一位是功能号第二位是状态号 0表示成功 1 表示失败savedata(data,num); else /fail printf(%s 用户注册失败 n,user); /-注册失败strcpy(response,01); else if(str0=1) / 登陆的消息格式为 1+name+password for(i=1;ipassword); if(strcmp(pass,datat-password)=0 & datat-log=0) / 密码验证成功printf(%s 登陆成功 n,user); datat-log=1; strcpy(datat-ip,ip);
41、strcpy(response,10); else if(strcmp(pass,datat-password)=0 & datat-log=1) printf(%s 已经在其他地方登陆 n,user); strcpy(response,1); else printf(%s 登陆密码错误 n,user); strcpy(response,11); else printf(%s 用户不存在,登陆失败n,user); strcpy(response,12); else if(str0=2) / 会话的消息格式为 2+name+(message) for(i=1;iusername,user
42、)=0 & strcmp(datat-ip,ip)=0) / 表示确实是正确用户发来的会话strcpy(response,20); strcat(response,user); strcat(response,:); strcat(response,str+i+1); printf(%s:%sn,user,str+i+1); else strcpy(response,21); printf(非正确用户发来会话,不予处理!n); else if(str0=3) / 会话的消息格式为 3+name+(message) for(i=1;iusername,user)=0 & strc
43、mp(datat-ip,ip)=0) / 表示确实是正确用户发来的会话strcpy(response,30); datat-log=0; memset(datat-ip,0,sizeof(datat-ip); printf(%s 退出n,datat-username); else strcpy(response,31); printf(非正确用户发来会话,不予处理!); else if(str0=4) for(i=1;istrlen(str);i+) if(stri=) break; stri=0; strcpy(response,40); for(i=0;ilog=1) printf(%s%
44、s在线 n,datai-username,datai-ip); /printf(%sn,datai-username); strcat(response,datai-username); strcat(response, ); else /printf(%s,datai-ip); else if(str0=5) for(i=1;istrlen(str);i+) if(stri=) break; stri=0; strcpy(user,str+1); printf(%s 用户接收 n,user); strcpy(pass,str+i+1); for(i=1;ilog=0) strcpy(resp
45、onse,61); printf(%s 未在线 n,user); else if(datat-log=1) strcpy(response,50); strcat(response,pass); strcat(response,:); strcat(response,pass+i+1); printf(%s:%sn,pass,pass+i+1); printf(%s 在线,可进行聊天 n,user); void mysendmessage(int ssocket,char *response,int responselen,sockaddr* cli,int clilen) int isend
46、; isend=sendto(ssocket,response,responselen,0,(sockaddr*)cli,clilen); if(isend=socket_error) printf(sendto()failed.:%dn,wsagetlasterror(); else if(isend=0) ; else /printf(sendto() succeeded !n); /printf(-n); /init.h #include #include /for main.cpp(1.cpp) #define default_port 5051/for recv #define de
47、fault_portsend 5052/for send #define buffer_length 1000 const bool debug=0; #define maxuser 1000 /-/ / 当程序遇到异常而结束时会示出错误而退出/-/ / 成员结构信息#define usernamelen 200 #define passwordlen 200 typedef struct char username200; char password200; bool log;/是否登陆char ip20; userdata; /-/ #define thefile config.txt /
48、 初始化用户数据导入bool initdata(userdata *s,int num,int &p)/成功返回 true 发生错误返回false /-/ / 读取文件信息并返回file *fp; char userbufusernamelen; char passbufpasswordlen; fp=fopen(thefile,r); if(!fp) if(debug) printf(config文件不存在 n); else if(debug) printf(find config.txtn); while(!feof(fp) /fgets(buf,sizeof(buf),fp);
49、fscanf(fp,%s,userbuf); fscanf(fp,%s,passbuf); if(debug) printf(+user:%s password:%sn,userbuf,passbuf); /add p+; sp=(userdata *)malloc(sizeof(userdata); if(!sp)printf(+error:malloc failed!n);return false; strcpy(sp-username,userbuf); strcpy(sp-password,passbuf); sp-log=0; memset(sp-ip,0,sizeof(sp-ip)
50、; fclose(fp); return true; bool savedata(userdata *userdata,int userdatap) file *fp; /建立配置文件fp=fopen(thefile,w); if(!fp)printf(+error:无法创建 config文件! );return false; int i; for(i=0;iusername,userdatai-password); if(i!=userdatap)fprintf(fp,n); fclose(fp); 3.2 服务器主函数#include #include #include #pragma c
51、omment(lib,ws2_32.lib) #includeinit.h #includedeal.h / userdata *userdatamaxuser; int userdatap=-1; #define buffer_size 2048 void compressarrays(wsaevent events, socket sockets, dword *total, int index) for (size_t i = index + 1; i wsa_maximum_wait_events) printf(too many connections); closesocket(a
52、ccept); break; newevent = wsacreateevent(); if (newevent = wsa_invalid_event) printf(wsacreateevent()n); break; wsaeventselect(accept, newevent, fd_read | fd_write | fd_close); eventarrayeventtotal = newevent; socketarrayeventtotal = accept; cliarrayeventtotal = cli; eventtotal+; printf(socket %d co
53、nnectedn, accept); / 一下处理 fd_read 通知if (networkevents.lnetworkevents & fd_read) if (networkevents.ierrorcodefd_read_bit != 0) wsacloseevent(eventarrayindex - wsa_wait_event_0); printf(fd_read failed with error %dn, networkevents.ierrorcodefd_read_bit); break; / 从套接口读入数据int irecv = recv(socketarr
54、ayindex - wsa_wait_event_0, buffer, sizeof(buffer), 0); if (irecv = 0) break; else if (irecv = socket_error) printf(recv()n); break; else / 请求端 ip ser.sin_addr.s_addr=inet_addr(inet_ntoa(cliarrayindex - wsa_wait_event_0.sin_addr); printf(accepted client ip:%s,port:%dn, inet_ntoa(cliarrayindex - wsa_wait_event_0.sin_addr),ntohs(cliarrayindex - wsa_wait_event_0.sin_port); printf(recv:%sn,buffer); memset(response,0,sizeof(response); deal(buffer,userdata,userdatap,response,inet_ntoa(cliarrayindex - wsa_wait_event
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 探秘文学巨著
- 外贸英文函电课件Unit10
- 四川外国语大学《德语视听》2023-2024学年第一学期期末试卷
- 苏州工艺美术职业技术学院《园艺疗法》2023-2024学年第一学期期末试卷
- 江苏省建湖县2025届初三下学期期末仿真模拟生物试题含解析
- 上海市松江区市级名校2025年高三4月阶段性检测试题(模拟)数学试题试卷含解析
- 山东省泰安市新城实验中学2024-2025学年第五中考测评活动初三元月调考物理试题含解析
- 辽宁省大连市高新园区重点名校2025届初三第三次(4月)考试数学试题含解析
- 七台河职业学院《创新创业》2023-2024学年第二学期期末试卷
- 上海市黄埔区达标名校2024-2025学年初三毕业生3月学习质量检测试题语文试题试卷含解析
- -摩擦磨损试验机结构设计
- 高处安装维护拆除作业课件-改
- 6-1 矩形纯扭构件的破坏特征和承载力计算讲解
- 2024年新高考I卷语文试题及答案
- 网课智慧树知道《设计概论(武汉科技大学)》章节测试答案
- 文化资本理论
- 英语16种时态及练习题附答案
- 《致大海》00省公开课金奖全国赛课一等奖微课获奖课件
- 增城林场高质量水源林工程建设项目增城林场森林质量优化提升工程-中幼林抚育作业设计
- 地铁安检专业知识培训课件
- 数字贸易学 课件 第16章 智慧物流与海外仓
评论
0/150
提交评论