linux下最简单的ftpget ftpput 源代码

/*FtpGetRun*/
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdarg.h>

#include <stdio.h>

#include <netdb.h>

/*FtpGetRun Variable*/

FILE *pFtpIOFile = NULL;

FILE *pFileCmdChmod;        //使用popen方式修改文件属性为可执行的文件指针

FILE *pRunGetFile;  //使用popen方式执行文件的文件指针

char aFtpBuffer[4096];

/*Http Variable*/

FILE *pFileCmdChmod;

FILE *pRunGetFile;

char aRequestHead[1000];

char aResponseHead[1000];

static int iSockHttpMark=-1;  
int iGetRunMark;//用来标记是get模式,还是getrun模式1为get模式,2为getrun模式   
char acChmodCmd[50];//用来使用chmode命令行   
char acRunCmdLine[50];//用来运行程序   

int FtpCmd(int iSockFtpCmd,char *cFmt,...)  
{   
    va_list vVaStartUse;   
    int iFtpCmdReturn;  
    int iFtpLength;    

    if (pFtpIOFile == NULL)   
    {   
        pFtpIOFile = fdopen(iSockFtpCmd,"r");  
        if (pFtpIOFile == NULL)  
        {  
            printf("The ERROR of pointer of pFtpIOFile");  
            return -1;  
        }   
    }    
    if (cFmt)   
    {   
        va_start(vVaStartUse,cFmt);   
        iFtpLength = vsprintf(aFtpBuffer,cFmt,vVaStartUse);   
        aFtpBuffer[iFtpLength++] = '\r';   
        aFtpBuffer[iFtpLength++]='\n';   
        write(iSockFtpCmd,aFtpBuffer,iFtpLength); //如同send   
    }    
    do   
    {   
        if (fgets(aFtpBuffer,sizeof(aFtpBuffer),pFtpIOFile) == NULL)   
        {  
            return -1;  
        }    
    } while(aFtpBuffer[3] == '-');    

    sscanf(aFtpBuffer,"%d",&iFtpCmdReturn);    
    return iFtpCmdReturn;  
}   

int FtpGet(char *host,char *user,char *pass,char *filename,char *pcSaveFile)  
{   
    int iSockFtpCmd = -1;//用来socket接受调用后返回的套接口描述符号   
    int iSockFtpData = -1;//datasocket建立后返回的套接口描述符号   
    int iSockAccept = -1;   
    struct sockaddr_in addr;//定义socket结构    
    unsigned long hostip;//存放主机地址的变量    
    int iFtpLength;  
    int tmp;  
    int iFtpCmdReturn;   
    int retval = -1;   
    int iOpenReturn; //接收open函数的返回值   
    unsigned char *c;//用来指向data连接时候的主机地址   
    unsigned char *p;//用来指向data连接时候的端口   
    struct hostent *he;   
    hostip = inet_addr(host); //转换主机地址为网络排序模式   
    if (hostip == -1)   
    {   
        printf("\nHostIP is ERROR!!\n");  
    }   
      
    //建立socket   
    //设定相应的socket协议和地址   
    /**********************************************************/  
    iSockFtpCmd = socket(AF_INET,SOCK_STREAM,0);    

    if (iSockFtpCmd == -1)   
    goto out;    

    addr.sin_family = PF_INET;   
    addr.sin_port = htons(21);   
    addr.sin_addr.s_addr = hostip;    

    /**********************************************************/   
    /*connect*/  
    if (connect(iSockFtpCmd,(struct sockaddr *)&addr,sizeof(addr)) == -1)   
    goto out;    
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,NULL);   
    if (iFtpCmdReturn != 220)   
    goto out;    

    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"USER %s",user);   
    if (iFtpCmdReturn != 331)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PASS %s",pass);   
    if (iFtpCmdReturn != 230)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"TYPE I");   
    if (iFtpCmdReturn != 200)   
    goto out;   
      
    /*建立data socket*/  
    iSockFtpData = socket(AF_INET,SOCK_STREAM,0);   
      
    if (iSockFtpData == -1)   
    goto out;   
      
    tmp = sizeof(addr);   
      
    getsockname(iSockFtpCmd,(struct sockaddr *)&addr,&tmp);   
    addr.sin_port = 0;   
      
    /*绑定*/  
    if (bind(iSockFtpData,(struct sockaddr *)&addr,sizeof(addr)) == -1)   
    goto out;   
      
    if (listen(iSockFtpData,1) == -1)   
    goto out;   
      
    tmp = sizeof(addr);   
    getsockname(iSockFtpData,(struct sockaddr *)&addr,&tmp);   
    c = (unsigned char *)&addr.sin_addr;   
    p = (unsigned char *)&addr.sin_port;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PORT %d,%d,%d,%d,%d,%d", c[0],c[1],c[2],c[3],p[0],p[1]);   
  
    if (iFtpCmdReturn != 200)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"RETR %s",filename);   
    if (iFtpCmdReturn != 150)   
    goto out;   
      
    tmp = sizeof(addr);   
    iSockAccept = accept(iSockFtpData,(struct sockaddr *)&addr,&tmp);   
      
    if (iSockAccept == -1)   
    goto out;   
    //   
    iOpenReturn = open(pcSaveFile,O_WRONLY|O_CREAT,0644);   
    if (iOpenReturn == -1)   
    goto out;   
      
    retval = 0;   
    while ((iFtpLength=read(iSockAccept,aFtpBuffer,sizeof(aFtpBuffer)))>0)   
    {   
        write(iOpenReturn,aFtpBuffer,iFtpLength);   
        retval += iFtpLength;   
    };   
      
    close(iOpenReturn);  
  
