📄 ftplib.cpp
字号:
{
ftp_info->connected = 1;
debug_print("Start to connect server: %s", host);
if (tcp_connect_server(&(ftp_info->sockfd), (char *)host, ftp_port) < 0)
{
message_print("Can't connect to server!");
return -1;
}
ftp_info->connected = 1;
ftp_info->ftp_msg = ftp_message;
if (ftp_check_response(ftp_info, '2') < 0)
{
//close(ftp_info->connected);
return -1;
}
debug_print("Connect Success!\n");
return 1;
}
int ftp_setport(in_port_t port)
{
/*
truct servent *se=NULL;
printf("enter ftp_setport\n");
if (port == 0)
{
printf("enter port==0\n");
if ((se = getservbyname("ftp", "tcp")) == NULL)
{
printf("before perror(\"getservbyname\")\n");
perror("getservbyname");
return -1;
}
printf("before htons\n");
ftp_port = htons(se->s_port);
} else
ftp_port = port;
*/
ftp_port = 21;
return 1;
}
/////end of libftp.c
//////////////////////////////////////////////////////
///////////tcpbase.c
ssize_t file_read_line(FILE *fp, char *buffer, int max)
{
int n, rc;
char c, *ptr;
ptr = buffer;
for (n = 1; n < max; n++)
{
if ((rc = fread(&c, 1, 1, fp)) == 1)
{
*ptr++ = c;
if (c == '\n')
break; /* newline is stored, like fgets() */
}
else
if (rc == 0)
{
if (n == 1)
return 0; /* EOF, no data read */
else
break; /* EOF, some data was read */
}
else
return -1; /* error, errno set by read() */
}
*ptr = 0; /* null terminate like fgets() */
return n;
}
ssize_t tcp_write(int fd, void *vptr, size_t n)
/* Write "n" bytes to a descriptor. */
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = (char*)vptr;
nleft = n;
/*
signal(SIGALRM, signal_alarm);
if (alarm(tcp_timeout) != 0)
message_print("connect_timeo: alarm was already set");
*/
while (nleft > 0)
{
if ((nwritten = write(fd, ptr, nleft)) <= 0)
{
if (errno == EINTR)
nwritten = 0; /* and call write() again */
else
return -1; /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
//alarm(0); /* turn off the alarm */
//debug_print("Write buffer len: %d", n);
return n;
}
ssize_t tcp_readn(int fd, void *vptr, size_t n)
/* Read "n" bytes from a descriptor. */
{
size_t nleft;
ssize_t nread;
char *ptr;
ptr = (char*)vptr;
nleft = n;
/*
signal(SIGALRM, signal_alarm);
if (alarm(tcp_timeout) != 0)
message_print("connect_timeo: alarm was already set");
*/
while (nleft > 0)
{
if ( (nread = read(fd, ptr, nleft)) < 0)
{
if (errno == EINTR)
nread = 0; /* and call read() again */
else
return(-1);
} else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
/*
alarm(0);
*/
return(n - nleft); /* return >= 0 */
}
ssize_t tcp_read_line(int fd, void *vptr, size_t maxlen)
{
int n, rc;
char c, *ptr;
ptr = (char*)vptr;
/*
signal(SIGALRM, signal_alarm);
if (alarm(tcp_timeout) != 0)
message_print("connect_timeo: alarm was already set");
*/
for (n = 1; n < (int)maxlen; n++)
{
if ((rc = tcp_read(fd, &c)) == 1)
{
*ptr++ = c;
if (c == '\n')
break; /* newline is stored, like fgets() */
}
else
if (rc == 0)
{
if (n == 1)
return 0; /* EOF, no data read */
else
break; /* EOF, some data was read */
}
else
return -1; /* error, errno set by read() */
}
/*
alarm(0);
*/
*ptr = 0; /* null terminate like fgets() */
return n;
}
ssize_t tcp_read(int fd, char *ptr)
{
static int read_cnt = 0;
static char *read_ptr;
static char read_buf[MAXLINE];
if (read_cnt <= 0) {
again:
if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) {
if (errno == EINTR)
goto again;
return(-1);
} else if (read_cnt == 0)
return(0);
read_ptr = read_buf;
}
read_cnt--;
*ptr = *read_ptr++;
return 1;
}
int tcp_connect_server(int *sock, char *server, int port)
{
int sockfd;
struct sockaddr_in servaddr;
assert(server != NULL);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("socket:");
return -1;
}
memset((void *)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
if (inet_pton(AF_INET, server, &servaddr.sin_addr) <= 0)
{
perror("inet_pton:");
return -1;
}
/*
signal(SIGALRM, signal_alarm);
if (alarm(tcp_timeout) != 0)
message_print("connect_timeo: alarm was already set");
*/
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
//close(sockfd);
if (errno == EINTR)
errno = ETIMEDOUT;
}
//alarm(0); /* turn off the alarm */
*sock = sockfd;
return 1;
}
void signal_alarm(int signo)
{
return; /* just interrupt the connect() */
}
void debug_print(const char *fmt, ...)
{
va_list ap;
#ifdef DEBUG
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
fprintf(stdout, "\n");
va_end(ap);
#endif
return;
}
void message_print(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stdout, fmt, ap);
fprintf(stdout, "\n");
va_end(ap);
return;
}
/////end of tcpbase.c
/////////////////////////////////////////////////
///////////ftpbase.c
int ftp_get_data_sock(FTPINFO *ftp_info)
{
char data_host[256];
int data_port;
if (ftp_pasv(ftp_info, data_host, &data_port) < 0)
{
message_print("ftp pasv error!");
return -1;
}
debug_print("Host: %s; Port: %d", data_host, data_port);
if (tcp_connect_server(&(ftp_info->datasd), (char *)data_host,
data_port) < 0)
{
message_print("Can't connect to data server!");
return -1;
}
return 1;
}
int ftp_pasv(FTPINFO *ftp_info, char *dhost, int *dport)
{
char buffer[MAXLINE];
unsigned char *p;
unsigned char addr[6];
int i;
assert(dhost != NULL);
if (ftp_command(ftp_info, "", "pasv") < 0)
{
message_print("ftp command pasv error!");
return -1;
}
if (ftp_check_response(ftp_info, '2') < 0)
{
message_print("check ftp command pasv response error!");
return -1;
}
strcpy(buffer, ftp_info->ftp_msg);
p = (unsigned char *)buffer;
for (p += 4; *p && !isdigit(*p); p++);
if (!*p)
return -1;
for (i = 0; i < 6; i++)
{
addr[i] = 0;
for (; isdigit(*p); p++)
addr[i] = (*p - '0') + 10 * addr[i];
if (*p == ',')
p++;
else if (i < 5)
{
return -1;
}
}
sprintf(dhost, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
*dport = (addr[4] << 8) + addr[5];
return 1;
}
void ftp_set_timeout(FTPINFO *ftp_info, int sec)
{
tcp_timeout = sec;
return;
}
int ftp_read_response(FTPINFO *ftp_info)
{
char match[5];
if (tcp_read_line(ftp_info->sockfd, ftp_info->ftp_msg, MAXLINE) == -1)
{
message_print("Control socket read failed");
return -1;
}
if (ftp_info->debug == 1)
message_print("%s", ftp_info->ftp_msg);
if (ftp_info->ftp_msg[3] == '-')
{
strncpy(match, ftp_info->ftp_msg, 3);
match[3] = ' ';
match[4] = '\0';
do
{
if (tcp_read_line(ftp_info->sockfd, ftp_info->ftp_msg,
MAXLINE) == -1)
{
message_print("Control socket read failed");
return -1;
}
if (ftp_info->debug == 1)
message_print("%s", ftp_info->ftp_msg);
}
while (strncmp(ftp_info->ftp_msg, match, 4));
}
return 1;
}
int ftp_check_response(FTPINFO *ftp_info, char c)
{
if (ftp_read_response(ftp_info) < 0)
return -1;
if (ftp_info->ftp_msg[0] == c)
return 1;
return -1;
}
/////end of ftpbase.c
void usage(char *progname)
{
printf("usage: %s <remhost>\n", progname);
exit (1);
}
int check_n_close ( FTPINFO *ftpinfo, int status )
{
/*
if (ftpinfo -> sockfd >= 0)
close (ftpinfo -> sockfd);
*/
if (status == ABNORMAL)
printf("error: %s\n", ftpinfo -> ftp_msg);
else
printf("success: %s\n", ftpinfo -> ftp_msg);
printf("final reply from server: %d\n", ftpinfo -> reply);
fflush ( stdout );
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -