用VC++5.0编写Ftp客户程序
2008-11-14 19:34:49 来源:WEB开发网BOOL CMainFrame::MakeRemoteDir()
{
if(m_ctrlconn==NULL)
{
(“请连接到服务器!”,“提示”,MB_iconwarwing);
retrurn FALSE;
}
if(!MakeDataListen())
{
MessageBox(“数据链路建立失败!”,“提示”,MB_ICONWARNING);
return FALSE;
}
……
return TRUE;
}
//处理来自远端服务器的响应
BOOL CMainFrame::Processftp()
{
………
}
//建立数据连接“监听”函数
BOOL CMainFrame::MakeDataListen()
{
……
m_dataconn=new Listensocket();
/* 建立一个SOCKET,并与本地主机地址捆绑。作为一个例子,直接插入了本机的IP地址“90.0.0.8”,而在实际应用中应首先通过相应的函数调用取得本地主机地址。
注意:如果不采用VC++的CSocket类而用其它的方法,需在建立SOCKET之后,调用bind()函数来进行与本地主机地址的捆绑。*/
if(!m_dataconn->Create(0,SOCK_STREAM,“90.0.0.8”))
{
delete m_dataconn;
m_dataconn=NULL;MessageBox(“Socket()建立失败!”,“提示”,MB_ICONWARNING);
return FALSE;
}
//申请网络事件通知
if(!m_dataconn->AsyncSelect(FD_ACCEPT))
{
delete m_dataconn;
m_dataconn=NULL;
MessageBox(“AsyncSelect()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
}
……
if(!m_dataconn->Listen(5))
{
MessageBox(“listen()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
}
……
}
//接受数据连接请求的函数
BOOL CMainFrame::AcceptDataConn()
{
int num,nRet;
SOCKADDR_IN RemoteDataAddr;
num=sizeof(SOCKADDR_IN);
if(m_recvconn==NULL)
{
m_recvconn=new Datasocket();
}
if(!m_dataconn->Accept(*m_recvconn,(LPSOCKADDR)&RemoteDataAddr,(int FAR*)&num))
{
MessageBox(“accept()错误!”,“提示”,MB_ICONWARWING);
return FALSE;
}
……
m_dataconn->Close();
//申请网络事件通知
if(!m_recvconn->AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE)
{
MessageBox(“Asyncselect()错误!”,“提示”,MB_ICONWARNING);
return FALSE;
}
return TRUE;
}
//数据接受函数,接受来自远端服务器的数据
int CMainFrame::RecvData()
{
……
int nRet=m_recvconn->Receive(…);
if (nRet>0)
{
…
}
else
{
…
}
……
}
2.ctrlsocket.cpp
……
void ctrlsocket::OnReceive(int nErrorCode)
{
//处理网络事件FD_READ
CSocket::OnReceive(nErrorCode);
((CmainFrame *)(AfxGetApp()->m_pMainWnd))->Processftp();
}
3.Listensocket.cpp
……
void Listensocket::OnAccept(int nErrorCode)
{
//处理网络事件FD_ACCEPT
CSocket::OnAccept(nErrorCode);
((CmainFrame*)AfxGetApp()->m_pMainWnd))->AcceptDataConn();
}
4.Datasocket.cpp
……
Datasocket::OnReceive(int nErrorCode)
{
//处理网络事件FD_READ
CAsyncSocket::OnReceive(nErrorCode);
((CMainFrame*)(AfxGetApp()->m_pMainWnd))->RecvData();
}
void Datasocket::OnSend(int nErrorCode)
{
//处理网络事件FD_WRITE
CAsyncSocket::OnSend(nErrorCode);
((CMainFrame*)(AfxGetApp()->m_pMainWnd))->SendData();
}
更多精彩
赞助商链接