




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、可靠數(shù)據(jù)傳輸協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)1、實(shí)驗(yàn)?zāi)康睦斫饪煽繑?shù)據(jù)傳輸?shù)幕驹?;掌握停等協(xié)議的工作原理;在理解停等協(xié)議的基礎(chǔ)上,理解滑動(dòng)窗口協(xié)議的基本原理;掌握gbn的工作原理;掌握基于udp設(shè)計(jì)并實(shí)現(xiàn)一個(gè)gbn協(xié)議的過(guò)程與技術(shù)。2、實(shí)驗(yàn)環(huán)境 接入internet的實(shí)驗(yàn)主機(jī); windows xp或windows 7/8; 開(kāi)發(fā)語(yǔ)言:c/c+(或java)等。3、實(shí)驗(yàn)內(nèi)容1) 基于udp設(shè)計(jì)一個(gè)簡(jiǎn)單的停等協(xié)議;2) 引入滑動(dòng)窗口技術(shù),改進(jìn)停等協(xié)議,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的gbn協(xié)議;2) 模擬引入數(shù)據(jù)包的丟失,驗(yàn)證所設(shè)計(jì)協(xié)議的有效性;3) 改進(jìn)所設(shè)計(jì)的gbn協(xié)議,支持雙向數(shù)據(jù)傳輸;(選作內(nèi)容,加分項(xiàng)目,可以當(dāng)堂完成
2、或課下完成)4)將所設(shè)計(jì)的gbn協(xié)議改進(jìn)為sr協(xié)議。(選作內(nèi)容,加分項(xiàng)目,可以當(dāng)堂完成或課下完成)4、實(shí)驗(yàn)方式每位同學(xué)上機(jī)實(shí)驗(yàn),實(shí)驗(yàn)指導(dǎo)教師現(xiàn)場(chǎng)指導(dǎo)。5、實(shí)驗(yàn)要點(diǎn)1) 深刻理解停等協(xié)議與gbn協(xié)議的區(qū)別;2) 基于udp實(shí)現(xiàn)的gbn協(xié)議,可以不進(jìn)行差錯(cuò)檢測(cè),可以利用udp協(xié)議差錯(cuò)檢測(cè);3) 自行設(shè)計(jì)數(shù)據(jù)幀的格式,應(yīng)至少包含序列號(hào)seq和數(shù)據(jù)兩部分;4) 自行定義發(fā)送端序列號(hào)seq比特?cái)?shù)l以及發(fā)送窗口大小w,應(yīng)滿足條件w+1=2l。5) 一種簡(jiǎn)單的服務(wù)器端計(jì)時(shí)器的實(shí)現(xiàn)辦法:設(shè)置套接字為非阻塞方式,則服務(wù)器端在recvfrom方法上不會(huì)阻塞,若正確接收到ack消息,則計(jì)時(shí)器清零,若從客戶端接收數(shù)據(jù)
3、長(zhǎng)度為-1(表示沒(méi)有接收到任何數(shù)據(jù)),則計(jì)時(shí)器+1,對(duì)計(jì)時(shí)器進(jìn)行判斷,若其超過(guò)閾值,則判斷為超時(shí),進(jìn)行超時(shí)重傳。(當(dāng)然,如果服務(wù)器選擇阻塞模式,可以用到select或epoll的阻塞選擇函數(shù),詳情見(jiàn)msdn)6) 為了模擬ack丟失,一種簡(jiǎn)單的實(shí)現(xiàn)辦法:客戶端對(duì)接收的數(shù)據(jù)幀進(jìn)行計(jì)數(shù),然后對(duì)總數(shù)進(jìn)行模n運(yùn)算,若規(guī)定求模運(yùn)算結(jié)果為零則返回ack,則每接收n個(gè)數(shù)據(jù)幀才返回1個(gè)ack。當(dāng)n取值大于服務(wù)器端的超時(shí)閥值時(shí),則會(huì)出現(xiàn)服務(wù)器端超時(shí)現(xiàn)象。7) 當(dāng)設(shè)置服務(wù)器端發(fā)送窗口的大小為1時(shí),gbn協(xié)議就是停-等協(xié)議。6、參考內(nèi)容作為只實(shí)現(xiàn)單向數(shù)據(jù)傳輸?shù)膅bn協(xié)議,實(shí)質(zhì)上就是實(shí)現(xiàn)為一個(gè)c/s應(yīng)用。服務(wù)器端:使
4、用udp協(xié)議傳輸數(shù)據(jù)(比如傳輸一個(gè)文件),等待客戶端的請(qǐng)求,接收并處理來(lái)自客戶端的消息(如數(shù)據(jù)傳輸請(qǐng)求),當(dāng)客戶端開(kāi)始請(qǐng)求數(shù)據(jù)時(shí)進(jìn)入“偽連接”狀態(tài)(并不是真正的連接,只是一種類似連接的數(shù)據(jù)發(fā)送的狀態(tài)),將數(shù)據(jù)打包成數(shù)據(jù)報(bào)發(fā)送,然后等待客戶端的ack信息,同時(shí)啟動(dòng)計(jì)時(shí)器。當(dāng)收到ack時(shí),窗口滑動(dòng),正常發(fā)送下一個(gè)數(shù)據(jù)報(bào),計(jì)時(shí)器重新計(jì)時(shí);若在計(jì)時(shí)器超時(shí)前沒(méi)有收到ack,則全部重傳窗口內(nèi)的所以已發(fā)送的數(shù)據(jù)報(bào)??蛻舳耍菏褂胾dp協(xié)議向服務(wù)器端請(qǐng)求數(shù)據(jù),接收服務(wù)器端發(fā)送的數(shù)據(jù)報(bào)并返回確認(rèn)信息ack(注意gbn為累積確認(rèn),即若ack=1和3,表示數(shù)據(jù)幀2已經(jīng)正確接收),必須能夠模擬ack丟失直至服務(wù)器端超時(shí)
5、重傳的情況。(1) 服務(wù)器端設(shè)計(jì)參考1)命令解析為了測(cè)試客戶端與服務(wù)器端的通信交互,方便操作,設(shè)置了此過(guò)程。首先,服務(wù)器接收客戶端發(fā)來(lái)的請(qǐng)求數(shù)據(jù),“-time”表示客戶端請(qǐng)求獲取當(dāng)前時(shí)間,服務(wù)器回復(fù)當(dāng)前時(shí)間;“-quit”表示客戶端退出,服務(wù)器回復(fù)“good bye!”;“-testgbn”表示客戶端請(qǐng)求開(kāi)始測(cè)試gbn協(xié)議,服務(wù)器開(kāi)始進(jìn)入gbn傳輸狀態(tài);其他數(shù)據(jù),則服務(wù)器直接回復(fù)原數(shù)據(jù)。2)數(shù)據(jù)傳輸數(shù)據(jù)幀格式定義在以太網(wǎng)中,數(shù)據(jù)幀的mtu為1500字節(jié),所以u(píng)dp數(shù)據(jù)報(bào)的數(shù)據(jù)部分應(yīng)小于1472字節(jié)(除去ip頭部20字節(jié)與udp頭的8字節(jié)),為此,定義udp數(shù)據(jù)報(bào)的數(shù)據(jù)部分格式為:seq為1個(gè)字
6、節(jié),取值為0255,(故序列號(hào)最多為256個(gè));data1024個(gè)字節(jié),為傳輸?shù)臄?shù)據(jù);最后一個(gè)字節(jié)放入eof0,表示結(jié)尾。3)源代碼#include stdafx.h /創(chuàng)建vs項(xiàng)目包含的預(yù)編譯頭文件#include #include #include #include #pragma comment(lib,ws2_32.lib)#define server_port12340/端口號(hào)#define server_ip0.0.0.0/ip地址const int buffer_length = 1026;/緩沖區(qū)大小,(以太網(wǎng)中udp的數(shù)據(jù)幀中包長(zhǎng)度應(yīng)小于1480字節(jié))const int se
7、nd_wind_size = 10;/發(fā)送窗口大小為10,gbn中應(yīng)滿足 w + 1 tm_year + 1900,p-tm_mon,p-tm_mday,p-tm_hour,p-tm_min,p-tm_sec);strcpy_s(ptime,sizeof(buffer),buffer);/*/ method: seqisavailable/ fullname: seqisavailable/ access: public / returns: bool/ qualifier: 當(dāng)前序列號(hào) curseq 是否可用/*bool seqisavailable()int step;step = cur
8、seq - curack;step = step = 0 ? step : step + seq_size;/序列號(hào)是否在當(dāng)前發(fā)送窗口之內(nèi)if(step = send_wind_size)return false;if(ackcurseq)return true;return false;/*/ method: timeouthandler/ fullname: timeouthandler/ access: public / returns: void/ qualifier: 超時(shí)重傳處理函數(shù),滑動(dòng)窗口內(nèi)的數(shù)據(jù)幀都要重傳/*void timeouthandler()printf(timer
9、out error.n);int index;for(int i = 0;i send_wind_size;+i)index = (i + curack) % seq_size;ackindex = true;totalseq -= send_wind_size;curseq = curack;/*/ method: ackhandler/ fullname: ackhandler/ access: public / returns: void/ qualifier: 收到ack,累積確認(rèn),取數(shù)據(jù)幀的第一個(gè)字節(jié)/由于發(fā)送數(shù)據(jù)時(shí),第一個(gè)字節(jié)(序列號(hào))為0(ascii)時(shí)發(fā)送失敗,因此加一了,此處
10、需要減一還原/ parameter: char c/*void ackhandler(char c)unsigned char index = (unsigned char)c - 1; /序列號(hào)減一printf(recv a ack of %dn,index);if(curack = index)for(int i= curack; i = index;+i)acki = true;curack = (index + 1) % seq_size;else/ack超過(guò)了最大值,回到了curack的左邊f(xié)or(int i = curack;i seq_size;+i)acki = true;fo
11、r(int i = 0; i= index;+i)acki = true;curack = index + 1;/主函數(shù)int main(int argc, char* argv)/加載套接字庫(kù)(必須)word wversionrequested;wsadata wsadata;/套接字加載時(shí)錯(cuò)誤提示int err;/版本2.2wversionrequested = makeword(2, 2);/加載dll文件scoket庫(kù) err = wsastartup(wversionrequested, &wsadata);if(err != 0)/找不到winsock.dllprintf(wsas
12、tartup failed with error: %dn, err);return -1;if(lobyte(wsadata.wversion) != 2 | hibyte(wsadata.wversion) !=2) printf(could not find a usable version of winsock.dlln);wsacleanup();elseprintf(the winsock 2.2 dll was found okayn);socket sockserver = socket(af_inet, sock_dgram,ipproto_udp);/設(shè)置套接字為非阻塞模式
13、int imode = 1; /1:非阻塞,0:阻塞ioctlsocket(sockserver,fionbio, (u_long far*) &imode);/非阻塞設(shè)置sockaddr_in addrserver;/服務(wù)器地址/addrserver.sin_addr.s_un.s_addr = inet_addr(server_ip);addrserver.sin_addr.s_un.s_addr = htonl(inaddr_any);/兩者均可addrserver.sin_family = af_inet;addrserver.sin_port = htons(server_port)
14、;err = bind(sockserver,(sockaddr*)&addrserver, sizeof(sockaddr);if(err)err = getlasterror();printf(could not bind the port %d for socket.error code is %dn,server_port,err);wsacleanup();return -1;sockaddr_in addrclient;/客戶端地址int length = sizeof(sockaddr);char bufferbuffer_length; /數(shù)據(jù)發(fā)送接收緩沖區(qū)zeromemory
15、(buffer,sizeof(buffer);/將測(cè)試數(shù)據(jù)讀入內(nèi)存std:ifstream icin;icin.open(./test.txt);char data1024 * 113;zeromemory(data,sizeof(data);icin.read(data,1024 * 113);icin.close();totalpacket = sizeof(data) / 1024;int recvsize ;for(int i=0; i seq_size; +i)acki = true;while(true)/非阻塞接收,若沒(méi)有收到數(shù)據(jù),返回值為-1recvsize = recvfro
16、m(sockserver,buffer,buffer_length,0,(sockaddr*)&addrclient),&length);if(recvsize 0)sleep(200);continue;printf(recv from client: %sn,buffer);if(strcmp(buffer,-time) = 0)getcurtime(buffer);else if(strcmp(buffer,-quit) = 0)strcpy_s(buffer,strlen(good bye!) + 1,good bye!);else if(strcmp(buffer,-testgbn)
17、 = 0)/進(jìn)入gbn測(cè)試階段/首先server(server處于0狀態(tài))向client發(fā)送205狀態(tài)碼(server進(jìn)入1狀態(tài))/server 等待client回復(fù)200狀態(tài)碼,如果收到(server進(jìn)入2狀態(tài)),則開(kāi)始傳輸文件,否則延時(shí)等待直至超時(shí)/在文件傳輸階段,server發(fā)送窗口大小設(shè)為zeromemory(buffer,sizeof(buffer);int recvsize;int waitcount = 0;printf(begain to test gbn protocol,please dont abort the processn);/加入了一個(gè)握手階段/首先服務(wù)器向客戶端
18、發(fā)送一個(gè)205大小的狀態(tài)碼(我自己定義的)表示服務(wù)器準(zhǔn)備好了,可以發(fā)送數(shù)據(jù)/客戶端收到205之后回復(fù)一個(gè)200大小的狀態(tài)碼,表示客戶端準(zhǔn)備好了,可以接收數(shù)據(jù)了/服務(wù)器收到200狀態(tài)碼之后,就開(kāi)始使用gbn發(fā)送數(shù)據(jù)了printf(shake hands stagen);int stage = 0;bool runflag = true;while(runflag)switch(stage)case 0:/發(fā)送205階段buffer0 = 205;sendto(sockserver, buffer, strlen(buffer)+1, 0, (sockaddr*)&addrclient, size
19、of(sockaddr);sleep(100);stage = 1;break;case 1:/等待接收200階段,沒(méi)有收到則計(jì)數(shù)器+1,超時(shí)則放棄此次“連接”,等待從第一步開(kāi)始recvsize = recvfrom(sockserver,buffer,buffer_length,0,(sockaddr*)&addrclient),&length);if(recvsize 20)runflag = false;printf(timeout errorn);break;sleep(500);continue;elseif(unsigned char)buffer0 = 200)printf(be
20、gin a file transfern);printf(file size is %db, each packet is 1024b and packet total num is %dn,sizeof(data),totalpacket);curseq = 0;curack = 0;totalseq = 0;waitcount = 0;stage = 2;break;case 2:/數(shù)據(jù)傳輸階段if(seqisavailable()/發(fā)送給客戶端的序列號(hào)從1開(kāi)始buffer0 = curseq + 1;ackcurseq = false;/數(shù)據(jù)發(fā)送的過(guò)程中應(yīng)該判斷是否傳輸完成/為簡(jiǎn)化過(guò)程此
21、處并未實(shí)現(xiàn)memcpy(&buffer1,data + 1024 * totalseq,1024);printf(send a packet with a seq of %dn,curseq);sendto(sockserver, buffer, buffer_length, 0, (sockaddr*)&addrclient, sizeof(sockaddr);+curseq;curseq %= seq_size;+totalseq;sleep(500);/等待ack,若沒(méi)有收到,則返回值為-1,計(jì)數(shù)器+1recvsize = recvfrom(sockserver,buffer,buffe
22、r_length,0,(sockaddr*)&addrclient),&length);if(recvsize 20)timeouthandler();waitcount = 0;else/收到ackackhandler(buffer0);waitcount = 0;sleep(500);break;sendto(sockserver, buffer, strlen(buffer)+1, 0, (sockaddr*)&addrclient, sizeof(sockaddr);sleep(500);/關(guān)閉套接字,卸載庫(kù)closesocket(sockserver);wsacleanup();re
23、turn 0;(2) 客戶端設(shè)計(jì)參考1) ack數(shù)據(jù)幀定義由于是從服務(wù)器端到客戶端的單向數(shù)據(jù)傳輸,因此ack數(shù)據(jù)幀不包含任何數(shù)據(jù),只需要將ack發(fā)送給服務(wù)器端即可。ack字段為一個(gè)字節(jié),表示序列號(hào)數(shù)值;末尾放入0,表示數(shù)據(jù)結(jié)束。2)命令設(shè)置客戶端的命令和服務(wù)器端的解析命令向?qū)?yīng),獲取當(dāng)前用戶輸入并發(fā)送給服務(wù)器并等待服務(wù)器返回?cái)?shù)據(jù),如輸入“-time”得到服務(wù)器的當(dāng)前時(shí)間。此處重點(diǎn)介紹“-testgbn x y”命令,x,y均為0,1的小數(shù),其中:x表示客戶端的丟包率,模擬網(wǎng)絡(luò)中報(bào)文丟失;y表示客戶端的ack的丟失率。(使用隨機(jī)函數(shù)完成)。如果用戶不輸入,則默認(rèn)丟失率均為0.2。3)源代碼/ g
24、bn_client.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include #include #include #pragma comment(lib,ws2_32.lib)#define server_port12340 /接收數(shù)據(jù)的端口號(hào)#define server_ip127.0.0.1 / 服務(wù)器的ip地址const int buffer_length = 1026;const int seq_size = 20;/接收端序列號(hào)個(gè)數(shù),為120/*/* -time 從服務(wù)器端獲取當(dāng)前時(shí)間-quit 退出客戶端-testgbn x 測(cè)試gbn協(xié)議實(shí)現(xiàn)可
25、靠數(shù)據(jù)傳輸 x 0,1 模擬數(shù)據(jù)包丟失的概率 y 0,1 模擬ack丟失的概率*/*/void printtips()printf(*n);printf(| -time to get current time |n);printf(| -quit to exit client |n);printf(| -testgbn x y to test the gbn |n);printf(*n);/*/ method: lossinlossratio/ fullname: lossinlossratio/ access: public / returns: bool/ qualifier: 根據(jù)丟失率
26、隨機(jī)生成一個(gè)數(shù)字,判斷是否丟失,丟失則返回true,否則返回false/ parameter: float lossratio 0,1/*bool lossinlossratio(float lossratio)int lossbound = (int) (lossratio * 100);int r = rand() % 101;if(r = lossbound)return true;return false;int main(int argc, char* argv)/加載套接字庫(kù)(必須)word wversionrequested;wsadata wsadata;/套接字加載時(shí)錯(cuò)誤提示
27、int err;/版本2.2wversionrequested = makeword(2, 2);/加載dll文件scoket庫(kù) err = wsastartup(wversionrequested, &wsadata);if(err != 0)/找不到winsock.dllprintf(wsastartup failed with error: %dn, err);return 1;if(lobyte(wsadata.wversion) != 2 | hibyte(wsadata.wversion) !=2) printf(could not find a usable version of
28、 winsock.dlln);wsacleanup();elseprintf(the winsock 2.2 dll was found okayn);socket socketclient = socket(af_inet, sock_dgram, 0);sockaddr_in addrserver;addrserver.sin_addr.s_un.s_addr = inet_addr(server_ip);addrserver.sin_family = af_inet;addrserver.sin_port = htons(server_port);/接收緩沖區(qū)char bufferbuf
29、fer_length;zeromemory(buffer,sizeof(buffer);int len = sizeof(sockaddr);/為了測(cè)試與服務(wù)器的連接,可以使用 -time 命令從服務(wù)器端獲得當(dāng)前時(shí)間/使用 -testgbn x y 測(cè)試gbn 其中x表示數(shù)據(jù)包丟失概率/ y表示ack丟包概率printtips();int ret;int interval = 1;/收到數(shù)據(jù)包之后返回ack的間隔,默認(rèn)為1表示每個(gè)都返回ack,0或者負(fù)數(shù)均表示所有的都不返回ackchar cmd128;float packetlossratio = 0.2;/默認(rèn)包丟失率0.2float ac
30、klossratio = 0.2;/默認(rèn)ack丟失率0.2/用時(shí)間作為隨機(jī)種子,放在循環(huán)的最外面srand(unsigned)time(null);while(true)gets_s(buffer);ret = sscanf(buffer,%s%f%f,&cmd,&packetlossratio,&acklossratio);/開(kāi)始gbn測(cè)試,使用gbn協(xié)議實(shí)現(xiàn)udp可靠文件傳輸if(!strcmp(cmd,-testgbn)printf(%sn,begin to test gbn protocol, please dont abort the process);printf(the loss
31、 ratio of packet is %.2f,the loss ratio of ack is %.2fn,packetlossratio,acklossratio);int waitcount = 0;int stage = 0;bool b;unsigned char u_code;/狀態(tài)碼unsigned short seq;/包的序列號(hào)unsigned short recvseq;/接收窗口大小為1,已確認(rèn)的序列號(hào)unsigned short waitseq;/等待的序列號(hào)sendto(socketclient, -testgbn, strlen(-testgbn)+1, 0, (
32、sockaddr*)&addrserver, sizeof(sockaddr);while (true)/等待server回復(fù)設(shè)置udp為阻塞模式recvfrom(socketclient,buffer,buffer_length,0,(sockaddr*)&addrserver, &len);switch(stage)case 0:/等待握手階段u_code = (unsigned char)buffer0;if (unsigned char)buffer0 = 205)printf(ready for file transmissionn);buffer0 = 200;buffer1 = 0;sendto(socketclient, buffer, 2, 0, (sockaddr*)&addrserver, sizeof(sockaddr);stage = 1;recvseq = 0;waitseq = 1;break;case 1:/等待接
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 各行業(yè)各類產(chǎn)品銷售額統(tǒng)計(jì)表
- 企業(yè)領(lǐng)導(dǎo)在年度會(huì)議上的致辭講稿
- 大學(xué)生實(shí)習(xí)安全協(xié)議書(shū)
- 房地產(chǎn)級(jí)代理合同
- 廣州勞務(wù)派遣協(xié)議
- 公路運(yùn)輸與鐵路運(yùn)輸
- 房地產(chǎn)合作開(kāi)發(fā)合同
- 2025年福建貨運(yùn)駕駛員從業(yè)資格題庫(kù)
- 國(guó)內(nèi)公路運(yùn)輸合同書(shū)
- 化妝品公司員工勞動(dòng)合同
- 2024-2030全球與中國(guó)寵物醫(yī)院市場(chǎng)現(xiàn)狀及未來(lái)發(fā)展趨勢(shì)
- 《研學(xué)旅行課程設(shè)計(jì)》課件-2認(rèn)識(shí)研學(xué)旅行的參與方
- 安全警示教育的會(huì)議記錄內(nèi)容
- 2024年廣東深圳市龍崗坂田街道招考綜合網(wǎng)格員招聘筆試沖刺題(帶答案解析)
- 人力資源外包投標(biāo)方案
- 部編版小學(xué)語(yǔ)文四年級(jí)下冊(cè)第二單元教材分析
- 參考消息電子版在線閱讀(角度區(qū))
- 小學(xué)五年級(jí)《美術(shù)》上冊(cè)知識(shí)點(diǎn)匯總
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 2016-2023年湖南鐵路科技職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 2023南頭古城項(xiàng)目簡(jiǎn)介招商手冊(cè)
評(píng)論
0/150
提交評(píng)論