2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
int CFTP::ftp_setpasv()
{
sprintf_s(m_cmd,"PASV
");
int err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp));
if(err)
return -1;
//得到返回码
int code = get_state_code(m_resp);
//227 Entering Passive Mode (127,0,0,1,32,137).
if(code != 227)
return -1;
m_sockdata = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
unsigned int v[6]={0};
union {
struct sockaddr sa;
struct sockaddr_in in;
} sin;
sscanf_s(m_resp,"%*[^(](%u,%u,%u,%u,%u,%u",&v[2],&v[3],&v[4],&v[5],&v[0],&v[1]);
sin.sa.sa_family = AF_INET;
sin.sa.sa_data[2] = v[2];
sin.sa.sa_data[3] = v[3];
sin.sa.sa_data[4] = v[4];
sin.sa.sa_data[5] = v[5];
sin.sa.sa_data[0] = v[0];
sin.sa.sa_data[1] = v[1];
int on =1;
if (setsockopt(m_sockdata,SOL_SOCKET,SO_REUSEADDR,
(const char*) &on,sizeof(on)) == -1)
{
perror("setsockopt");
closesocket(m_sockdata);
return -1;
}
struct linger lng = { 0, 0 };
if (setsockopt(m_sockdata,SOL_SOCKET,SO_LINGER,
(const char*) &lng,sizeof(lng)) == -1)
{
perror("setsockopt");
closesocket(m_sockdata);
return -1;
}
err = connect(m_sockdata,(sockaddr*)&sin,sizeof(sin));
if(err)
return -1;
return 0;
}
int CFTP::ftp_upload_dir( const char* localpath,const char* remotepath,size_t buf_size)
{
//进入FTP目录
int err = ftp_cd(remotepath);
if(err){
ftp_mkdir(remotepath);
}
WCHAR szFind[MAX_PATH] = {0};
//搜索条件
USES_CONVERSION;
wcscpy(szFind,A2W(localpath));
wcscat(szFind,A2W("*.*"));
WIN32_FIND_DATA FindFileData;
HANDLE hFind = ::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind){
std::cout<<"对应目录不存在!"<<std::endl;
return -1;
}
//查找的文件
WCHAR szFile[MAX_PATH] = {0};
do{
memset(szFile,0,sizeof(szFile));
wcscpy(szFile,A2W(localpath));
wcscat(szFile,A2W(""));
wcscat(szFile,FindFileData.cFileName);
//目录
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
if(FindFileData.cFileName[0] != '.'){
WCHAR szRemotePath[MAX_PATH] = {0};
wcscpy(szRemotePath,A2W(remotepath));
wcscat(szRemotePath,A2W("/"));
wcscat(szRemotePath,FindFileData.cFileName);
//上传子目录
ftp_upload_dir(W2A(szFile),W2A(szRemotePath),buf_size);
}
}//文件
else{
ftp_upload(W2A(szFile),remotepath,W2A(FindFileData.cFileName),buf_size);
}
}while(FindNextFile(hFind,&FindFileData));
//关闭文件查找句柄
FindClose(hFind);
return 0;
}
上传目录主要包括创建目录和上传两部分工作,使用递归的方式,以处理子目录的情况。