树莓派上使用C语言搭建FTP客户端

树莓派上使用C语言搭建FTP客户端

话不多说直接上代码

ftp_process.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include "ftp_process.h"
 
/**
 * @description: 创建一个socket并返回 
 * @param char *host:  服务器IP地址
 * @param int port:  服务器端口号
 * @return int :  如果连接异常返回-1,否则返回socket句柄
 */
int socket_connect(char *host,int port)
{
   
    struct sockaddr_in address;
    int s, opvalue;
    socklen_t slen;
 
    opvalue = 8;
    slen = sizeof(opvalue);
    memset(&address, 0, sizeof(address));
 
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
        setsockopt(s, IPPROTO_IP, IP_TOS, &opvalue, slen) < 0)
        return -1;
 
    //设置接收和发送超时
    struct timeval timeo = {
   15, 0};
    setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, &timeo, sizeof(timeo));
    setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo));
 
    address.sin_family = AF_INET;
    address.sin_port = htons((unsigned short)port);
 
    struct hostent* server = gethostbyname(host);
    if (!server)
        return -1;
 
    memcpy(&address.sin_addr.s_addr, server->h_addr, server->h_length);
 
    if (connect(s, (struct sockaddr*) &address, sizeof(address)) == -1)
        return -1;
 
    return s;
}

/**
 * @description: 连接到一个ftp的服务器,返回socket 
 * @param char *host:  服务器IP地址
 * @param int port:  服务器端口号
 * @return int :  如果连接异常返回-1,否则返回socket句柄
 */
int connect_server( char *host, int port )
{
   
    int       ctrl_sock;
    char      buf[512];
    int       result;
    ssize_t   len;
 
    ctrl_sock = socket_connect(host, port);
    if (ctrl_sock == -1) {
   
        return -1;
    }
 
    len = recv( ctrl_sock, buf, 512, 0 );
    buf[len] = 0;
    sscanf( buf, "%d", &result );
    if ( result != 220 ) {
   
        close( ctrl_sock );
        return -1;
    }
 
    return ctrl_sock;
}

/**
 * @description: 发送命令,返回结果 
 * @param int sock:  socket句柄
 * @param char *cmd:  发送的命令
 * @param void *re_buf:  接收数据的缓存区
 * @param ssize_t *len:  接收数据长度
 * @return int :  如果连接异常返回-1,否则返回0
 */
int ftp_sendcmd_re( int sock, char *cmd, void *re_buf, ssize_t *len)
{
   
    char        buf[512];
    ssize_t     r_len;
  
    printf("ftp> %s\n",cmd);

    if ( send( sock
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值