freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一個基于linux的ftp系統(tǒng)畢業(yè)論文-資料下載頁

2024-11-12 16:04本頁面

【導(dǎo)讀】FTP客戶機可以給服務(wù)器發(fā)出命令來下載文件,上載文件,創(chuàng)建或改。變服務(wù)器上的目錄等功能。雖然這是一個小型的ftp程序,但它基本上實現(xiàn)了ftp. 它是在任何linux系列的系統(tǒng)上運行,用linuxgcc編譯工具。FTP協(xié)議是一款基于TCP/IP的協(xié)議TCP. 由于網(wǎng)絡(luò)的帶寬及各種服務(wù)的。限制,單純從頁面上下載顯得又慢又不可靠,所以就有許多FTP工具提供出來。根本上說,F(xiàn)TP就是在網(wǎng)絡(luò)中各種不同的計算機之間按照TCP/IP協(xié)議來傳輸文件。通常服務(wù)器端是遠(yuǎn)程端點,用戶可以通過Inter網(wǎng)絡(luò)連接到遠(yuǎn)程的FTP. 只有當(dāng)FTP服務(wù)器支持各種協(xié)議和指令時,才能夠開發(fā)相應(yīng)的客戶端程序。下面就是整個ftp項目的設(shè)置思路。

  

