博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vsftpd ftp client ls command implementation source code
阅读量:4060 次
发布时间:2019-05-25

本文共 3937 字,大约阅读时间需要 13 分钟。

#include<netdb.h>

#include<errno.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<unistd.h>
#include<termios.h>
#include <stdio.h>
#include<strings.h>
#include<string.h>
struct sockaddr_in ftp_server;
int sock_control;
int sock_data;
struct timeval outtime;
int ret;
char rcv_buff[1024];
int reply_code;
int main()
{
  bzero(&ftp_server,sizeof(struct sockaddr_in));
  ftp_server.sin_family=AF_INET;
  ftp_server.sin_port=htons(21);
  ftp_server.sin_addr.s_addr=inet_addr("127.0.0.1");
 
#if 1
  //connec to ftp server.
  sock_control=socket(AF_INET,SOCK_STREAM,0);
  if(sock_control<0)
  {
    printf("create socket failed!\n");
    return -1;
  }
  outtime.tv_sec=0;
  outtime.tv_usec=300000;
  ret=setsockopt(sock_control,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
  if(ret!=0)
  {
    printf("setsockopt failed!\n");
    return -1;
  }
  if(connect(sock_control,(struct sockaddr *)&ftp_server,sizeof(struct sockaddr_in))<0)
  {
    return -1;
  }
#endif
 
  //read server's reply.(welcome message).
#if 1
  ret=read(sock_control,rcv_buff,1024);
  if(ret>0)
  {
    printf("read:@@ %s @@\n",rcv_buff);
    reply_code=atoi(rcv_buff);
    //continue to read the rest welcome message.
    while(1)
    {
      rcv_buff[ret]='\0';
      ret=read(sock_control,rcv_buff,1024);
      if (ret<=0)
      {
    break;
      }
      printf("read:@@ %s @@\n",rcv_buff);
    }
  }
  else
  {
    printf("read welcome message failed\n");
    return -1;
  }
#endif
#if 1
  //ftp user login.
  bzero(rcv_buff,sizeof(rcv_buff));
  strcpy(rcv_buff,"USER shell.albert\r\n");
  write(sock_control,rcv_buff,strlen(rcv_buff));
  while(1)
  {
    bzero(rcv_buff,sizeof(rcv_buff));
    ret=read(sock_control,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
  //PASS.
  bzero(rcv_buff,sizeof(rcv_buff));
  strcpy(rcv_buff,"PASS smartbean\r\n");
  write(sock_control,rcv_buff,strlen(rcv_buff));
  while(1)
  {
    bzero(rcv_buff,sizeof(rcv_buff));
    ret=read(sock_control,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
#endif
#if 1
  //enter PASV(passive) mode.
  bzero(rcv_buff,sizeof(rcv_buff));
  strcpy(rcv_buff,"PASV\r\n");
  write(sock_control,rcv_buff,strlen(rcv_buff));
  bzero(rcv_buff,sizeof(rcv_buff));
  while(1)
  {
    ret=read(sock_control,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
  //parse out the port number.P1*256+P2.
  int nPasvPort;
  char *sPasvPort=0;
  sPasvPort=strrchr(rcv_buff,',');
  if(sPasvPort==NULL)
  {
    printf("get pasv port1 error!\n");
    return;
  }
  nPasvPort=atoi(sPasvPort+1);
  *sPasvPort='\0';
  sPasvPort=strrchr(rcv_buff,',');
  if(sPasvPort==NULL)
  {
    printf("get pasv port2 error!\n");
    return;
  }
  nPasvPort+=atoi(sPasvPort+1)*256;
  printf("pasv port=%d\n",nPasvPort);
 
  //use new port to connect server to get the data connection.
  ftp_server.sin_port=htons(nPasvPort);
  sock_data=socket(AF_INET,SOCK_STREAM,0);
  if(sock_data<0)
  {
    printf("create socket failed!\n");
    return -1;
  }
  outtime.tv_sec=0;
  outtime.tv_usec=300000;
  ret=setsockopt(sock_data,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
  if(ret!=0)
  {
    printf("setsockopt failed!\n");
    return -1;
  }
  if(connect(sock_data,(struct sockaddr *)&ftp_server,sizeof(struct sockaddr_in))<0)
  {
    return -1;
  }
  printf("create data connection sucess!\n");
#endif
 
#if 1
  //use PI(control channel to send LIST command
  //use DI(data channel to read data).
  bzero(rcv_buff,sizeof(rcv_buff));
  strcpy(rcv_buff,"LIST\r\n");
  write(sock_control,rcv_buff,strlen(rcv_buff));
  bzero(rcv_buff,sizeof(rcv_buff));
  while(1)
  {
    ret=read(sock_control,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
 
  //read data using data channel.
  bzero(rcv_buff,sizeof(rcv_buff));
  while(1)
  {
    ret=read(sock_data,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
 
  //close data channel.
  //read the control channel's reply.
  close(sock_data);
  printf("close data channe,read the server's rest data\n");
  bzero(rcv_buff,sizeof(rcv_buff));
  while(1)
  {
    ret=read(sock_control,rcv_buff,1024);
    if(ret>0)
    {
      printf("read:@@ %s @@\n",rcv_buff);
    }else{
      break;
    }
  }
#endif
  return 0;
}
你可能感兴趣的文章
Android2.1消息应用(Messaging)源码学习笔记
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
android 代码实现圆角
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
ReactNative使用Redux例子
查看>>
Promise的基本使用
查看>>