⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftplib.cpp

📁 一套完整的ftp应用程序API接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{

	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 + -