【正文】 服務(wù)器文件名一模一樣的文件,并打開它,把從服務(wù)器接收的數(shù)據(jù)寫進(jìn)此文件,這就是 LOAD 文件。 ftp 實現(xiàn)中的主動與被動方式。 主動方式 FTP 的主要問題實際上在于客戶端。 FTP 的客戶端并沒有實際建立一個到服務(wù)器數(shù)據(jù)端口的連接,它只是簡單的告訴服務(wù)器自己監(jiān)聽的端口號,服務(wù)器再回來連接客戶端這個指定的端口。對于客戶端的防火墻來說,這是從外部系統(tǒng)建立到內(nèi)部客戶端的連接,這是通常會被阻塞的。 這是問題之一,如果你在客戶端開了防火墻的話的 ,那么采用這種方式,客戶端是不能與服務(wù)器正常的通信的??蛻舳讼认蚍?wù)器端發(fā)送 port 命令,告訴服務(wù)器我客戶端正在監(jiān)聽的端口號,服務(wù)器收到此端口號就會主動的連接客戶端所指定的這個端口號。這樣客戶端與服務(wù)器就會連接起來了。之后客戶端與服務(wù)器之間就可以通信了。 被 動方式的 FTP 是這樣的 : 在被動方式 FTP 中,命令連接和數(shù)據(jù)連接都由客戶端,這樣就可以解決從服務(wù)器到客戶端的數(shù)據(jù)端口的 進(jìn) 入方向連接被防火墻過濾掉的問題。當(dāng)開啟一個 FTP 連接時,客戶端打開兩個任意的非特權(quán)本地端口( N1024和 N+1)。第一個端口連接服務(wù)器 的 21 端口,但與主動方式的 FTP 不同,客戶端不會提交 PORT 命令并允許服務(wù)器來回連它的數(shù)據(jù)端口,而是提交 PASV 命令。這樣做的結(jié)果是服務(wù)器會開啟一個任意的非特權(quán)端口( P1024) , 并發(fā)送 PORT P命令給客戶端。然后客戶端發(fā)起從本地端口 N+1 到服務(wù)器的端口 P的連接用來傳送數(shù)據(jù)。 對于服務(wù)器端的防火墻來說,必須允許下面的通訊才能支持被動方式的 FTP: 1).從任何端口到服務(wù)器的 21 端口(客戶端初始化的連接 S?C) 。 2).服務(wù)器的 21 端口到任何大于 1023 的端口(服務(wù)器響應(yīng)到客戶端的控制端口的連接 S?C) 。 3).從任何端口到服務(wù)器的大于 1023 端口(入;客戶端初始化數(shù)據(jù)連接到服務(wù)器指定的任意端口 S?C) 。 4).服務(wù)器的大于 1023 端口到遠(yuǎn)程的大于 1023 的端口(出;服務(wù)器發(fā)送 ACK響應(yīng)和數(shù)據(jù)到客戶端的數(shù)據(jù)端口 S?C) 。 對于用戶客戶端的防火墻來說被動方式算是內(nèi)網(wǎng),所以防火墻不會阻止客戶端與服務(wù)器之間的連接??蛻舳讼蚍?wù)器發(fā)送 PASV 命令告訴服務(wù)器進(jìn)行被動連接,服務(wù)器就受到此命令就會向服務(wù)器發(fā)送一個 port 命令告訴客戶端服務(wù)器此時監(jiān)聽的端口號,讓客戶端來連接。主動和被動都是相對于服務(wù)器來說的,服務(wù)器 connect 的就是主動,而客戶端 listen 監(jiān)聽的話就是主動,而服務(wù)器 listen 監(jiān)聽而客戶端connect 的話就是被動。 編程中主要用的的函數(shù)或庫。 API 有: include sys/ /* See NOTES */ include sys/ int socket(int domain, int type, int protocol)。 domain 協(xié)議族信息 type 協(xié)議類型 protocol 所說是用的協(xié)議 這個函數(shù)創(chuàng)建一個 socket 返 回一個 socket 文件描述符 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)。 sockfd 就是 socket 文件描述符 struct sockaddr { sa_family_t sa_family。 char sa_data[14]。 } Socket 地址結(jié)構(gòu)體類型 Addrlen 地址結(jié)構(gòu)體類型的長度 該函數(shù)將綁定自己的 ip 地址和端口號 int listen(int sockfd, int backlog)。 sockfd socket 描述符 backlog 監(jiān)聽的數(shù)目 監(jiān)聽函數(shù) 開始監(jiān)聽客戶端的連接 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)。 開始接受連接函數(shù),此函數(shù)啟動后就會與客戶端連接,以上是服務(wù)器的 socket 流程。 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)。 連接函數(shù) 建立連接; 下面函數(shù)是真正的通過 socket 套接字接受數(shù)據(jù)函數(shù) ssize_t recv(int sockfd, void *buf, size_t len, int flags)。 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)。 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)。 也可以使用標(biāo)準(zhǔn)的文件的讀函數(shù) ssize_t read(int fd, void *buf, size_t count)。 下面函數(shù)是真正的通過 socket 套接字發(fā)送數(shù)據(jù)函數(shù) ssize_t send(int sockfd, const void *buf, size_t len, int flags)。 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)。 ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)。 也可以使用標(biāo)準(zhǔn)的文件的寫函數(shù) ssize_t write(int fd, const void *buf, size_t count)。 示例: include sys/ include sys/ include include include define MY_SOCK_PATH /somepath define LISTEN_BACKLOG 50 define handle_error(msg) \ do { perror(msg)。 exit(EXIT_FAILURE)。 } while (0) int main(int argc, char *argv[]) { int sfd, cfd。 struct sockaddr_un my_addr, peer_addr。 socklen_t peer_addr_size。 sfd = socket(AF_UNIX, SOCK_STREAM, 0)。 if (sfd == 1) handle_error(socket)。 memset(amp。my_addr, 0, sizeof(struct sockaddr_un))。 /* Clear structure */ = AF_UNIX。 strncpy(, MY_SOCK_PATH, sizeof() 1)。 if (bind(sfd, (struct sockaddr *) amp。my_addr, sizeof(struct sockaddr_un)) == 1) handle_error(bind)。 if (listen(sfd, LISTEN_BACKLOG) == 1) handle_error(listen)。 /* Now we can accept ining connections one at a time using accept(2) */ peer_addr_size = sizeof(struct sockaddr_un)。 cfd = accept(sfd, (struct sockaddr *) amp。peer_addr, amp。peer_addr_size)。 if (cfd == 1) handle_error(accept)。 /* Code to deal with ining connection(s)... */ /* When no longer required, the socket pathname, MY_SOCK_PATH should be deleted using unlink(2) or remove(3) */ } 這個示例 是從創(chuàng)建 socket 然后 bind 綁定 到 listen 監(jiān)聽 該項目服務(wù)器是要處理多的客戶端的服務(wù)器所以我們會使用多進(jìn)程編程,或使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)。 void FD_CLR(int fd, fd_set *set)。 int FD_ISSET(int fd, fd_set *set)。 void FD_SET(int fd, fd_set *set)。 void FD_ZERO(fd_set *set)。 用 select 輪訓(xùn)來處理多個客戶端的請求?;蛘呤褂枚鄠€進(jìn)程,讓每一個進(jìn)程處理一個客戶端的請求。相關(guān) API 如下: include pid_t fork(void)。該函數(shù)創(chuàng)建一個進(jìn)程,并返回進(jìn)程 ID 號 服務(wù)器主函數(shù)流程如下: Int main() { int socket(int domain, int type, int protocol)。 創(chuàng)建 socket 套接字; int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)。 綁定服務(wù)器的 ip 和端口號 int listen(int sockfd, int backlog)。 開始監(jiān)聽 While( 1) { int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)。 pid = fork(); if(pid 0) { Perror(“fork”)。 Exit(1)。 }elseif(pid == 0) { Close(listen_socket)。關(guān)閉監(jiān)聽套接字 子進(jìn)程處理客戶端請求; ssize_t recv(int sockfd, void *buf, size_t len, int flags)。 ssize_t send(int sockfd, const void *buf, size_t len, int flags)。 }else { 父進(jìn)程什么都不做; } } Return 0。 } 客戶端主函數(shù)流程如下: Int main() { int socket(int domain, int type, int protocol)。 創(chuàng)建 socket 套接字; int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)。 綁定服務(wù)器的 ip 和端口號 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)。 連接請求,連接服務(wù)器; ssize_t send(int sockfd, const void *buf, size_t len, int flags)。 ssize_t recv(int sockfd, void *buf, size_t len, int flags)。 向服務(wù)器發(fā)送接收數(shù)據(jù); } 服務(wù)器與客戶端連接流程圖: 第 五 章 系統(tǒng)測試 經(jīng)過幾次的軟件測試發(fā)現(xiàn)系統(tǒng)存在著一些不足之處。具體為: 1) 當(dāng)客戶端與服務(wù)器建立連接時,有時連接較慢。 2) 當(dāng)用戶向服務(wù)器上傳文件時可能會傳輸中斷,服務(wù)器仍然存在一些不穩(wěn)定的數(shù)據(jù)連接。 1)黑盒測試 在黑盒測試中,軟件測試員只要知道軟件要做什么 —— 而無法看到盒子里的軟件是如何運行的。只要進(jìn)行一些輸入,就能得到某種輸出結(jié)果。他不知道軟件如何運行,為什么會這樣,只知道程序做了什么。 2)白盒測試 在白盒測試(有時稱為 透明盒測試)中,軟件測試員可以訪誤碼程序員的代碼,并通過檢查代碼的線索來協(xié)助測試 —— 可以看到盒了里面。測試員根據(jù)代碼檢查結(jié)果判斷或多或可能出錯的數(shù)目,并據(jù)此定制測試 [8]。 在編寫程序時有時會遇到運行錯誤,這是由于有的地方代碼編寫錯誤只有改寫一下就可以了。首先因為創(chuàng)建的是服務(wù)器端,所以先登陸自己的服務(wù)器,為了查看服務(wù)器是否能夠運行,又配置來了一個客戶端,在二臺電腦中實現(xiàn)客戶端與服務(wù)器端之間文件的傳輸。首先用客戶端登陸服務(wù)器,與服務(wù)器建立連接,然后上傳,下載文件,看看服務(wù)器端有什 么反應(yīng),但是有時會發(fā)現(xiàn)雖然建立了連接,但是文件傳輸有時會失敗。而且這個服務(wù)器不可以匿名登陸所以當(dāng)客戶端匿名登陸時無法與服務(wù)器連接,只有用有效的用戶名才可以與服務(wù)器建立連接。 結(jié)論 畢業(yè)設(shè)計是本科學(xué)習(xí)階段一次非常難得的理論與實際相結(jié)合的機會,通過這次比較完整的 小型 FTP 系統(tǒng) 計,我擺脫了單純的理論知識學(xué)習(xí)狀態(tài), 而 實際設(shè)計的結(jié)合鍛煉了我的綜合運用所學(xué)的專業(yè)基礎(chǔ)知識,解決實際工程問題的能力,同時也提高我查閱文獻(xiàn)資料、設(shè)計手冊、設(shè)計規(guī)范以及電腦能力水平,而且通過對整體的掌控,對局部的取舍,以及對細(xì)節(jié)的斟酌處理, 都使我的能力得到了鍛煉,經(jīng)驗得到了豐富 , 這是我們都希望看到的也正是我們進(jìn)行畢業(yè)設(shè)計的目的所在。 雖然畢業(yè)設(shè)計內(nèi)容繁多,過程繁瑣但我的收獲卻更加豐富。 以前我對 VC++了解不會很明確,但是現(xiàn)在我了解了 VC++的運行環(huán)境,使用方法,以及一些命令的使用。以往編程時,不注意編程規(guī)范,致使程序運行不出來,現(xiàn)在在編寫程序時很注意編寫規(guī)范,以前一些控件不會使用,現(xiàn)在也都可以熟練使用了, 在設(shè)計過程中一些 功能的實現(xiàn) 讓我很頭痛,原因是由于本身設(shè)計受到 編程語言的限制 ,而又必須考慮本專業(yè)的一些要求規(guī)范,從而形成了一些矛盾點,這些矛盾 在處理上讓人很難斟酌,正是基于這種考慮我意識到 , 要 想 更完美的進(jìn)行一次設(shè)計,與他人的交流溝通是很有必要的 。 提高是有限的但提高也是全面的,正是這一次設(shè)計讓我積累了無數(shù)實際經(jīng)驗,使我的頭腦更好的被知識武裝了起來,也必然會讓我在未來的工作學(xué)習(xí)中表現(xiàn)出更高的應(yīng)變能力,更強的溝通力和理解力。 順利如
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1