out:   
    close(iSockAccept);   
    close(iSockFtpData);   
    close(iSockFtpCmd);   
    if (pFtpIOFile)   
    {   
        fclose(pFtpIOFile);   
        pFtpIOFile = NULL;   
    }    
    return retval;  
}


int FtpPut(char *host,char *user,char *pass,char *filename,char *pcSaveFile)  
{   
    int iSockFtpCmd = -1;//用来socket接受调用后返回的套接口描述符号   
    int iSockFtpData = -1;//datasocket建立后返回的套接口描述符号   
    int iSockAccept = -1;   
    struct sockaddr_in addr;//定义socket结构    
    unsigned long hostip;//存放主机地址的变量    
    int iFtpLength;  
    int tmp;  
    int iFtpCmdReturn;   
    int retval = -1;   
    int iOpenReturn; //接收open函数的返回值   
    unsigned char *c;//用来指向data连接时候的主机地址   
    unsigned char *p;//用来指向data连接时候的端口   
    struct hostent *he;   
    hostip = inet_addr(host); //转换主机地址为网络排序模式   
    if (hostip == -1)   
    {   
        printf("\nHostIP is ERROR!!\n");  
    }   
      
    //建立socket   
    //设定相应的socket协议和地址   
    /**********************************************************/  
    iSockFtpCmd = socket(AF_INET,SOCK_STREAM,0);   
      
    if (iSockFtpCmd == -1)   
    goto out;   
  
    addr.sin_family = PF_INET;   
    addr.sin_port = htons(21);   
    addr.sin_addr.s_addr = hostip;   
  
    /**********************************************************/   
    /*connect*/  
    if (connect(iSockFtpCmd,(struct sockaddr *)&addr,sizeof(addr)) == -1)   
    goto out;    

    iFtpCmdReturn = FtpCmd(iSockFtpCmd,NULL);   
    if (iFtpCmdReturn != 220)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"USER %s",user);   
    if (iFtpCmdReturn != 331)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PASS %s",pass);   
    if (iFtpCmdReturn != 230)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"TYPE I");   
    if (iFtpCmdReturn != 200)   
    goto out;   
      
    /*建立data socket*/  
    iSockFtpData = socket(AF_INET,SOCK_STREAM,0);   
      
    if (iSockFtpData == -1)   
    goto out;   
      
    tmp = sizeof(addr);   
      
    getsockname(iSockFtpCmd,(struct sockaddr *)&addr,&tmp);   
    addr.sin_port = 0;   
      
    /*绑定*/  
    if (bind(iSockFtpData,(struct sockaddr *)&addr,sizeof(addr)) == -1)   
    goto out;   
      
    if (listen(iSockFtpData,1) == -1)   
    goto out;   
      
    tmp = sizeof(addr);   
    getsockname(iSockFtpData,(struct sockaddr *)&addr,&tmp);   
    c = (unsigned char *)&addr.sin_addr;   
    p = (unsigned char *)&addr.sin_port;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"PORT %d,%d,%d,%d,%d,%d", c[0],c[1],c[2],c[3],p[0],p[1]);   
  
    if (iFtpCmdReturn != 200)   
    goto out;   
      
    iFtpCmdReturn = FtpCmd(iSockFtpCmd,"STOR %s",filename);   
    if (iFtpCmdReturn != 150)   
    goto out;   
      
    tmp = sizeof(addr);   
    iSockAccept = accept(iSockFtpData,(struct sockaddr *)&addr,&tmp);   
      
    if (iSockAccept == -1)   
    goto out;   
    //   
    iOpenReturn = open(pcSaveFile,O_RDONLY,0644);   
    if (iOpenReturn == -1)   
    goto out;   
      
    retval = 0;   
  
