FTP協(xié)議將使用兩條單獨(dú)的TCP連接,一條專用于發(fā)送FTP命令,另一條則專用于傳遞數(shù)據(jù)。初始建立連接時(shí),服務(wù)器在21號(hào)端口上接收來(lái)自客戶端的命令連接。當(dāng)需要傳送數(shù)據(jù)時(shí)(文件列表、文件數(shù)據(jù)等),客戶端向服務(wù)器發(fā)出Port命令,并進(jìn)入監(jiān)聽(tīng)狀態(tài),等待來(lái)自服務(wù)器的數(shù)據(jù)連接請(qǐng)求。
首先我們利用VC++6.0的AppWizard創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,命名為FtpClientDemo。調(diào)整主對(duì)話框的形式如圖1,為程序生成五個(gè)基于CAsyncSocket的新類,限于篇幅,只列出主要代碼。
■CCommandSocket類的主要代碼
voidCCommandSocket::OnReceive(intnErrorCode)
{
//這個(gè)函數(shù)使得服務(wù)器的應(yīng)答消息顯示在編輯框上
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,1024,0);
//接收應(yīng)答消息
MessageList+=buffer;
m_ReturnMessage-〉SetWindowText(MessageList);
deletebuffer;
}
■CFileSocket類的主要代碼
voidCFileSocket::OnReceive(intnErrorCode)
{
//函數(shù)將收到的文件數(shù)據(jù)寫(xiě)到文件中
if(File==NULL)
{File=newCFile();
File-〉Open(FileName,CFile::modeWrite|CFile::modeCreate);
}
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,4096,0);
ReceiveString=buffer;
File-〉Write(ReceiveString,ReceiveString.GetLength());
deletebuffer;
}
首先我們利用VC++6.0的AppWizard創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,命名為FtpClientDemo。調(diào)整主對(duì)話框的形式如圖1,為程序生成五個(gè)基于CAsyncSocket的新類,限于篇幅,只列出主要代碼。
■CCommandSocket類的主要代碼
voidCCommandSocket::OnReceive(intnErrorCode)
{
//這個(gè)函數(shù)使得服務(wù)器的應(yīng)答消息顯示在編輯框上
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,1024,0);
//接收應(yīng)答消息
MessageList+=buffer;
m_ReturnMessage-〉SetWindowText(MessageList);
deletebuffer;
}
■CFileSocket類的主要代碼
voidCFileSocket::OnReceive(intnErrorCode)
{
//函數(shù)將收到的文件數(shù)據(jù)寫(xiě)到文件中
if(File==NULL)
{File=newCFile();
File-〉Open(FileName,CFile::modeWrite|CFile::modeCreate);
}
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,4096,0);
ReceiveString=buffer;
File-〉Write(ReceiveString,ReceiveString.GetLength());
deletebuffer;
}