Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: FTPClient_example FTP_TESTClient
FTPClient.cpp
- Committer:
- Ricky_Kwon
- Date:
- 2015-07-29
- Revision:
- 3:4fd8e5cd6307
- Parent:
- 2:dbbe55b239d5
File content as of revision 3:4fd8e5cd6307:
#include "mbed.h"
#include "EthernetInterface.h"
#include "FTPClient.h"
//#define DEBUG
FTPClient::FTPClient(PinName mosi, PinName miso, PinName sclk, PinName ssel, const char* root) : _SDFileSystem(mosi, miso, sclk, ssel, root){
blogin = false;
bopenflag = false;
brfileflag = false;
bdirflag = false;
blsflag = false;
bfdeleteflag = false;
bmkdirflag = false;
bcdflag = false;
bquitflag = false;
}
bool FTPClient::open(char* ip, int port, char* id, char* pass){
FTPClientControlSock = new TCPSocketConnection;
FTPClientDataSock = new TCPSocketConnection;
#if 0
do{
FTPClientControlSock->connect(ip, port);
}while(!FTPClientControlSock->is_connected());
#endif
#if 1
while (FTPClientControlSock->connect(ip, port) < 0) {
#ifdef DEBUG
printf("Unable to connect to (%s) on port (%d)\r\n", ip, port);
#endif
wait(1);
}
#endif
while(!blogin){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "220", 3)){
printf("%s\r\n", rbuf);
sprintf(sbuf, "user %s\r\n", id);
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
else if (!strncmp(rbuf, "331", 3)){
sprintf(sbuf, "pass %s\r\n", pass);
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
else if (!strncmp(rbuf, "230", 3)){
blogin = true;
}
else{
blogin = true;
}
}
}
return 1;
}
bool FTPClient::getfile(char* myfilename, char* filename){
if(blogin){
sprintf(sbuf, "pasv\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!brfileflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "150", 3)){
fp = fopen(myfilename, "w");
#ifdef DEBUG
printf("myfilename : %s\r\n", myfilename);
#endif
while(true){
memset(rbuf, 0, sizeof(rbuf));
remain_datasize = FTPClientDataSock->receive(rbuf, sizeof(rbuf));
#ifdef DEBUG
printf("remain_datasize : %d\r\n", remain_datasize);
#endif
if(remain_datasize>0){
for (i = 0; i < remain_datasize; i++) {
//printf("%c", rbuf[i]);
fprintf(fp, "%c", rbuf[i]);
}
#ifdef DEBUG
printf("#");
#endif
}
else{
brfileflag = true;
fclose(fp);
FTPClientDataSock->close();
break;
}
}
}
else if (!strncmp(rbuf, "227", 3)){
pportc(rbuf);
#if 1
while (FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port) < 0) {
#ifdef DEBUG
printf("Unable to connect to (%s) on port (%d)\r\n", ftpServer_data_ip_addr_str, remote_port);
#endif
wait(1);
}
#endif
#if 0
do{
FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port);
}while(!FTPClientDataSock->is_connected());
#endif
sprintf(sbuf, "retr %s\r\n", filename);
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
}
}
brfileflag = false;
return 1;
}
else return 0;
}
bool FTPClient::putfile(char* myfilename, char* filename){
if(blogin){
sprintf(sbuf, "pasv\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bsfileflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "150", 3)){
fp = fopen(myfilename, "r");
fseek(fp, 0, SEEK_END); // seek to end of file
remain_filesize = ftell(fp); // get current file pointer
fseek(fp, 0, SEEK_SET); // seek back to beginning of file
do{
memset(sbuf, 0, sizeof(sbuf));
if(remain_filesize > MAX_SS)
send_byte = MAX_SS;
else
send_byte = remain_filesize;
fread (sbuf, 1, send_byte, fp);
FTPClientDataSock->send(sbuf, send_byte);
remain_filesize -= send_byte;
#ifdef DEBUG
printf("#");
#endif
}while(remain_filesize!=0);
fclose(fp);
bsfileflag = true;
FTPClientDataSock->close();
break;
}
else if (!strncmp(rbuf, "227", 3)){
pportc(rbuf);
#if 0
do{
FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port);
}while(!FTPClientDataSock->is_connected());
#endif
#if 1
while (FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port) < 0) {
#ifdef DEBUG
printf("Unable to connect to (%s) on port (%d)\r\n", ftpServer_data_ip_addr_str, remote_port);
#endif
wait(1);
}
#endif
sprintf(sbuf, "stor %s\r\n", filename);
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
}
}
bsfileflag = false;
return 1;
}
else return 0;
}
bool FTPClient::dir(){
if(blogin){
sprintf(sbuf, "pasv\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bdirflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "150", 3)){
while(true){
memset(rbuf, 0, sizeof(rbuf));
size = FTPClientDataSock->receive(rbuf, sizeof(rbuf));
rbuf[size] = '\0';
if(size>0){
printf("%s", rbuf);
}
else{
bdirflag = true;
FTPClientDataSock->close();
break;
}
}
}
else if (!strncmp(rbuf, "227", 3)){
pportc(rbuf);
#if 0
do{
FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port);
}while(!FTPClientDataSock->is_connected());
#endif
#if 1
while (FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port) < 0) {
#ifdef DEBUG
printf("Unable to connect to (%s) on port (%d)\r\n", ftpServer_data_ip_addr_str, remote_port);
#endif
wait(1);
}
#endif
sprintf(sbuf, "list\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
}
}
bdirflag = false;
return 1;
}
else return 0;
}
bool FTPClient::ls(){
if(blogin){
sprintf(sbuf, "pasv\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!blsflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "150", 3)){
while(true){
memset(rbuf, 0, sizeof(rbuf));
size = FTPClientDataSock->receive(rbuf, sizeof(rbuf));
rbuf[size] = '\0';
if(size>0){
printf("%s", rbuf);
}
else{
blsflag = true;
FTPClientDataSock->close();
break;
}
}
}
else if (!strncmp(rbuf, "227", 3)){
pportc(rbuf);
#if 0
do{
FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port);
}while(!FTPClientDataSock->is_connected());
#endif
#if 1
while (FTPClientDataSock->connect(ftpServer_data_ip_addr_str, remote_port) < 0) {
#ifdef DEBUG
printf("Unable to connect to (%s) on port (%d)\r\n", ftpServer_data_ip_addr_str, remote_port);
#endif
wait(1);
}
#endif
sprintf(sbuf, "nlst\r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
}
}
}
blsflag = false;
return 1;
}
else return 0;
}
bool FTPClient::fdelete(char* filename){
if(blogin){
sprintf(sbuf, "dele %s\r\n", filename);
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bfdeleteflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "250", 3)){
bfdeleteflag = true;
}
else {
return 0;
}
}
}
bfdeleteflag = false;
return 1;
}
else return 0;
}
bool FTPClient::mkdir(char* dirname){
if(blogin){
sprintf(sbuf, "xmkd %s\r\n", dirname);
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bmkdirflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "257", 3)){
bmkdirflag = true;
}
else {
return 0;
}
}
}
bmkdirflag = false;
return 1;
}
else return 0;
}
bool FTPClient::cd(char* dirname){
if(blogin){
sprintf(sbuf, "cwd %s\r\n", dirname);
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bcdflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "250", 3)){
bcdflag = true;
}
else {
return 0;
}
}
}
bcdflag = false;
return 1;
}
else return 0;
}
bool FTPClient::quit(){
if(blogin){
sprintf(sbuf, "quit \r\n");
FTPClientControlSock->send(sbuf, strlen(sbuf));
while(!bquitflag){
size = FTPClientControlSock->receive(rbuf, sizeof(rbuf));
if(size > 0){
#ifdef DEBUG
printf("Received message from server: %s\r\n", rbuf);
#endif
if (!strncmp(rbuf, "250", 3)){
printf("%s\r\n", rbuf);
bquitflag = true;
}
else {
return 0;
}
}
}
bquitflag = false;
blogin = false;
delete FTPClientControlSock;
delete FTPClientDataSock;
return 1;
}
else return 0;
}
int FTPClient::pportc(char * arg)
{
char* tok=0;
strtok(arg,"(");
for (i = 0; i < 4; i++)
{
if(i==0) tok = strtok(NULL,",\r\n");
else tok = strtok(NULL,",");
ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok);
if (!tok){
#ifndef DEBUG
printf("bad pport : %s\r\n", arg);
#endif
return -1;
}
}
remote_port = 0;
for (i = 0; i < 2; i++){
tok = strtok(NULL,",\r\n");
remote_port <<= 8;
remote_port += atoi(tok);
if (!tok){
#ifdef DEBUG
printf("bad pport : %s\r\n", arg);
#endif
return -1;
}
}
sprintf(ftpServer_data_ip_addr_str, "%d.%d.%d.%d", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3]);
return 0;
}