retval=read(iOpenReturn,aFtpBuffer,4096);  
  
while(retval!=0)  
{  
    write(iSockAccept,aFtpBuffer,retval);  
retval=read(iOpenReturn,aFtpBuffer,4096);  
}   

    close(iOpenReturn);  

out:   
    close(iSockAccept);   
    close(iSockFtpData);   
    close(iSockFtpCmd);   
    if (pFtpIOFile)   
    {   
        fclose(pFtpIOFile);   
        pFtpIOFile = NULL;   
    }
    return retval;
}   
int main(int argc,char *argv[])   
{
    iGetRunMark=1;/*设定为get模式*/
    if(strcmp("get",argv[1])==0)  
    {
        printf("\nFTP protocol ...\n");
        FtpGet(argv[2],argv[3],argv[4],argv[5],argv[6]);
    }   
    if(strcmp("put",argv[1])==0) 
    {  
        printf("\nFTP protocol ...\n");  
        FtpPut(argv[2],argv[3],argv[4],argv[5],argv[6]);    
    }   
    return 0;
} 

 


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要安装ftpget和ftpput,你可以按照以下步骤进行操作: 1. 首先,进入终端并输入命令"make busybox-menuconfig",这将打开配置页面\[1\]。 2. 在配置页面中,找到"Networking Utilities"选项,并选择它。 3. 在"Networking Utilities"选项中,找到"ftpd"、"ftpget"和"ftpput",并将它们都选中。 4. 保存并退出配置页面,这样ftp文件系统的配置就完成了\[1\]。 5. 接下来,重新编译镜像以使更改生效。 请注意,上述步骤是在使用BusyBox的情况下进行的。BusyBox是一个集成了许多常用工具的软件包,包括ftpget和ftpput。因此,你需要确保你的系统中已经安装了BusyBox。 另外,如果你想在Linux系统上上传文件到ftp服务器,你还需要修改vsftpd的配置文件。该文件的名称是vsftpd.conf,位于/etc目录下\[2\]。你需要找到"write_enable"这一行,并去掉前面的"#",然后保存文件。最后,重启vsftpd服务以使更改生效。 希望以上信息对你有所帮助。如果你需要更多详细的指导,可以参考相关资料\[3\]。 #### 引用[.reference_title] - *1* [通过Busybox配置ftp文件系统客户端,编译进开发板后可以通过ftpput/ftpget命令与ftp服务器上传和下载文件...](https://blog.csdn.net/weixin_45107609/article/details/126145410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [科技常识:Linux ftp 命令行中下载文件get与上传文件put的命令应用详解](https://blog.csdn.net/weixin_39701735/article/details/117274768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值