




已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
中北大學(xué)操作系統(tǒng)課程設(shè)計(jì)說 明 書學(xué) 院、系:軟件學(xué)院專 業(yè):軟件工程學(xué) 生 姓 名:學(xué) 號:設(shè) 計(jì) 題 目:基于linux的小型遠(yuǎn)程FTP服務(wù)系統(tǒng)的設(shè)計(jì) 起 迄 日 期: 2011年12月22日- 2012年1月7日指 導(dǎo) 教 師:薛海麗2012 年 1月 7 日1 需求分析1.1 設(shè)計(jì)目的:用高級語言編寫和調(diào)試一個(gè)簡單的FTP服務(wù)系統(tǒng),掌握對進(jìn)程、線程、進(jìn)程互斥、同步、通信、文件系統(tǒng)及網(wǎng)絡(luò)編程的方法。從而加深學(xué)生對遠(yuǎn)程服務(wù)機(jī)制的理解和認(rèn)識。1.2 設(shè)計(jì)要求:該系統(tǒng)要求有服務(wù)器端軟件和客戶端軟件兩部分組成,服務(wù)器端在指定端口接受客戶連接請求,根據(jù)客戶要求執(zhí)行相應(yīng)處理,客戶端提供系統(tǒng)的交互界面基于套接字得客戶/服務(wù)器通信模式遠(yuǎn)程登錄功能要求集成linux系統(tǒng)的客戶管理功能,對客戶信息予以驗(yàn)證,客戶發(fā)送連接請求時(shí),提供FTP服務(wù)器軟件在linux主機(jī)上的客戶名及密碼,請求命令格式如下:Ftps:/客戶名:密碼FTP服務(wù)器IP:port并發(fā)執(zhí)行及管理功能采用多線程,客戶通過身份請求后創(chuàng)建一個(gè)新線程來響應(yīng)客戶請求?;顒?dòng)客戶計(jì)數(shù)功能統(tǒng)計(jì)當(dāng)前的活動(dòng)客戶數(shù),通過身份驗(yàn)證+1,斷開連接-1文件管理功能服務(wù)器端的文件基本操作包括:mkdir、rmdir、cd、ls客戶端執(zhí)行的基本操作包括:創(chuàng)建及刪除目錄、切換目錄、查看當(dāng)前目錄下的所有文件設(shè)定文件傳輸模式:文本模式和二進(jìn)制文件傳輸:upload/download到指定目錄。1.3 開發(fā)環(huán)境:本程序分為服務(wù)器端和客戶端兩部分,全部在Red Hat Enterprise Linux 5系統(tǒng)中使用GCC編譯執(zhí)行,要求系統(tǒng)具有vsftpd組件。1.4 程序特點(diǎn):本程序主要使用套接口函數(shù)實(shí)現(xiàn)服務(wù)器端/客戶端通信,具有較強(qiáng)的安全性設(shè)計(jì)和錯(cuò)誤提示功能;采用多線程設(shè)計(jì),可以保證多個(gè)客戶端登陸同一服務(wù)器端而不沖突。程序使用命令提示符界面,在指定賬戶登錄可實(shí)現(xiàn)全部功能,而在匿名賬戶下可實(shí)現(xiàn)部分功能。2. 總體設(shè)計(jì):2.1功能模塊:本程序分為套接口通信模塊、登錄模塊、命令解析模塊、文件操作模塊、文件傳輸模塊共5個(gè)模塊,具體如下:A.套接口通信模塊:表2-1 套接口函數(shù)列表函數(shù)名類型功能*Handle_Client_Request()void響應(yīng)客戶端請求do_client_work()void處理客戶端動(dòng)作sockaddr_in create_date_sock()struct創(chuàng)建數(shù)據(jù)管道send_client_info()void發(fā)送客戶端信息recv_client_infoint接受客戶端信息fill_host_addr()int寫入服務(wù)器地址xconnect()int連接服務(wù)器與客戶端ftp_send_cmd()int發(fā)送FTP指令ftp_get_reply()int接受服務(wù)器回應(yīng)xconnect_ftpdata()int傳輸數(shù)據(jù)handle_pasv()void設(shè)定FTP工作模式B.登錄模塊:表2-2 登錄模塊函數(shù)列表函數(shù)名類型功能login()int客戶端登錄close_cli()void關(guān)閉客戶端連接get_user()void獲取賬戶名get_pass()void獲取密碼ftp_login()int登錄到FTP服務(wù)器show_help()void顯示幫助信息ftp_quit()void退出客戶端C.命令解析模塊:表2-3 命令解析模塊函數(shù)列表函數(shù)名類型功能cmd_err_exit()void處理錯(cuò)誤的命令ftp_usr_cmd()int解析用戶輸入的命令start_ftp_cmd()int連接到服務(wù)器的命令ftp_cmd_filename()void處理文件名的命令D.文件操作模塊:表 2-4 文件操作模塊函數(shù)列表函數(shù)名類型功能ftp_list()void列出服務(wù)器文件列表ftp_pwd()void顯示服務(wù)器當(dāng)前所在目錄ftp_cd()void轉(zhuǎn)到服務(wù)器指定目錄del()void刪除文件mkdir_srv()void新建文件夾rmdir_srv()void刪除文件夾local_list()void列出客戶端文件列表local_pwd()void顯示客戶端當(dāng)前所在目錄local_cd()void轉(zhuǎn)到客戶端指定目錄handle_cwd()void處理轉(zhuǎn)換目錄的請求handle_rmd()void處理刪除目錄的請求handle_mkd()void處理新建文件夾的請求handle_list()void處理列出文件列表的請求E.文件傳輸模塊:表2-4 文件傳輸模塊函數(shù)列表函數(shù)名類型功能ftp_put()void上傳文件ftp_get()void下載文件handle_file()void檢查文件handle_del()void刪除文件2.2 程序流程圖圖 2-1 程序流程圖3詳細(xì)設(shè)計(jì)3.1客戶端連接服務(wù)器相關(guān)代碼:函數(shù)get_user()和get_pass()得到用戶輸入的用戶名和密碼。ftp_login()函數(shù)用輸入字符與缺省用戶名密碼、匿名用戶密碼相比較,如果一致則登陸成功,否則失敗。void get_user()/得到輸入用戶名char read_buf64;printf(User(Press for anonymous): );fgets(read_buf, sizeof(read_buf), stdin);if(read_buf0=n)strncpy(user, anonymous, 9);elsestrncpy(user, read_buf, strlen(read_buf)-1);void get_pass()/得到輸入密碼char read_buf64;printf(Password(Press for anonymous): );echo_off();/隱藏密碼fgets(read_buf, sizeof(read_buf), stdin);if(read_buf0=n)strncpy(passwd, anonymous, 9);elsestrncpy(passwd, read_buf, strlen(read_buf)-1);echo_on();/取消隱藏printf(n);int ftp_login()/登陸函數(shù)int err;get_user();if(ftp_send_cmd(USER , user, sock_control) 0)cmd_err_exit(Can not send message,1);err = ftp_get_reply(sock_control);/得到服務(wù)器返回if(err = 331)get_pass();if(ftp_send_cmd(PASS , passwd, sock_control) = 0)cmd_err_exit(Can not send message,1);elseerr = ftp_get_reply(sock_control);if(err = 230)/缺省用戶return 1;else if(err = 531)/匿名用戶return 2;elseprintf(Password error!n);return 0;elseprintf(User error!n);return 0;圖3-1 打開服務(wù)器端和客戶端函數(shù)int xconnect(struct sockaddr_in *s_addr, int type)連接到服務(wù)器。int xconnect(struct sockaddr_in *s_addr, int type)struct timeval outtime;int set;int s = socket(AF_INET, SOCK_STREAM, 0);if(s 0)cmd_err_exit(creat socket error!, 249);set = setsockopt(s, SOL_SOCKET,SO_RCVTIMEO, &outtime,sizeof(outtime);if(set !=0)printf(set socket %s errno:%dn,strerror(errno),errno);cmd_err_exit(set socket, 1);/connect to the serverif (connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in) sin_addr),ntohs(ftp_server.sin_port);exit(252);return s;fgets(read_buf, sizeof(read_buf), stdin);得到用戶名和密碼的關(guān)鍵函數(shù)。讀入數(shù)據(jù)。int s = socket(AF_INET, SOCK_STREAM, 0);if(s 0)cmd_err_exit(creat socket error!, 249);圖 3-2 用戶登錄創(chuàng)建套接字,如創(chuàng)建成功,socket函數(shù)返回非負(fù)值。/connect to the serverif (connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in) sin_addr),ntohs(ftp_server.sin_port);exit(252);連接到服務(wù)器,如果連接成功,connect函數(shù)返回0,如果不成功,返回-1。int ftp_send_cmd(const char *s1, const char *s2, int sock_fd)向服務(wù)器發(fā)送客戶端的命令的函數(shù)。int ftp_send_cmd(const char *s1, const char *s2, int sock_fd)char send_buf256;int send_err, len;if(s1) strcpy(send_buf,s1);if(s2)strcat(send_buf, s2);strcat(send_buf,rn);len = strlen(send_buf);send_err = send(sock_fd, send_buf, len, 0);else strcat(send_buf,rn);len = strlen(send_buf);send_err = send(sock_fd, send_buf, len, 0); if(send_err 0)reply_code = atoi(rcv_buf);elsereturn 0;while(1)if(count );fgets(usr_cmd,510,stdin);fflush(stdin);if(usr_cmd0 = n)continue;usr_cmdstrlen(usr_cmd)-1 = 0;cmd_flag = ftp_usr_cmd(usr_cmd);if(cmd_flag = 15)char *cmd = strchr(usr_cmd, );char dress_ftp1024;if(cmd = NULL)printf(command error!n);show_help();return;elsewhile(*cmd = )cmd+;if(cmd = NULL|cmd = 0)printf(command error!n);return;elsechar * dr = ;strncpy(dress_ftp,cmd,strlen(cmd);dress_ftpstrlen(cmd) = 0;printf(%s,dress_ftp);if(dress_ftp = )printf(Connect Seccessed!n);start_ftp_cmd(dr,DEFAULT_FTP_PORT);/open成功則調(diào)用該函數(shù),該函數(shù)與open_ftpsrv()很相似。elseprintf(Inviable Server Dress!n);else/如果open不成功,則只能進(jìn)行客戶端上的操作,不能進(jìn)行有關(guān)服務(wù)器操作switch(cmd_flag)case 11:local_list();memset(usr_cmd,0,sizeof(usr_cmd);break;case 12:local_pwd();memset(usr_cmd,0,sizeof(usr_cmd);break;case 13:local_cd(usr_cmd);memset(usr_cmd,0,sizeof(usr_cmd);break;case 6:/quitprintf(BYE TO WEILIQI FTP!n);exit(0);break;default:printf(command error!n);show_help();memset(usr_cmd,0,sizeof(usr_cmd);break;圖3-3 退出與服務(wù)器的連接3.2客戶端目錄文件操作相關(guān)代碼:void ftp_list()顯示服務(wù)器當(dāng)前目錄下文件的函數(shù)。圖3-4 文件列表功能int list_sock_data = xconnect_ftpdata();創(chuàng)建一個(gè)新套接字,表示是否連接上服務(wù)器的數(shù)據(jù)。ftp_send_cmd(LIST, NULL, sock_control);ftp_get_reply(sock_control);向服務(wù)器發(fā)送命令,得到服務(wù)器的響應(yīng)答復(fù)。new_sock = accept(list_sock_data, (struct sockaddr *)&local_host, (socklen_t *)&set);從服務(wù)器接收數(shù)據(jù)(文件信息)。void ftp_cmd_filename(char * usr_cmd, char * src_file, char * dst_file)此函數(shù)讀取客戶端命令后的文件名字。在很多命令中,如get,put后要加入上傳或下載的文件名字,這個(gè)函數(shù)解析文件名字信息。void local_pwd()顯示客戶端目錄函數(shù)。/print local current directoryvoid local_pwd()char curr_dir512;int size = sizeof(curr_dir);if(getcwd(curr_dir, size) = NULL)printf(getcwd failedn);elseprintf(Current local directory: %sn, curr_dir);getcwd(curr_dir, size)得到客戶端目錄。void ftp_cd(char * usr_cmd)轉(zhuǎn)換服務(wù)器目錄函數(shù)。void ftp_cd(char * usr_cmd)char *cmd = strchr(usr_cmd, );char path1024;if(cmd = NULL)printf(command error!n);return;elsewhile(*cmd = )cmd +;if(cmd = NULL | cmd = 0)printf(command error!n);return;elsestrncpy(path, cmd, strlen(cmd);pathstrlen(cmd)=0;ftp_send_cmd(CWD , path, sock_control);ftp_get_reply(sock_control);ftp_send_cmd(CWD , path, sock_control);ftp_get_reply(sock_control);發(fā)送轉(zhuǎn)換目錄命令給服務(wù)器,服務(wù)器完成該功能。圖3-5 下載文件創(chuàng)建目錄函數(shù)void mkdir_srv(char * usr_cmd) 和刪除目錄函數(shù)void rmdir_srv(char * usr_cmd)與void ftp_cd(char * usr_cmd)函數(shù)相似,在此不做解釋。圖3-6 列出本地文件目錄函數(shù)void local_list()列出客戶端文件列表。void local_list()DIR * dp;struct dirent *dirp;if(dp = opendir(./) = NULL)printf(opendir() error!n);return;printf(Local file list:n);while(dirp = readdir(dp) != NULL)if(strcmp(dirp-d_name, .) = 0 | strcmp(dirp-d_name, .) = 0)continue;printf(%sn, dirp-d_name);轉(zhuǎn)換客戶端目錄函數(shù)void local_cd(char * usr_cmd)char *cmd = strchr(usr_cmd, );char path1024;if(cmd = NULL)printf(command error!n);return;elsewhile(*cmd = )cmd +;if(cmd = NULL | cmd = 0)printf(command error!n);return;elsestrncpy(path, cmd, strlen(cmd);pathstrlen(cmd)=0;if(chdir(path) client_sock,info-client)函數(shù)與客戶端交互。void *Handle_Client_Request(void* arg)struct ARG*info;info=(struct ARG*)arg;printf(You got a connection from %sn,inet_ntoa(info-client.sin_addr);do_client_work(info-client_sock,info-client);close(info-client_sock);pthread_exit(NULL);函數(shù)do_client_work(int client_sock,struct sockaddr_in client)處理FTP各種命令。void do_client_work(int client_sock,struct sockaddr_in client)int login_flag;login_flag=login(client_sock);while(recv_client_info(client_sock)&login_flag=1)/缺省用戶操作響應(yīng)if(strncmp(quit, client_Control_Info, 4) = 0)|(strncmp(QUIT, client_Control_Info, 4) = 0)send_client_info(client_sock, serverInfo221, strlen(serverInfo221);break;else if(strncmp(close,client_Control_Info,5) = 0)|(strncmp(CLOSE,client_Control_Info,5) = 0)printf(Client Quit!n);shutdown(client_sock,SHUT_WR);/關(guān)閉連接服務(wù)器,只關(guān)閉寫操作。此時(shí)仍可進(jìn)行客戶端相關(guān)操作。else if(strncmp(pwd, client_Control_Info, 3) = 0|(strncmp(PWD, client_Control_Info, 3) = 0)char pwd_infoMSG_INFO; char tmp_dirDIR_INFO; snprintf(pwd_info, MSG_INFO, 257 %s is current location.rn, getcwd(tmp_dir, DIR_INFO);send_client_info(client_sock, pwd_info, strlen(pwd_info);else if(strncmp(cwd, client_Control_Info, 3) = 0|(strncmp(CWD, client_Control_Info, 3) = 0)handle_cwd(client_sock);else if(strncmp(mkd, client_Control_Info, 3) = 0|(strncmp(MKD, client_Control_Info, 3) = 0)handle_mkd(client_sock);else if(strncmp(rmd, client_Control_Info, 3) = 0|(strncmp(RMD, client_Control_Info, 3) = 0)handle_rmd(client_sock);else if(strncmp(dele, client_Control_Info, 4) = 0|(strncmp(DELE, client_Control_Info, 4) = 0)handle_del(client_sock);else if(strncmp(pasv, client_Control_Info, 4) = 0|(strncmp(PASV, client_Control_Info, 4) = 0) handle_pasv(client_sock,client);else if(strncmp(list, client_Control_Info, 4) = 0|(strncmp(LIST, client_Control_Info, 4) = 0) handle_list(client_sock); send_client_info(client_sock,serverInfo226, strlen(serverInfo226);else if(strncmp(type, client_Control_Info, 4) = 0|(strncmp(TYPE, client_Control_Info, 4) = 0)if(strncmp(type I, client_Control_Info, 6) = 0|(strncmp(TYPE I, client_Control_Info, 6) = 0) translate_data_mode=FILE_TRANS_MODE_BIN; send_client_info(client_sock, serverInfo200, strlen(serverInfo200);else if(strncmp(retr, client_Control_Info, 4) = 0|(strncmp(RETR, client_Control_Info, 4) = 0)handle_file(client_sock);send_client_info(client_sock,serverInfo226, strlen(serverInfo226);else if(strncmp(stor, client_Control_Info, 4) = 0|(strncmp(STOR, client_Control_Info, 4) = 0)handle_file(client_sock);send_client_info(client_sock,serverInfo226, strlen(serverInfo226);else if(strncmp(syst, client_Control_Info, 4) = 0|(strncmp(SYST, client_Control_Info, 4) = 0)send_client_info(client_sock, serverInfo215, strlen(serverInfo215);else if(strncmp(size, client_Control_Info, 4) = 0|(strncmp(SIZE, client_Control_Info, 4) = 0)send_client_info(client_sock, serverInfo213, strlen(serverInfo213);else if(strncmp(feat, client_Control_Info, 4) = 0|(strncmp(FEAT, client_Control_Info, 4) = 0)send_client_info(client_sock, serverInfo211, strlen(serverInfo211);else if(strncmp(rest, client_Control_Info, 4) = 0|(strncmp(REST, client_Control_Info, 4) = 0)send_client_info(client_sock, serverInfo350, strlen(serverInfo350);else send_client_info(client_sock, serverInfo, strlen(serverInfo);while(recv_client_info(client_sock)&(login_flag = 2)/匿名用戶操作響應(yīng)/省略代碼函數(shù)int login(int client_sock)為登陸函數(shù)。處理客戶端登錄請求,與已定義的權(quán)限用戶密碼進(jìn)行匹配,成功則為ROOT用戶,失敗則匹配匿名用戶,匿名用戶只能進(jìn)行簡單服務(wù)。if(strncmp(format_client_Info, default_user, 4) = 0)flag=1;if(strncmp(format_client_Info, anony_user, 9) = 0) flag=2;函數(shù)void handle_cwd(int client_sock)處理轉(zhuǎn)換目錄功能。關(guān)鍵代碼:if (chdir(client_dir) = 0) snprintf(cwd_info, MSG_INFO, 257 %s is current location.rn, getcwd(tmp_dir, DIR_INFO); send_client_info(client_sock, cwd_info, strlen(cwd_info); else snprintf(cwd_info, MSG_INFO, 550 %s :%srn,client_dir,strerror(errno); perror(chdir():); send_client_info(client_sock, cwd_info, strlen(cwd_info); 上述代碼表示當(dāng)轉(zhuǎn)換目錄存在則把當(dāng)前目錄更改為轉(zhuǎn)換目錄,否則報(bào)錯(cuò)。創(chuàng)建目錄與刪除目錄關(guān)鍵代碼與之類似。函數(shù)void handle_mkd(int client_sock)處理創(chuàng)建目錄功能。關(guān)鍵代碼:if (mkdir(client_dir) = 0) printf( %s is created successfully.rn, client_dir); send_client_info(client_sock, mkd_info, strlen(mkd_info); else snprintf(mkd_info, MSG_INFO, 550 %s :%srn,client_dir,strerror(errno); perror(mkdir():); send_client_info(client_sock, mkd_info, strlen(mkd_info); 上述代碼表示創(chuàng)建client_dir目錄,成功輸出消息,否則報(bào)錯(cuò)。圖3-7 創(chuàng)建目錄函數(shù)void handle_rmd(int client_sock)處理刪除目錄功能。關(guān)鍵代碼:if (rmdir(client_dir) = 0) printf( %s is deleted successfully.rn, client_dir); send_client_info(client_sock, rmd_info, strlen(rmd_info); else snprintf(rmd_info, MSG_INFO, 550 %s :%srn,client_dir,strerror(errno); perror(rmdir():); send_client_info(client_sock, rmd_info, strlen(rmd_info); 上述代碼表示刪除client_dir目錄,成功輸出消息,否則報(bào)錯(cuò)。函數(shù)handle_list(int client_sock)處理list命令。FILE *pipe_fp;/建立管道以傳輸數(shù)據(jù)char t_dirDIR_INFO;char list_cmd_infoDIR_INFO;snprintf(list_cmd_info, DIR_INFO, ls -l %s, getcwd(t_dir, DIR_INFO);/得到當(dāng)前目錄 if (pipe_fp = popen(list_cmd_info, r) = NULL)/打開管道 printf(pipe open error in cmd_listn);return ; printf(pipe open successfully!, cmd is %sn, list_cmd_info);char t_char; while (t_char = fgetc(pipe_fp) != EOF) printf(%c, t_char);write(t_data_sock, &t_char, 1); /得到當(dāng)前目錄文件列表 pclose(pipe_fp);/關(guān)閉管道 printf(close pipe successfully!n); close(t_data_sock);printf(%s close data successfully!n,serverInfo226);close(ftp_data_sock);函數(shù)struct sockaddr_in create_date_sock()創(chuàng)建數(shù)據(jù)sock。struct sockaddr_in create_date_sock()int t_client_sock;struct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電氣安裝建筑與土木工程考核試卷
- 航班空中餐食文化考核試卷
- 科技創(chuàng)新與趨勢的項(xiàng)目管理研究考核試卷
- 纖維板行業(yè)區(qū)域發(fā)展差異考核試卷
- 探索光的世界
- 四川省遂寧高級實(shí)驗(yàn)校2025年初三下學(xué)期第五次調(diào)研考試生物試題試卷含解析
- 嘉峪關(guān)市重點(diǎn)中學(xué)2025屆初三2月份網(wǎng)絡(luò)聯(lián)考試卷語文試題含解析
- 南寧師范大學(xué)師園學(xué)院《固體理論II》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省張家港第二中學(xué)2024-2025學(xué)年高三下學(xué)期第一次診斷考試英語試題含解析
- 寧波市重點(diǎn)中學(xué)2025年高三聯(lián)考(三)語文試題含解析
- 水泵采購?fù)稑?biāo)方案(技術(shù)方案)
- DG∕TJ 08-2220-2016 橋梁水平轉(zhuǎn)體法施工技術(shù)規(guī)程
- 教學(xué)評一體化的小學(xué)語文低段單元作業(yè)設(shè)計(jì)方法
- 手術(shù)室不良事件警示教育
- (高清版)DZT 0079-2015 固體礦產(chǎn)勘查地質(zhì)資料綜合整理綜合研究技術(shù)要求
- 2023年全國統(tǒng)一高考理綜化學(xué)部分(全國甲卷)(含答案與解析)
- 伽利略與牛頓的科學(xué)方法
- 科普機(jī)器人講座教案
- 部編版語文二年級下冊第四單元整體教學(xué)設(shè)計(jì)教案
- 智能護(hù)理智能康復(fù)輔助系統(tǒng)的發(fā)展
- 2024年5月河北省物理學(xué)業(yè)水平考試真題
評論
0/150
提交評論