版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 摘要3</b></p><p> 第一章 課程設(shè)計要求4</p><p><b> 一、設(shè)計任務(wù)4</b></p><p> 1.1.1 課程設(shè)計內(nèi)容4</p><p>
2、; 1.1.2、課程設(shè)計的基本要求4</p><p> 二、設(shè)計基本思路及相關(guān)理論4</p><p> 1.2.1、TCP/IP協(xié)議4</p><p> 1.2.2、客戶機/服務(wù)器模型5</p><p> 1.2.3、設(shè)計基本思路5</p><p> 第二章 設(shè)計概要6</p>&
3、lt;p> 2.1 功能設(shè)計6</p><p> 2.2 程序系統(tǒng)功能模塊7</p><p> 2.3 功能分析8</p><p> 2.3.1 功能流程圖:8</p><p> 2.3.2 程序主要功能說明8</p><p> 第三章 調(diào)試分析與測試結(jié)果24</p>
4、<p> 3.1服務(wù)器端與客戶端24</p><p> 3.2文件管理的過程27</p><p> 第四章 設(shè)計總結(jié)29</p><p><b> 參考文獻29</b></p><p> 課程設(shè)計評分表30</p><p><b> 摘要</b>
5、;</p><p> 網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。</p><p> Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)
6、TCP/IP網(wǎng)絡(luò)上的應用程序。要學Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。</p><p> Socket接口設(shè)計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。常用的Socket類型有兩種:流式Socket (SOCK_STREAM)和數(shù)據(jù)報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面
7、向連接的TCP服務(wù)應用;數(shù)據(jù) 報式Socket是一種無連接的Socket,對應于無連接的UDP服務(wù)應用。</p><p> Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應用程序。要學Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。</p><p> 關(guān)鍵字: Socket、文件傳輸、多線
8、程</p><p><b> 課程設(shè)計要求</b></p><p><b> 一、設(shè)計任務(wù)</b></p><p> 1.1.1 課程設(shè)計內(nèi)容</p><p> 文件傳輸協(xié)議的簡單設(shè)計與實現(xiàn):學會利用已有網(wǎng)絡(luò)環(huán)境設(shè)計并實現(xiàn)簡單應用層協(xié)議,掌握TCP/IP網(wǎng)絡(luò)應用程序基本的設(shè)計方法和實現(xiàn)技巧,
9、加深對客戶/服務(wù)器的工作模式的認識。</p><p> 用socket 編程接口編寫程序,分別為客戶程序(ftpclient.cpp)和服務(wù)器程序(ftpserver.cpp)和管理程序。</p><p> 1.1.2、課程設(shè)計的基本要求</p><p> .鞏固和加深對計算機網(wǎng)絡(luò)原理的理解,提高綜合運用本課程所學知識的能力。</p><p
10、> .培養(yǎng)選用參考書,查閱手冊及文獻資料的能力。培養(yǎng)獨立思考,深入研究,分析問題、解決問題的能力。</p><p> .通過實際分析設(shè)計、編程調(diào)試,掌握計算機網(wǎng)絡(luò)通信的基本規(guī)程,以及協(xié)議的利用方法,體會體系結(jié)構(gòu)分層的思路。</p><p> .能夠按要求編寫課程設(shè)計報告書,能正確闡述設(shè)計和設(shè)計結(jié)果、正確繪制系統(tǒng)和程序框圖。</p><p> .通過課程
11、設(shè)計,培養(yǎng)嚴謹?shù)目茖W態(tài)度,嚴肅認真的工作作風,和團隊協(xié)作精神。</p><p> 二、設(shè)計基本思路及相關(guān)理論</p><p> 1.2.1、TCP/IP協(xié)議</p><p> TCP/IP協(xié)議是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),由網(wǎng)絡(luò)層的IP協(xié)議和傳輸層的TCP協(xié)議組成。TCP/IP 定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在
12、它們之間傳輸?shù)臉藴?。協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。通俗而言:TCP負責發(fā)現(xiàn)傳輸?shù)膯栴},一有問題就發(fā)出信號,要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡亍?lt;/p><p> TCP是面向連接的通信協(xié)議,通過三次握手建立連接,通訊完成時要拆除連接,由于TCP是面向連接的所以只能用于點對點的通訊。 </p><p> TCP提供的是一種可靠
13、的數(shù)據(jù)流服務(wù),采用一種稱為“滑動窗口”的方式進行流量控制。TCP將它的信息送到更高層的應用程序,例如Telnet的服務(wù)程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動程序和物理介質(zhì),最后到接收方。 </p><p> 1.2.2、客戶機/服務(wù)器模型</p><p> 網(wǎng)絡(luò)應用層程序一般都是以客戶機/服務(wù)器模型的方式工作的,而因特網(wǎng)便是客戶機/服
14、務(wù)器模型的一個典型應用。在這種工作方式中,一個服務(wù)器程序先啟動,并在一個熟知端口偵聽對服務(wù)器的請求,當客戶機應用程序需要某種服務(wù)時,須向提供這種服務(wù)的服務(wù)器發(fā)出請求,服務(wù)器在接收到請求后,向客戶機發(fā)出響應請求信息。這樣客戶機用用程序和服務(wù)器程序之間變建立了連接,此后可以進行數(shù)據(jù)通信。通信任務(wù)完成后需要關(guān)閉它們之間的通信連接。</p><p> 圖1 客戶機/服務(wù)器模型的工作流程</p><
15、;p> 1.2.3、設(shè)計基本思路</p><p> 設(shè)計程序使客戶端連接的時候,服務(wù)器將會向客戶端發(fā)回一條消息告知它的IP地址,然后關(guān)閉連接并繼續(xù)接收端口的連接。建立各個命令功能對應的函數(shù),發(fā)送請求,等待服務(wù)器端的服務(wù)。服務(wù)器端初始化WinSock,創(chuàng)建SOCKET,獲取主機信息,并對客戶端進行會話,發(fā)送回復訊息給客戶端,響應完畢后關(guān)閉連接,釋放WinSock。</p><p>
16、 模擬TCP/IP協(xié)議的工作模式,在雙方工作的時候開設(shè)一個熟知端口(4523),進行數(shù)據(jù)的傳送與接收。</p><p> 模擬TCP工作機制,確定數(shù)據(jù)端口傳送數(shù)據(jù)時,進行分組傳送。</p><p> 服務(wù)器從打開開始,保持監(jiān)聽控制端口,當用戶登陸成功后,主動分配該用戶服務(wù)線程。</p><p> 在傳送數(shù)據(jù)的時候,為了確保不影響原程序的工作,應獨立分配線程。
17、</p><p><b> 本設(shè)計基本圖如下:</b></p><p><b> 第二章 設(shè)計概要</b></p><p><b> 2.1 功能設(shè)計</b></p><p> 本項目是為了實現(xiàn)基于Socket進行文件傳輸?shù)墓δ堋m椖康姆治黾霸O(shè)計要求如下:</p
18、><p> 1)整個系統(tǒng)中分為服務(wù)器端(Server)和客戶端(Client)</p><p> 2)服務(wù)器端可以對文件進行管理,包括上傳,下載,刪除文件,重命名等</p><p> 3)客服端可以實現(xiàn)文件的上傳、下載以及查看服務(wù)器下默認目錄的文件列表</p><p> 4)在程序中應用多線程來實現(xiàn)多個客戶端同時對一個服務(wù)器端進行請求操作
19、</p><p> 2.2 程序系統(tǒng)功能模塊</p><p><b> 圖2.1</b></p><p><b> 2.3 功能分析</b></p><p> 2.3.1 功能流程圖:</p><p> 圖2.2 面向連接的客戶機/服務(wù)器程序工作模型<
20、/p><p> 2.3.2 程序主要功能說明</p><p> 主要功能實現(xiàn)代碼如下:</p><p><b> 服務(wù)器端</b></p><p> //server.cpp</p><p> #include <stdio.h></p><p> #i
21、nclude <stdlib.h></p><p> #include <WinSock2.h></p><p> #include <io.h></p><p> #define LISTENPORT 12345</p><p> #pragma comment(lib,"Wsock32
22、")</p><p> #pragma comment(lib,"ws2_32")</p><p> sendFile(SOCKET conSock)</p><p><b> {</b></p><p> printf("Prapare to send file\n&qu
23、ot;);</p><p> char *sendBuf = new char[100];</p><p><b> FILE *in;</b></p><p> char infile[50] ; </p><p> printf("選擇要傳輸?shù)奈募?quot;);</p><p&
24、gt; scanf("%[^\n]s",infile);</p><p> if((in=fopen(infile,"rb"))==NULL)</p><p><b> {</b></p><p> printf("Can't open the source file"
25、);</p><p><b> exit(0);</b></p><p><b> }</b></p><p> printf("File name is %s\n", infile);</p><p> // send file name to the client&l
26、t;/p><p> send(conSock, infile, sizeof(infile), 0);</p><p> int handle = open(infile, 0x0001);</p><p> long file_len = filelength(handle);</p><p> long file_len_bak =
27、file_len;</p><p> printf("Size of the file is %d\n", file_len);</p><p> // store the length of the file in sendBuffer</p><p><b> int i;</b></p><p
28、> for (i = 0; file_len > 9; i++)</p><p><b> {</b></p><p> sendBuf[i] = (file_len % 10);</p><p> file_len = file_len / 10;</p><p><b> }</
29、b></p><p> sendBuf[i] = file_len % 10; </p><p> send(conSock, sendBuf, i + 1, 0); </p><p> printf("Transmission started\n");</p><p><b> Sleep(1
30、);</b></p><p><b> char ch;</b></p><p> char chack;</p><p> while (file_len_bak != 0)</p><p><b> {</b></p><p> ch = fgetc
31、(in);</p><p> send(conSock, &ch, 1, 0);</p><p> recv(conSock, &chack, 1, 0);</p><p> file_len_bak--;</p><p> printf(".");</p><p><
32、b> }</b></p><p><b> ch = EOF;</b></p><p> send(conSock, &ch, 1, 0);</p><p> printf("\nTransmission finished");</p><p><b>
33、}</b></p><p> int main()</p><p><b> {</b></p><p> WSADATA words; </p><p> if(WSAStartup(MAKEWORD(2,2),&words)!=0) </p><p><
34、;b> {</b></p><p> printf("Winsock init failed!\n");</p><p><b> } </b></p><p> SOCKET listenSock, conSock;</p><p> sockaddr_in r
35、emoteAddr;</p><p> int remoteAddrLen, int ServerAddrLen;</p><p> listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);</p><p> if (listenSock == INVALID_SOCKET)</p><
36、p><b> {</b></p><p> printf("ListenSocket create failed!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> soc
37、kaddr_in sin;</p><p> sin.sin_family = AF_INET;</p><p> sin.sin_port = htons(LISTENPORT);</p><p> sin.sin_addr.S_un.S_addr = INADDR_ANY;</p><p> ServerAddrLen = siz
38、eof(sin);</p><p> if (bind(listenSock, (sockaddr *)&sin, ServerAddrLen) == SOCKET_ERROR)</p><p><b> {</b></p><p> printf("Bind error!\n");</p>&l
39、t;p><b> return 0;</b></p><p><b> }</b></p><p> if (listen(listenSock, 2) == SOCKET_ERROR)</p><p><b> {</b></p><p> printf(&q
40、uot;Can't listen!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p> remoteAddrLen = sizeof(remoteAddr);</p><p> while (TRUE)&l
41、t;/p><p><b> {</b></p><p> conSock = accept(listenSock, (sockaddr *)& remoteAddr, &remoteAddrLen);</p><p> if (conSock == INVALID_SOCKET)</p><p><
42、;b> {</b></p><p> printf("Accept failed!\n");</p><p><b> continue;</b></p><p><b> }</b></p><p><b> else</b>&
43、lt;/p><p><b> {</b></p><p> printf("Accept a new connect : %s \r\n", inet_ntoa(remoteAddr.sin_addr));</p><p> sendFile(conSock);</p><p><b>
44、 }</b></p><p><b> }</b></p><p> closesocket(conSock);</p><p> closesocket(listenSock);</p><p> WSACleanup();</p><p><b> return
45、 1;</b></p><p><b> }</b></p><p><b> 客戶端</b></p><p> //client.cpp</p><p> #include <stdio.h></p><p> #include <s
46、tdlib.h></p><p> #include <WinSock2.h></p><p> #include <fstream></p><p> using namespace std;</p><p> #define SERVERPORT 12345</p><p>
47、 #pragma comment(lib, "Wsock32")</p><p> #pragma comment(lib, "ws2_32")</p><p> receiveFile(SOCKET consock)</p><p><b> {</b></p><p>
48、 printf("Prepare to receive file\n");</p><p> FILE *dest;</p><p> char destfile[50];</p><p> char recvBuff[100];</p><p> // Receive name of the file</p
49、><p> int namelen = recv(consock, recvBuff, 100, 0);</p><p> memcpy(destfile, recvBuff, namelen);</p><p> printf("Name of the file is %s \n", destfile);</p><p&g
50、t; if((dest=fopen(destfile,"wb"))==NULL)</p><p><b> {</b></p><p> printf("Can't open the dest file");</p><p><b> exit(0);</b><
51、/p><p><b> } </b></p><p> // Receive size of the file</p><p> int flag_file_len = recv(consock, recvBuff, 100, 0);</p><p> long file_len = 0;</p>&
52、lt;p> for (int i = 0; flag_file_len != 0; i++)</p><p><b> {</b></p><p> long temp = recvBuff[i];</p><p> for (int j = 0; j != i; j++)</p><p><b>
53、; {</b></p><p> temp = temp * 10;</p><p><b> }</b></p><p> file_len = file_len + temp; </p><p> flag_file_len--;</p><p><b> }
54、</b></p><p> printf("Size of the file is %ld\n", file_len);</p><p> printf("Ready to receive file\n");</p><p><b> char ch;</b></p>&l
55、t;p> char chack = 1;</p><p><b> int n;</b></p><p> while ( recv(consock, &ch, 1, 0))</p><p><b> {</b></p><p> fputc(ch, dest);</p
56、><p> send(consock, &chack, 1, 0);</p><p> file_len--;</p><p> if (file_len == 0)</p><p><b> {</b></p><p><b> break;</b></
57、p><p><b> }</b></p><p> printf(".");</p><p><b> }</b></p><p> printf("\nTransmission finished\n");</p><p><
58、b> }</b></p><p> int main()</p><p><b> {</b></p><p> WSADATA words;</p><p> if(WSAStartup(MAKEWORD(2,2),&words)!=0) </p><p&
59、gt;<b> {</b></p><p> printf("Winsock init failed\n");</p><p><b> }</b></p><p> SOCKET conSock;</p><p> conSock = socket(AF_IN
60、ET, SOCK_STREAM, IPPROTO_TCP);</p><p> if (conSock == INVALID_SOCKET)</p><p><b> {</b></p><p> printf("Socket create failed\n");</p><p><b&g
61、t; return 0;</b></p><p><b> }</b></p><p> sockaddr_in servAddr;</p><p> servAddr.sin_family = AF_INET;</p><p> servAddr.sin_port = htons(SERVERPO
62、RT);</p><p> servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");</p><p> if (connect(conSock, (sockaddr *)& servAddr, sizeof(servAddr)) == -1)</p><p><b>
63、{</b></p><p> printf("Connect failed\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> else</b></p>
64、;<p><b> {</b></p><p> printf("Connect to server succeed\n");</p><p> receiveFile(conSock);</p><p><b> }</b></p><p> close
65、socket(conSock);</p><p> WSACleanup();</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> 管理系統(tǒng)</b></p><p> #incl
66、ude <stdio.h></p><p> #include <stdlib.h></p><p> #include <ctype.h></p><p> #include <string.h></p><p> #include <time.h></p>
67、<p> #define SYS_SIZE 0XFFFFF*100 </p><p> #define BLOCK_SIZE 512 </p><p><b> FILE *f;</b></p><p> struct filsys{ </
68、p><p> int s_nfree; </p><p> long s_free[100]; </p><p> int s_ninode; </p><p> int s_inode[96]; </
69、p><p><b> }*p;</b></p><p> struct index_block{ </p><p> int s_nfree;</p><p> long s_free[96];</p><p><b> }q;</b>&
70、lt;/p><p> struct filelist{ </p><p> char name[14]; </p><p> int inode_num; </p><p><b> }file;</b><
71、/p><p> struct inode{ </p><p> int i_size; </p><p> int block_amount; </p><p> long i_addr[16];
72、</p><p> char create_time[25]; </p><p><b> }inode;</b></p><p> struct fcb{ </p><p> char name[12]; &l
73、t;/p><p> int inode_num; </p><p> int used; </p><p> int i_size; </p><p> int block_amount; &l
74、t;/p><p> long i_addr[16]; </p><p> }fcb[5],*ptr;</p><p> struct open_file_table{ </p><p> int offset; </p><p
75、> struct fcb* f_node; </p><p> }table[5];</p><p> struct fd{ </p><p> struct open_file_table* t_node; </p><p><b> }fd
76、[5];</b></p><p> FILE* apply_room(char *sys_name) </p><p><b> { </b></p><p> f = fopen(sys_name,"w+b"); //創(chuàng)建一個新的可讀寫的二進制文件</p><p&g
77、t; fseek(f,SYS_SIZE,SEEK_SET); </p><p> fputc(EOF, f); </p><p> fclose(f);</p><p> return fopen(sys_name,"r+b"); //打開一個可讀寫的二進制文件</p>&l
78、t;p><b> }</b></p><p> void myfree(long block_num) </p><p><b> { </b></p><p><b> int i;</b></p><p> if(p->s_nfree
79、<100) </p><p> { </p><p> p->s_free[p->s_nfree]=block_num;</p><p> p->s_nfree++;</p><p><b> }</b></p><p&
80、gt; else </p><p> { </p><p> q.s_nfree=p->s_nfree; </p><p> for(i=0;i<100;i++)</p><p> q.s_free[i]=p->s_free[i];<
81、/p><p> fseek(f,(block_num-1)*BLOCK_SIZE,SEEK_SET);</p><p> fwrite(&q,sizeof(struct index_block),1,f); </p><p> p->s_nfree=1; </p><p> p->s_fr
82、ee[0]=block_num;</p><p><b> }</b></p><p><b> }</b></p><p> long myalloc() </p><p> { </p><p><b>
83、 int i;</b></p><p><b> long a;</b></p><p> p->s_nfree--;</p><p> if(p->s_nfree==0){ </p><p> a=p->s_free[0];</p><
84、;p> fseek(f,(a-1)*BLOCK_SIZE,SEEK_SET);</p><p> fread(&q,sizeof(struct index_block),1,f);</p><p> p->s_nfree=q.s_nfree; </p><p> for(i=0;i<100;i++)</p>
85、<p> p->s_free[i]=q.s_free[i];</p><p><b> return a;</b></p><p> }else return p->s_free[p->s_nfree];</p><p><b> }</b></p><p>
86、 void init() </p><p><b> { </b></p><p><b> int j;</b></p><p><b> long i;</b></p><p> p->s_nfree=1;&
87、lt;/p><p> p->s_free[0]=0;</p><p> p->s_ninode=96;</p><p> for(i=0;i<96;i++)</p><p> p->s_inode[i]=-1; </p><p> for(i=22;i<=SYS
88、_SIZE/BLOCK_SIZE;i++)</p><p> myfree(i); </p><p> j=p->s_nfree+1;</p><p> while(j<100)</p><p> p->s_free[j++]=0; </p>&
89、lt;p> fseek(f,0,SEEK_SET);</p><p> fwrite(p,sizeof(struct filsys),1,f);</p><p><b> }</b></p><p> int ialloc(){ </p><p><b>
90、; int i=0;</b></p><p> while(p->s_inode[i]>=0) i++; </p><p> p->s_inode[i]=0; </p><p> p->s_ninode--;</p><p><b> return i
91、;</b></p><p><b> }</b></p><p> int namei(char *name) </p><p><b> { </b></p><p><b> int k=0;</b></p>&l
92、t;p> while(k<96){</p><p> if(p->s_inode[k]!=-1){ </p><p> fseek(f,BLOCK_SIZE+k*16,SEEK_SET);</p><p> fread(&file,sizeof(struct filelist),1,f);</p><p&
93、gt; if(!strcmp(file.name,name))</p><p> return file.inode_num;</p><p><b> }</b></p><p><b> k++;</b></p><p><b> };</b></p>
94、<p> return -1; </p><p><b> }</b></p><p> int name_i(char *name) </p><p><b> { </b></p><p><b> in
95、t k=0;</b></p><p><b> do</b></p><p><b> {</b></p><p> if(fcb[k].used==1) </p><p><b> { </b></p><p
96、> if(!strcmp(fcb[k].name,name)) </p><p> return fcb[k].inode_num;</p><p><b> }</b></p><p><b> k++;</b></p><p> }while(k<5);</p>
97、<p> return -1; </p><p><b> }</b></p><p> void create() </p><p><b> { </b></p><p> int i,inode
98、_num;</p><p><b> long t;</b></p><p> char name[12];</p><p> printf("input file name:");</p><p> scanf("%s",name);</p><p&g
99、t; getchar();</p><p> if(namei(name)!=-1) printf("file exited!\n");</p><p><b> else</b></p><p> { </p><p> inode_nu
100、m=ialloc(); </p><p> strcpy(file.name,name);</p><p> file.inode_num=inode_num;</p><p> fseek(f,BLOCK_SIZE+inode_num*16,SEEK_SET);</p><p> fwrite(&file,size
101、of(struct filelist),1,f);</p><p> inode.i_size=0; </p><p> inode.block_amount=0;</p><p> for(i=0;i<16;i++) inode.i_addr[i]=0;</p><p><b>
102、 time(&t);</b></p><p> strcpy(inode.create_time,ctime(&t));</p><p> fseek(f,4*BLOCK_SIZE+inode_num*sizeof(struct inode),SEEK_SET);</p><p> fwrite(&inode,sizeof
103、(struct inode),1,f);</p><p> p->s_inode[inode_num]=0; </p><p> printf("create sucessfully!\n");</p><p><b> }</b></p><p><b> }</
104、b></p><p> void display() </p><p><b> { </b></p><p><b> int k;</b></p><p> for(k=0;k<96;k++)</p><p><b&
105、gt; {</b></p><p> if(p->s_inode[k]>=0) </p><p><b> {</b></p><p> fseek(f,BLOCK_SIZE+k*16,SEEK_SET);</p><p> fread(&file,sizeof(struct
106、filelist),1,f); </p><p> printf("%s ",file.name);</p><p> fseek(f,4*BLOCK_SIZE+file.inode_num*sizeof(struct inode),SEEK_SET);</p><p> fread(&inode,sizeof(struct
107、 inode),1,f); </p><p> printf("size:? ",inode.i_size);</p><p> printf("time:%s\n",inode.create_time);</p><p><b> }</b></p><p>&l
108、t;b> };</b></p><p> printf("\n");</p><p> getchar();</p><p><b> }</b></p><p> void open_file() </p><p>
109、 { int i=0,j=0,k=0;</p><p><b> int m,n;</b></p><p> char name[12];</p><p> printf("input file's name:");</p><p> scanf("%s",na
110、me);</p><p> getchar();</p><p> n=namei(name); </p><p> if(n==-1) printf("file not exits!\n");</p><p> else if(p->s_inode[n]>0) printf(&
111、quot;file have already been opened!\n");</p><p><b> else{</b></p><p> while(fcb[i].used==1) i++; </p><p> while(table[j].f_node) j++; </p><p>
112、 while(fd[k].t_node) k++; </p><p> fd[k].t_node=&table[j]; </p><p> table[j].f_node=&fcb[i]; </p><p> strcpy(fcb[i].name,name);</p><p> fcb[
113、i].inode_num=n;</p><p> fcb[i].used=1;</p><p> fseek(f,4*BLOCK_SIZE+n*sizeof(struct inode),SEEK_SET);</p><p> fread(&inode,sizeof(struct inode),1,f);</p><p> fc
114、b[i].i_size=inode.i_size;</p><p> fcb[i].block_amount=inode.block_amount;</p><p> for(m=0;m<16;m++) fcb[i].i_addr[m]=inode.i_addr[m];</p><p> p->s_inode[n]=k+100;
115、</p><p> printf("file is open!\n");</p><p><b> }</b></p><p><b> }</b></p><p> void write_file() </p><p>
116、{ int sizeQ2;</p><p> int k,block_amount,n,size=0,i=0;</p><p> long block_num;</p><p> char ch,name[12];</p><p> printf("input file's name:");</p&
117、gt;<p> scanf("%s",name);</p><p> getchar();</p><p> n=name_i(name); </p><p> if(n==-1) printf("file not exits or not open!\n");</p>&
118、lt;p><b> else{</b></p><p> k=p->s_inode[n]-100; </p><p> ptr=fd[k].t_node->f_node;</p><p> while(i<ptr->block_amount)</p><p><b>
119、{</b></p><p> block_num=ptr->i_addr[i];</p><p> myfree(block_num);</p><p><b> i++;</b></p><p><b> }</b></p><p> block
120、_amount=0;</p><p> printf("input the context of the file:(end the file with '*')\n");</p><p> while((ch=getchar())!='*'&&block_amount<16){</p><p
121、><b> size++;</b></p><p> if(sizeQ2==1){ </p><p> block_num=myalloc(); </p><p> inode.i_addr[block_amount]=ptr->i_addr[block_amount]=block_num;</p
122、><p> block_amount++;</p><p> fseek(f,(block_num-1)*BLOCK_SIZE,SEEK_SET);</p><p><b> }</b></p><p> fputc(ch,f);</p><p><b> }</b>&
123、lt;/p><p> getchar();</p><p> inode.i_size=ptr->i_size=size;</p><p> inode.block_amount=ptr->block_amount=block_amount;</p><p> fseek(f,4*BLOCK_SIZE+n*sizeof(str
124、uct inode),SEEK_SET);</p><p> fwrite(&inode,sizeof(struct inode),1,f); </p><p><b> }</b></p><p><b> }</b></p><p> void read_file()
125、 </p><p><b> { </b></p><p> int k,n,block_amount,size;</p><p><b> int i=0;</b></p><p> long block_num;</p><p> char nam
126、e[12],buf[512];</p><p> printf("input file's name:");</p><p> scanf("%s",name);</p><p> getchar();</p><p> n=name_i(name); </p>
127、<p> if(n==-1) printf("file not exits or not open!");</p><p><b> else</b></p><p><b> {</b></p><p> k=p->s_inode[n]-100;</p>&l
128、t;p> ptr=fd[k].t_node->f_node;</p><p> size=ptr->i_size;</p><p> block_amount=ptr->block_amount;</p><p> for(i=0;i<block_amount;i++)</p><p><b>
129、 {</b></p><p> block_num=ptr->i_addr[i]; </p><p> fseek(f,(block_num-1)*BLOCK_SIZE,SEEK_SET); </p><p> if(size>512) {fread(buf,sizeof(char),512,f
130、); size=size-512;}</p><p><b> else</b></p><p><b> {</b></p><p> fread(buf,sizeof(char),size,f); </p><p> buf[size]='\0';</p&g
131、t;<p><b> }</b></p><p> printf("%s",buf);</p><p><b> }</b></p><p><b> }</b></p><p> printf("\n");<
132、;/p><p><b> }</b></p><p> void del_file() </p><p> { int n,i=0;</p><p> long block_num;</p><p> char name[12];</p><p
133、> printf("input file's name:");</p><p> scanf("%s",name);</p><p> getchar();</p><p> n=namei(name); </p><p> if(n==-1) printf(&
134、quot;file not exits!\n"); </p><p> else if(p->s_inode[n]>0) printf("file is open now!Close it first\n");</p><p><b> else{</b></p><p> p->s
135、_inode[n]=-1; </p><p> fseek(f,4*BLOCK_SIZE+n*sizeof(struct inode),SEEK_SET);</p><p> fread(&inode,sizeof(struct inode),1,f); </p><p> while(i<inode.block_amount){<
136、/p><p> block_num=inode.i_addr[i];</p><p> myfree(block_num); </p><p><b> i++;</b></p><p><b> }</b></p><p> strcpy(file.name,
137、""); </p><p> file.inode_num=0;</p><p> fseek(f,BLOCK_SIZE+n*16,SEEK_SET);</p><p> fwrite(&file,sizeof(struct filelist),1,f);</p><p> printf("
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機網(wǎng)絡(luò)課程設(shè)計_ftp文件傳輸
- 計算機網(wǎng)絡(luò)課程設(shè)計--文件傳輸協(xié)議的簡單設(shè)計與實現(xiàn)
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 《計算機網(wǎng)絡(luò)》課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 《計算機網(wǎng)絡(luò)》課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計報告
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 《計算機網(wǎng)絡(luò)課程設(shè)計》
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
- 計算機網(wǎng)絡(luò)課程設(shè)計
評論
0/150
提交評論