int FtpLogin()
{
int iMaxLoginTimes = 0;
printf("connection\n");
memset(szHostaddrTmp,0,sizeof(szHostaddrTmp));
strcpy(szHostaddrTmp,server_task_address);//对方IP
if(connection1(&st_client_fd,szHostaddrTmp,21,1) < 0) return -1;
printf("connect successful\n");
//----------USER
memset(szUsrIdTmp,0,sizeof(szUsrIdTmp));
strcpy(szUsrIdTmp,server_username);
sprintf(st_cmd,"USER %s\r\n",szUsrIdTmp);
//if(send_cmd(__LINE__) < 0) return -1;
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
recv(st_client_fd,message,sizeof(message),0);
printf("messase%s\n",message);
//----------passer
memset(szPwdTmp,0,sizeof(szPwdTmp));
strcpy(szPwdTmp,server_pwd);
sprintf(st_cmd,"PASS %s\r\n",szPwdTmp);
//if(send_cmd(__LINE__) < 0) return -1;
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
recv(st_client_fd,message,sizeof(message),0);
strcpy(st_cmdno,substring(message,0,3));
if(atoi(st_cmdno) != 230)
{
//WriteLog(__LINE__,"user or password error");
return -1;
}
//---------切换路径----
memset(szSrcDir1,0,sizeof(szSrcDir1));
strcpy(szSrcDir1,server_task_path);
sprintf(st_cmd,"CWD %s\r\n",szSrcDir1);
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
recv(st_client_fd,message,sizeof(message),0);
printf("messase%s\n",message);
strcpy(st_cmdno,substring(message,0,3));
if(atoi(st_cmdno) != 250)
{
//WriteLog(__LINE__,"error enter dir!");
return -1;
}
printf("enter /xwtec\n");
//-------切换类型--------------
memset(st_cmd,0,sizeof(st_cmd));
strcpy(st_cmd,"TYPE I\r\n");
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
//if(send_cmd(__LINE__) < 0) return -1;
recv(st_client_fd,message,sizeof(message),0);
printf("messase%s\n",message);
//----------------------down
char filename[30];
memset(filename,0,sizeof(filename));
strcpy(filename,"linux.txt");
Ftp_Data(2,filename,0);
return 0;
}
int Ftp_Data(int type,char * filename,int dirtype)
{
//char st_des_pathname[1024],st_src_pathname[1024];
memset(st_cmd1,0,sizeof(st_cmd1));
memset(st_cmd2,0,sizeof(st_cmd2));
memset(st_cmd3,0,sizeof(st_cmd3));
// //发送被动模式命令
strcpy(st_cmd,"PASV\r\n");
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
recv(st_client_fd,message,sizeof(message),0);
printf("messase%s\n",message);
st_port_num = get_port_num(message);
if(type == 2)
{
//连接数据端口
printf("st_download_fd connect begin\n");
if(connection1(&st_download_fd,server_task_address,st_port_num,0) < 0) return -1;
printf("st_download_fd connect successful!\n");
/*发送下载的文件命令*/
sprintf(st_cmd1,"MDTM /xwtec/linux.txt\r\n");
sprintf(st_cmd2,"RETR /xwtec/linux.txt\r\n");
memset(st_cmd,0,sizeof(st_cmd));
strcpy(st_cmd,st_cmd2);
if(send(st_client_fd,st_cmd,strlen(st_cmd),0) < 0) return -1;
printf("send st_cmd sucess!\n");
memset(szSrcDir1,0,sizeof(szSrcDir1));
strcpy(szSrcDir1,server_task_path);
strcat(szSrcDir1,"/linux.txt");
iret = recvFile(szSrcDir1,"/xwtec/lijiandong/linux.txt");
if(iret < 0)
{
return -1;
}
close(st_download_fd);
transferMessage(__LINE__);
}
return 0;
}
int connection1(int *fd,char* servername,int port,int rev_flag)
{
struct sockaddr_in to;
*fd = socket(PF_INET,SOCK_STREAM,0);
to.sin_family = AF_INET;
to.sin_addr.s_addr = inet_addr(servername);
to.sin_port = htons(port);
iret = connect(*fd,(struct sockaddr *)&to,sizeof(to));
if(iret < 0)
{
printf("sorry connect error!\n");
return -1;
}
else
{
if(!rev_flag)
{
//ftp数据端口连接成功
printf("connect port success!\n");
return 0;
}
memset(message,0,sizeof(message));
if(my_select(*fd,10,0,READ_STATUS) == 0)
{
printf("cannot get message from *fd!\n");
return -1;
}
recv(*fd,message,sizeof(message),0);
//连接ftp命令端口成功
}
return 0;
}
int get_port_num(char *message)
{
char *temp1, *temp2;
char *sst_port_num;
//得到服务端开放的端口号
sst_port_num = strchr(message,',');
sst_port_num = strchr((sst_port_num+1),',');
sst_port_num = strchr((sst_port_num+1),',');
sst_port_num = strchr((sst_port_num+1),',') + 1;
temp1 = strchr(sst_port_num,')');
temp1[0] = '\0';
temp1 = strchr(sst_port_num,',');
temp2 = temp1 + 1;
temp1[0] = '\0';
return atoi(sst_port_num)*256 + atoi(temp2);
}
int recvFile(char * pathname,char * local_save_pathname)
{
int retNum = 0;
char buf[65535]="";
int cnt_num=0,cnt_byte=0;
int fd,i;
printf("pathname:%s\n",pathname);
if ((fd=open(pathname,O_CREAT|O_WRONLY,0660)) == -1)
{
printf("cannot open file\n");
//WriteLog(__LINE__,"cannot open file");
return -1;
}
if(my_select(st_download_fd,10,0,READ_STATUS) == 0) return -1;
printf("my_select\n");
retNum = read(st_download_fd, buf, sizeof(buf));
printf("buf:%s\n",buf);
while(retNum!=0)
{
if(my_select(st_download_fd,10,0,READ_STATUS) == 0)
{
//WriteLog(__LINE__,"select in recvFile");
return -1;
}
retNum = read(st_download_fd, buf, sizeof(buf));
WriteFile(local_save_pathname,buf);
printf("buf:%s\n",buf);
}
close(fd);
return retNum;
}
int my_select(int fd,int sec,int usec,int type)
{
struct timeval timeout;
timeout.tv_sec=sec;
timeout.tv_usec=usec;
fd_set fs;
FD_ZERO(&fs);
FD_SET(fd,&fs);
switch(type)
{
case READ_STATUS:
select(fd+1,&fs,NULL,NULL,&timeout);
if(FD_ISSET(fd,&fs)) return 1;
break;
case WRITE_STATUS:
select(fd+1,NULL,&fs,NULL,&timeout);
if(FD_ISSET(fd,&fs)) return 1;
break;
case EXCPT_STATUS:
select(fd+1,NULL,NULL,&fs,&timeout);
if(FD_ISSET(fd,&fs)) return 1;
break;
}
return 0;
}