FTP的C++实现(二)

2014-11-24 08:58:20 · 作者: · 浏览: 3
kresp('2');
if(err)return -1;
return 0;
}
int CFTP::ftp_mkdir(char* dir)
{
char path[300];
int err = ftp_cd("/");
if(err)return -1;
int i,j;
// printf("strlen(dir):%d",strlen(dir));
for(i=1,j=0;i {
path[j++] = dir[i];
if(dir[i]=='/'){
path[j++]='\0';
printf("create :%s\n",path);
err = ftp_mkdirSingle(path);
err = ftp_cd(path);
if(err)return -1;
j=0;
}
}
path[j++]='\0';
sprintf(m_cmd,"MKD %s\r\n",path);
err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('2');
if(err)return -1;
return 0;
}

int CFTP::ftp_rmdir(char* dir)
{
sprintf(m_cmd,"RMD %s\r\n",dir);
int err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('2');
if(err)return -1;
return 0;
}

int CFTP::ftp_upload(char* localfile,char* remotepath,char* remotefilename)
{

ftp_mkdir(remotepath);
int err = ftp_cd(remotepath);
if(err)return -1;
ftp_setpasv();
sprintf(m_cmd,"STOR %s\r\n",remotefilename);
err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('1');
if(err)return -1;
FILE* pf = fopen(localfile,"r");
if(NULL==pf)return -1;
char sendbuf[256];
size_t len = 0;
while((len = fread(sendbuf,1,255,pf))>0)
{
err = send(m_sockdata,sendbuf,len,0);
if(err<0)return -1;
}
close(m_sockdata);
fclose(pf);
err = ftp_checkresp('2');
if(err)return -1;
return 0;
}

int CFTP::ftp_setpasv()
{
sprintf(m_cmd,"PASV\r\n");
int err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('2');
if(err)return -1;
m_sockdata = socket(AF_INET,SOCK_STREAM,0);
unsigned int v[6];
union {
struct sockaddr sa;
struct sockaddr_in in;
} sin;
sscanf(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");
close(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");
close(m_sockdata);
return -1;
}

err = connect(m_sockdata,(sockaddr*)&sin,sizeof(sin));
if(err)return -1;
return 0;
}
int CFTP::ftp_download(char* localfile,char* remotefile)
{
/* sprintf(m_cmd,"TYPE A\r\n",remotefile);
int err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('2');
if(err)return -1;*/

ftp_setpasv();
sprintf(m_cmd,"RETR %s\r\n",remotefile);
int err = ftp_sendcmd();
if(err)return -1;
err = ftp_checkresp('1');
if(err)return -1;
FILE* pf = fopen(localfile,"w");
if(NULL==pf)return -1;
char recvbuf[256];
int len = 0;
while((len = recv(m_sockdata,recvbuf,256,0))>0)
{
err = fwrite(recvbuf,len,1,pf);
if(len<0)return -1;
}
close(m_sockdata);
fclos