树莓派上使用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