已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
題目: 用Socket編程實現(xiàn)FTP用Socket編程實現(xiàn)FTP 一、目的和意義(功能描述) 學習了TCP/IP這門課,接觸最多的是用Windows Sockets編程來實現(xiàn)一些功能。因此在熟悉了Windows Sockets的編程思想后,我覺的會很容易實現(xiàn)一個FTP的客戶應用程序。它能夠登錄FTP服務器,并從服務器端下載數(shù)據(jù)。數(shù)據(jù)同步傳輸系統(tǒng)既適合于服務器端的目錄遍歷,又適合客戶端對服務端的上傳文件和下載文件。運用Socket(套接字)接口和使用 FTP(文件傳輸協(xié)議)來實現(xiàn)客戶端和服務器端之間信息的交互。該數(shù)據(jù)傳輸平臺分為兩個模塊:服務器端模塊和客戶端模塊??蛻舴掌鞒绦蛲ㄟ^對編程語言 Visual C+6.0中的調(diào)用來實現(xiàn)利用TCP/IP協(xié)議中的 FTP協(xié)議和封裝在NMFTP 內(nèi)的Socket 接口進行客戶端與服務器連接,并完成數(shù)據(jù)同步工作,例如:上傳、下載、瀏覽、查詢、對服務器目錄與文件的管理以及執(zhí)行遠程命令等。 服務器端程序則持續(xù)的監(jiān)聽網(wǎng)絡。當接受到客戶端的Socket ,服務器程序提供相應的服務。網(wǎng)絡通信模塊使用POP3 控件來實現(xiàn)客戶端與服務器的信息交流。函數(shù)功能和流程如下:(1)首先創(chuàng)建一個CFtpclient的類的實例。(2)用LogOnToServer()函數(shù)登錄到指定的FTP服務器,允許非匿名用戶和匿名兩種登錄方式,默認的端口為21.(3)使用MoveFile()函數(shù)來上傳下載數(shù)據(jù)文件,其中第一個參數(shù)是本地地址,第二個參數(shù)是遠程地址,文件傳輸選用二進制模式。注意,文件傳輸使用同步模式。(4)可以使用Ftpcommand()函數(shù)來執(zhí)行FTP指令,包括常用的“CWD/home/mydir”來改變遠程服務器上的地址,并處理服務器返回的應答。當這種方式不適用的時候,還可以使用WriteStr()函數(shù)和ReadStr()函數(shù)向遠程服務器發(fā)送指令,并自己解釋返回的應答。(5)當所有的文件傳輸完成之后,使用LogOffServer函數(shù)來斷開與遠程服務器的連接。二、基本原理它的原理也相當?shù)暮唵?,客戶端程序?qū)崿F(xiàn)一個命令行或圖形界面,將用戶命令翻譯成 FTP 命令,并發(fā)送給服務器端程序。服務器端程序響應 FTP 命令,并將操作成功與否的信息以 FTP 響應形式返回給客戶端程序。雙方遵守 FTP 協(xié)議,完成文件傳輸服務。 就是利用MFC提供的CSocket類和CAsyncsocket類實現(xiàn)一個客戶/服務器模式的數(shù)據(jù)通信模式,使用CSocketFile類和CArchive類來讀寫數(shù)據(jù)。它很好的實現(xiàn)了所有的功能,提供了簡潔實用的接口。三、詳細設計Windows Sockets實現(xiàn),一個Windows Sockets實現(xiàn)是指實現(xiàn)了Windows Sockets規(guī)范所描述的全部功能的一套軟件。一般通過DLL文件來實現(xiàn)。Windows環(huán)境下進行網(wǎng)絡程序設計的最基本方法是應用Windows Sockets來實現(xiàn),通過使用MFC提供的Windows Sockets類,能夠很好的完成FTP的功能。連接管理:數(shù)據(jù)連接有3大用途:(1) 從客戶向服務器發(fā)送一個文件(2) 從服務器向客戶發(fā)送一個文件(3) 從服務器向客戶發(fā)送文件或目錄列表。每一個數(shù)據(jù)連接對傳輸一個文件或目錄序列都要建立一個新的連接。(1) 客戶發(fā)出命令要求建立數(shù)據(jù)連接(2) 客戶在客戶主機上未數(shù)據(jù)連接選擇一個固定的端口號(3) 客戶使用PORT命令從控制連接上把端口號發(fā)給服務器。(4) 服務器在控制連接上接收端口號,并向客戶端主機上的端口發(fā)出主動打開,服務器的數(shù)據(jù)連接使用端口21?;咎捉幼譃榱烁谜f明套接字編程原理,給出幾個基本的套接字,在以后的篇幅中會給出更詳細的使用說明。1、創(chuàng)建套接字socket()功能:使用前創(chuàng)建一個新的套接字格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);參數(shù):af: 通信發(fā)生的區(qū)域type: 要建立的套接字類型procotol: 使用的特定協(xié)議2、指定本地地址bind()功能:將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來。格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號)。其它:沒有錯誤,bind()返回0,否則SOCKET_ERROR地址結構說明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16位端口號,網(wǎng)絡字節(jié)順序struct in_addr sin_addr;/32位IP地址,網(wǎng)絡字節(jié)順序char sin_zero8;/保留3、建立套接字連接connect()和accept()功能:共同完成連接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);參數(shù):同上4、監(jiān)聽連接listen()功能:用于面向連接服務器,表明它愿意接收連接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5、數(shù)據(jù)傳輸send()與recv()功能:數(shù)據(jù)的發(fā)送與接收格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。6、多路復用select()功能:用來檢測一個或多個套接字狀態(tài)。格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);參數(shù):readfds:指向要做讀檢測的指針writefds:指向要做寫檢測的指針exceptfds:指向要檢測是否出錯的指針timeout:最大等待時間7、關閉套接字closesocket()功能:關閉套接字s格式:BOOL PASCAL FAR closesocket(SOCKET s);FTP 下載文件流程 FTP 服務端和客戶端之間存在兩中連接:一中用于傳輸 FTP 命令(命令必須由客戶端主動發(fā)起),連接始終存在;另一中用于向客戶端傳輸數(shù)據(jù),每當要傳輸文件或目錄文件列表信息時則建立一個數(shù)據(jù)連接,數(shù)據(jù)傳輸完畢立即斷開。 數(shù)據(jù)連接有兩種建立方式:客戶端監(jiān)聽某端口,服務器主動發(fā)起數(shù)據(jù)連接。服務器監(jiān)聽某端口,客戶端主動發(fā)起數(shù)據(jù)連接。下載文件之前首先需要登陸,登陸的狀態(tài)圖如圖 2 所示。如果前面發(fā)送的命令均得到成功響應,則表示服務器數(shù)據(jù)準備完畢。下面需要做的是與服務建立數(shù)據(jù)連接,開始接受數(shù)據(jù),并將接收到的數(shù)據(jù)保存在本地文件中,直到接收完畢后斷開數(shù)據(jù)連接,下載完畢。通過訪問全局變量獲得 FTP 服務器 IP 地址和端口號,以及登陸的用戶名和密碼,登陸服務器。 為了實現(xiàn)FTP下載文件能成功,我覺得用代碼和圖片解釋比較好,但文字描述不清楚,所以用代碼的比較多,雖然覺得不好,但我只能這樣。流程圖流程圖 1(一)FTP客戶端的主要代碼1.頭文件#include stdafx.h#include ListItem.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif2.創(chuàng)建ParseLine()函數(shù)BOOL CListItem:ParseLine(CString strLine)if(strLine.IsEmpty()return FALSE;char ch = strLine.GetAt(0);if(ch = d | ch = D)m_bDirectory = TRUE;elseif(ch = -)m_bDirectory = FALSE;elseif(strLine.Find() != -1 | strLine.Find() != -1)m_bDirectory = TRUE;elsem_bDirectory = FALSE;if(strLine.GetLength() 40)return FALSE;m_strName = strLine.Mid(39);m_strDate = strLine.Left(18);m_strName.TrimLeft();m_strName.TrimRight();return TRUE;m_bSec = 0;for(int i = 0; i 9; i+)ch = strLine.GetAt(i);if(ch = -)m_bSec |= 0x01;m_bSec 56)ndx = 51;elsereturn FALSE;m_index = ndx;m_strName = strLine.Mid(ndx + 3);m_strName.TrimLeft();m_strName.TrimRight();m_strDate = strLine.Mid(ndx - 9, 12);return TRUE;(二)客戶端運行后的界面圖2上面的圖是運行后在修改了用戶名和密碼,查出所需要的文件的I盤和文件名??蛻舳诉\行后看到的的服務器端地址是所用電腦的(三)FTP服務器端代碼1.Socket編程中的Server()函數(shù)UINT ServerThread(LPVOID lpParameter)SOCKET sListen, sAccept;SOCKADDR_IN inetAddr;DWORD dwFlags;DWORD dwRecvBytes;CServer * server =(CServer*)lpParameter; 2.創(chuàng)建第一個手動重置對象 if (g_events0 = WSACreateEvent() = WSA_INVALID_EVENT) printf(錯誤:WSACreateEvent failed with error %dn, WSAGetLastError(); return 0; 3. 創(chuàng)建一個線程處理請求 AfxBeginThread(ProcessTreadIO,(LPVOID)server); if (CreateThread(NULL, 0, ProcessTreadIO,(void*)server, 0, &dwThreadId) = NULL) printf(錯誤:CreateThread failed with error %dn, GetLastError(); return 0; g_dwEventTotal = 1; while(!server-m_bStop) /處理入站連接 if (sAccept = accept(sListen, NULL, NULL) = INVALID_SOCKET) printf(錯誤:accept failed with error %dn, WSAGetLastError(); return 0; /回傳歡迎消息 if( !server-WelcomeInfo( sAccept ) ) break; /設置ftp根目錄 if( !SetCurrentDirectory( server-m_Directory) ) break;4.創(chuàng)建一個新的SOCKET_INF結構處理接受的數(shù)據(jù)socket. if (g_socketsg_dwEventTotal = (LPSOCKET_INF) GlobalAlloc(GPTR,sizeof(SOCKET_INF) = NULL) printf(錯誤:GlobalAlloc() failed with error %dn, GetLastError(); return 0; 5.初始化新的SOCKET_INF結構 char buffDATA_BUFSIZE; memset( buff,0,DATA_BUFSIZE ); g_socketsg_dwEventTotal-wsaBuf.buf = buff; g_socketsg_dwEventTotal-wsaBuf.len = DATA_BUFSIZE; g_socketsg_dwEventTotal-s = sAccept; memset(&(g_socketsg_dwEventTotal-o),0, sizeof(OVERLAPPED); g_socketsg_dwEventTotal-dwBytesSend = 0; g_socketsg_dwEventTotal-dwBytesRecv = 0; g_socketsg_dwEventTotal-nStatus = WSA_RECV; / 接收6.下載數(shù)據(jù)的有關代碼/已經(jīng)有數(shù)據(jù)傳遞 if( pSI-nStatus = WSA_RECV ) . if( !g_bLoggedIn ) if( server-LoginIn(pSI) = LOGGED_IN )g_bLoggedIn = TRUE; else if(server-DealCommand( pSI )=FTP_QUIT) continue; / 緩沖區(qū)清除 memset( pSI-buffRecv,0,sizeof(pSI-buffRecv) ); pSI-dwBytesRecv = 0; else pSI-dwBytesSend += dwBytesTransferred; / 繼續(xù)接收以后到來的數(shù)據(jù) if(server-RecvReq( pSI ) = -1 ) return -1; return 0;./接受數(shù)據(jù)int CServer:RecvReq( LPSOCKET_INF pSI )static DWORD dwRecvBytes = 0;pSI-nStatus = WSA_RECV;return 0;7. 取得文件列表信息,并轉(zhuǎn)換成字符串BOOL bDetails = strstr(szCmd,LIST)?TRUE:FALSE;char buffDATA_BUFS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲公司入職培訓參考
- 餐飲業(yè)基本知識培訓課件
- 2026校招:比亞迪面試題及答案
- 2026校招:IT咨詢顧問題目及答案
- 餐廳安全消防培訓
- 2025年鄭州電力職業(yè)技術學院單招職業(yè)技能考試題庫及答案解析
- 信息化責任落實不到位問題整改措施報告
- 餐中服務培訓
- 外部合作方選擇評價標準
- 飛機發(fā)動機試車安全培訓
- 馬年猜猜樂(猜成語)打印版
- 黃斑變性教學課件
- 2026年湖南生物機電職業(yè)技術學院單招職業(yè)傾向性考試題庫新版
- 【企業(yè)盈利能力探析的國內(nèi)外文獻綜述2400字】
- 某氯堿化工有限公司離子膜燒堿項目可行性研究報告
- 民族與社會 第二講 什么是“民族”和“族群”.-職業(yè)教育-在線
- 多頭小直徑防滲墻工藝試驗方案
- 譯林版英語八年級上冊單詞表
- Deacon工藝在氯資源循環(huán)中的應用
- 銑工工藝與技能訓練-模塊八-綜合技能訓練課件
- 第4講:圓錐誤差(2-1)
評論
0/150
提交評論