FTP客户端

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;
}  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值