【文章內(nèi)容簡(jiǎn)介】
調(diào)用Listen,開始監(jiān)聽從客戶端發(fā)來的訪問請(qǐng)求。如果收到請(qǐng)求,調(diào)用CAsyncSocket::Accept()函數(shù)進(jìn)行接收外理。建立CSocketFile對(duì)象,并且使該對(duì)象與CSocket對(duì)象具備一定的聯(lián)系。建立Carchive對(duì)象,以便實(shí)現(xiàn)卸裝(接收)數(shù)據(jù)和存儲(chǔ)(發(fā)送)數(shù)據(jù)的目的地址。當(dāng)然,該Carchive對(duì)象應(yīng)該與前面的CSocketFile對(duì)象建立聯(lián)系。使用Carchive對(duì)象在客戶和服務(wù)器Socket之間傳遞數(shù)據(jù),從而實(shí)現(xiàn)服務(wù)器Socket和客戶機(jī)Socket之間的通信。值得注意的是,一個(gè)給定的Carchive對(duì)象只能在單一的方向上傳遞數(shù)據(jù):或者接收,或者發(fā)送。一般情況下,可能需要兩個(gè)Carchive對(duì)象來實(shí)現(xiàn)數(shù)據(jù)的雙向傳遞。菜單攔包括:服務(wù)器,查看。服務(wù)器菜單包括:開始,停止,用戶賬戶向?qū)?,用戶賬戶等功能。查看菜單包括:服務(wù)器日志,在線用戶,配置,統(tǒng)計(jì),安全等功能。各項(xiàng)功能實(shí)現(xiàn)如下: 服務(wù)器功能:(1)帳戶向?qū)В寒?dāng)你 登錄服務(wù)器時(shí)你需要一個(gè)有效的賬戶,用戶帳戶向?qū)⒁龑?dǎo)您通過必要的步驟,創(chuàng)造一個(gè)新的用戶帳戶。并將其添加到用戶帳戶對(duì)話框,創(chuàng)建用戶名,如圖6所示。圖6 用戶帳戶向?qū)Т翱谕ㄟ^這個(gè)窗口你可以創(chuàng)建自己的用戶名以及密碼用以登陸FTP服務(wù)器,該部分功能實(shí)現(xiàn)代碼如下:(2)用戶帳戶功能:這一功能主要是服務(wù)器端添加,修改和刪除用戶帳戶,設(shè)置目錄權(quán)限(使用添加按鈕以添加一個(gè)新目錄,其中選定的用戶帳戶已具有訪問權(quán)限,每小組目錄您可以設(shè)定不同的權(quán)限,例如你可以給所有權(quán)限到C:下載,但限制的權(quán)限為C :下載申請(qǐng)時(shí),沒有權(quán)限指定的目錄,在這個(gè)目錄中它會(huì)自動(dòng)阻止用戶要求上傳任何子目錄)。目錄屬性,當(dāng)您添加的編輯目錄的用戶帳戶,目錄屬性對(duì)話框?qū)@示物理目錄(物理目錄是39。真正39。的路徑文件夾的名稱)。虛擬目錄(虛擬目錄是一個(gè)物理文件夾的別名,當(dāng)用戶連接到您的FTP服務(wù)器,它將看到這個(gè)目錄名而不是真正的物理名稱)。設(shè)制服務(wù)端允許客戶端的權(quán)限,例如允許客戶端可以下載,上傳,重命名哪些服務(wù)器端的文件內(nèi)容。例如用戶123將: E:盤設(shè)為許可目錄,客戶端就可以隨時(shí)下載,上傳E:盤里面的內(nèi)容,如圖7所示。圖7 用戶帳戶窗口 查看功能模塊(1)服務(wù)器日志模塊的功能:在此屏幕,記錄客戶端與服務(wù)器端的連接信息以及傳輸信息,當(dāng)客戶端登陸服務(wù)器時(shí)服務(wù)器日志會(huì)顯示是否與服務(wù)器連接成功,當(dāng)客戶端要上傳文件或是下載文件成功時(shí)會(huì)記錄服務(wù)器和FTP客戶端的詳細(xì)資料,從而有助于您追蹤服務(wù)器與客戶端之間所有的通訊訊息,數(shù)目之間的方括號(hào)[ ]是線程ID,如圖8所示。圖8 服務(wù)器日志窗口(2)在線用戶模塊的功能:通過服務(wù)器來查看在線客戶端的用戶名,用戶IP地址,用戶登陸時(shí)間等信息,如圖9所示。圖9 在線用戶窗口(3)配置模塊的功能:配置FTP服務(wù)器所有的設(shè)置。默認(rèn)服務(wù)器端口為21,可以同時(shí)連接最多用戶數(shù),客戶端與服務(wù)器端連接時(shí)間(當(dāng)客戶端已閑置的具體時(shí)間,它會(huì)自動(dòng)斷開),歡迎信息(當(dāng)客戶端連接到服務(wù)器時(shí)將會(huì)顯示該文本),再見訊息(文本將顯示當(dāng)一個(gè)客戶端從服務(wù)器斷開時(shí))其他設(shè)置,F(xiàn)TP服務(wù)器在Windows下啟動(dòng),啟動(dòng)最小化在系統(tǒng)盤,并在啟動(dòng)時(shí)自動(dòng)激活服務(wù)器。用戶還可以將用戶各種信息都記錄在服務(wù)器日志里,如圖10所示。圖10 配置界面三、實(shí)驗(yàn)結(jié)論本次實(shí)驗(yàn)實(shí)現(xiàn)了一個(gè)基于FTP協(xié)議的服務(wù)器系統(tǒng),基本完成了FTP服務(wù)器所需的大多數(shù)功能。用戶能夠選擇相應(yīng)的數(shù)據(jù)傳輸模式,對(duì)指定的文件進(jìn)行上傳下載。通過該程序的開發(fā),涵蓋了一個(gè)FTP服務(wù)器所應(yīng)該具有的功能,能夠解釋一般的FTP命令,符合相應(yīng)的規(guī)范。四、參考文獻(xiàn)[1][D].電子科技大學(xué),2005.[2]王占軍,王偉,[J].沈陽師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2012,03:375377.[3]吳珂,盧秉亮,[J].沈陽航空工業(yè)學(xué)院學(xué)報(bào),2006,04:、源代碼// : source file that includes just the standard includes // will be the prepiled header // will contain the prepiled type informationinclude “” CString BrowseForFolder(HWND hWnd, LPCSTR lpszTitle, UINT nFlags){ // We39。re going to use the shell to display a// “Choose Directory” dialog box for the strResult = “。LPMALLOC lpMalloc。if(::SHGetMalloc(amp。lpMalloc)!= NOERROR){// failed to get allocatorreturn strResult。}char szBuffer[_MAX_PATH]。char szDisplayName[_MAX_PATH]。BROWSEINFO browseInfo。 = hWnd。// set root at Desktop = NULL。 = szDisplayName。 = lpszTitle。 = nFlags。 = NULL。 = 0。LPITEMIDLIST lpItemIDList。if((lpItemIDList = ::SHBrowseForFolder(amp。browseInfo))!= NULL){// Get the path of the selected folder from the item ID (::SHGetPathFromIDList(lpItemIDList, szBuffer)){// At this point, szBuffer contains the path the user (szBuffer[0] == 39。39。){// SHGetPathFromIDList failed, or SHBrowseForFolder (”Failed to get directory“, MB_ICONSTOP|MB_OK)。return strResult。}// We have a path in szBuffer!strResult = szBuffer。return strResult。}else{// The thing referred to by lpItemIDList// might not have been a file system object.// For whatever reason, SHGetPathFromIDList didn39。t work!AfxMessageBox(”Failed to get directory“, MB_ICONSTOP|MB_OK)。return strResult。// strResult is empty}lpMallocFree(lpItemIDList)。lpMallocRelease()。} return strResult。}void DoEvents(){ MSG msg。// window messagewhile(PeekMessage(amp。msg,NULL,NULL,NULL,PM_REMOVE)){TranslateMessage(amp。msg)。DispatchMessage(amp。msg)。}} void GetAppDir(CStringamp。 strAppDir){ TCHAR szFullPath[MAX_PATH]。TCHAR szDir[_MAX_DIR]。TCHAR szDrive[_MAX_DRIVE]。// Get application39。s full path.::GetModuleFileName(NULL, szFullPath, MAX_PATH)。// Break full path into seperate (szFullPath, szDrive, szDir, NULL, NULL)。// Sto