【VC开源代码栏目提醒】:网学会员VC开源代码为您提供FtpClient1.cpp参考,解决您在FtpClient1.cpp学习中工作中的难题,参考学习。
// FtpClient1.cpp: implementation of the CFtpClient class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FtpClient.h"
#include "FtpClient1.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFtpClient::CFtpClient()
{
m_sockCtrl = INVALID_SOCKET;
m_listString.RemoveAll();
m_dwTimeout = 2000;
m_bConnected = FALSE;
m_findFile.RemoveAll();
memset(&m_sockAdSrvr,'\0',sizeof(m_sockAdSrvr));
m_sockAdSrvr.sin_family = AF_INET;
#define NAMELENGTH 88
char chName[NAMELENGTH];
LPHOSTENT lphost;
gethostname(chName,NAMELENGTH);
lphost = gethostbyname(chName);
ASSERT(lphost);
m_sockAdSrvr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
m_nAddress[0] = m_sockAdSrvr.sin_addr.S_un.S_un_b.s_b1;
m_nAddress[1] = m_sockAdSrvr.sin_addr.S_un.S_un_b.s_b2;
m_nAddress[2] = m_sockAdSrvr.sin_addr.S_un.S_un_b.s_b3;
m_nAddress[3] = m_sockAdSrvr.sin_addr.S_un.S_un_b.s_b4;
}
CFtpClient::~CFtpClient()
{
}
BOOL CFtpClient::Connect(LPCTSTR strAddress, LPCTSTR strUser, LPCTSTR strPassword, UINT nPort /*=21*/)
{
if (m_bConnected)
return TRUE;
// 获得服务器地址
memset(&m_sockAdSrvr,'\0',sizeof(m_sockAdSrvr));
m_sockAdSrvr.sin_family = AF_INET;
m_sockAdSrvr.sin_port = htons((u_short)nPort);
m_sockAdSrvr.sin_addr.s_addr = inet_addr(strAddress);
// 初始化控制连接套接字
m_sockCtrl = socket(AF_INET,SOCK_STREAM,0);
if (m_sockCtrl == INVALID_SOCKET)
{
m_sError = _T("初始化套接字失败");
return FALSE;
}
// 如果主机名不是IP地址,用gethostbyname获得其IP地址
LPHOSTENT lphost;
if (m_sockAdSrvr.sin_addr.s_addr == INADDR_NONE)
{
lphost = gethostbyname(strAddress);
if (lphost)
m_sockAdSrvr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
m_sError = _T("无法解析地址!");
return FALSE;
}
}
// 尝试与服务器连接
if (connect(m_sockCtrl,(SOCKADDR *)(&m_sockAdSrvr),sizeof(m_sockAdSrvr)) == SOCKET_ERROR)
{
m_sError = _T("无法与服务器建立连接!");
return FALSE;
}
// 设置套接字的属性
setsockopt(m_sockCtrl,SOL_SOCKET,SO_LINGER,NULL,0);
setsockopt(m_sockCtrl,SOL_SOCKET,SO_KEEPALIVE,NULL,0);
// 获得服务器的回应
if (!GetResponse())
{
return FALSE;
}
// 记录连接信息,这也是登录信息的一部分
CString strTemp;
strTemp.Format("已与%s建立连接",strAddress);
strTemp += "\r\n";
m_listString.AddTail(strTemp);
m_sResponse += "\r\n";
m_listString.AddTail(m_sResponse);
// 发送用户名
strTemp.Format("USER %s\r\n",strUser);
if (!Send(strTemp,strTemp.GetLength()))
{
return FALSE;
}
if (!GetResponse())
{
return FALSE;
}
m_listString.AddTail(strTemp);
m_sResponse += "\r\n";
m_listString.AddTail(m_sResponse);
// 发送密码
strTemp.Format("PASS %s\r\n",strPassword);
if (!Send(strTemp,strTemp.GetLength()))
{
return FALSE;
}
if (!GetResponse())
{
return FALSE;
}
// 不显示密码
m_listString.AddTail(_T("PASS ****\r\n"));
m_sResponse += "\r\n";
m_listString.AddTail(m_sResponse);
// 已经与服务器建立连接
m_bConnected = TRUE;
// 请求服务器给出当前目录信息
return List();
}
LPCTSTR CFtpClient::GetErrorString()
{
return m_sError;
}
BOOL CFtpClient::Send(LPCTSTR strSend, UINT nLength)
{
return send(m_sockCtrl,strSend,nLength,0) != SOCKET_ERROR;
}
#define BUFFERSIZE 1188
BOOL CFtpClient::GetResponse()
{
char pChar[BUFFERSIZE];
BOOL bEnd = FALSE;
UINT nReceived = 0;
DWORD dwStart = ::GetTickCount();
// 读取回应信息
while (!bEnd)
{
// 尝试时间到
if ((::GetTickCount() - dwStart) > m_dwTimeout)
{
pChar[nReceived] = '\0';
m_sError = _T("超时");
// 保存当前回应的消息
m_sResponse = pChar;
return FALSE;
}
timeval timeout = {m_dwTimeout / 1000,m_dwTimeout % 1000};
fd_set fds;
FD_ZERO(&fds);
FD_SET(m_sockCtrl,&fds);
// 看套接字是否可读
int nStatus = select(0,&fds,NULL,NULL,&timeout);
if (nStatus == SOCKET_ERROR)
return FALSE;
// 从套接字中接收数据
::Sleep(188);
nStatus = recv(m_sockCtrl,pChar + nReceived,BUFFERSIZE,0);
if (nStatus == SOCKET_ERROR)
{
pChar[nReceived] = '\0';
// 套接字错误
m_sError = _T("未能从套接字中收到数据!");
// 保存当前回应信息
m_sResponse = pChar;
return FALSE;
}
else if (nStatus)
{
// 重置计时器
dwStart = ::GetTickCount();
// 已收到的数据又增加了
nReceived += nStatus;
}
// 将pChar设为字符串,并赋给CString型的变量
pChar[nReceived] = '\0';
m_sResponse = pChar;
// 检查是否收完了一行
CString strTemp = m_sResponse;
int nFind = strTemp.Find("\r\n");
if (nFind == -1)
{
bEnd = FALSE;
continue;
}
// 检查最后一行回应码后面是否有'-'
CString str = strTemp.Right(strTemp.GetLength() - nFind - 2);
while (str.GetLength() >= 4)
{
strTemp = str;
nFind = strTemp.Find("\r\n");
if (nFind == -1)
break;
str = strTemp.Right(strTemp.GetLength() - nFind - 2);
}
if (!str.IsEmpty() || strTemp.GetAt(4) == '-')
bEnd = FALSE;
else
bEnd = TRUE;
}
// 去掉结束标志
nReceived -= 2;
pChar[nReceived] = '\0';
m_sResponse = pChar;
return IsEffectRes();
}
BOOL CFtpClient::IsEffectRes()
{
if (m_sResponse.IsEmpty())
return FALSE;
return m_sResponse.GetAt(0) != '5';
}
void CFtpClient::ClearLog()
{
m_listString.RemoveAll();
}
BOOL CFtpClient::RecvData(SOCKET sockData)
{
char pChar[BUFFERSIZE];
UINT nReceived = 0;
BOOL bEnd = FALSE;
DWORD dwStart = ::GetTickCount();
// 接收数据
while (!bEnd)
{
// 尝试时间到
if ((::GetTickCount() - dwStart) > m_dwTimeout)
{
pChar[nReceived] = '\0';
m_sError = _T("超时");
// 保存当前数据
m_sData = pChar;
return FALSE;
}
timeval timeout = {m_dwTimeout / 1000,m_dwTimeout % 1000};
fd_set fds;
FD_ZERO(&fds);
FD_SET(sockData,&fds);
int nStatus = select(0,&fds,NULL,NULL,&timeout);
if (nStatus == SOCKET_ERROR)
return FALSE;
// 从套接字中接收数据
::Sleep(188);
// 从套接字中接收数据
nStatus = recv(sockData,pChar + nReceived,BUFFERSIZE,0);
if (nStatus == SOCKET_ERROR)
{
pChar[nReceived] = '\0';
// 套接字错误
m_sError = _T("未能从套接字中收到数据!");
// 保存当前回应数据
m_sData = pChar;
return FALSE;
}
// 再没有接收到数据了
else if (!nStatus)
{
m_sData = pChar;
break;
}
else
{
// 重置计时器
dwStart = ::GetTickCount();
// 已收到的数据又增加了
nReceived += nStatus;
}
// 将pChar设为字符串,并赋给CString型的变量
CString strT
上一篇:
FtpClient.cpp
下一篇:
Function GetIp(IP) 获得ip asp