// ftpclient.cpp
// ftpclient.cpp,v 0.01 2008-8-11 0:28
//#include "ace/streams.h"
//#include "ace/Reactor.h"
//#include "ace/TP_Reactor.h"
//#include "ace/Thread_Manager.h"
//#include "ace/SOCK_Connector.h"
//#include "ace/SOCK_Acceptor.h"
#include "ftpclient.h"
FtpClient::FtpClient()
{
ACE_DEBUG ((LM_DEBUG,"FtpClient() invoked!\n"));
}
FtpClient::~FtpClient(void)
{
ACE_DEBUG ((LM_DEBUG,"~FtpClient() invoked!\n"));
}
int FtpClient::FtpLogin(char *pRemoteAddr,char *pUser,char *pPassWord)
{
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpRun() invoked RemoteAddr[%s]!\n",pRemoteAddr));
int index = 0;
char acBuf[256] = {0};
char acCommand[50] = {0};
ACE_SOCK_Connector connector;
ACE_INET_Addr ServerAddr(21,pRemoteAddr);
if (connector.connect (s_Server, ServerAddr) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"%p Addr[%s]\n","open server",pRemoteAddr),-1);
s_Server.recv(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpLogin()user[%s]pwd[%s] FIRST[%s]!\n",pUser,pPassWord,acBuf));
while (++index < 3)
{
switch (index)
{
case 1:
ACE_OS::sprintf(acCommand,"USER %s\r\n",pUser);
break;
case 2:
ACE_OS::sprintf(acCommand,"PASS %s\r\n",pPassWord);
break;
}
s_Server.send_urg(acCommand,strlen(acCommand));
ACE_OS::memset(acBuf,0x00,256);
ACE_OS::sleep(1);
s_Server.recv(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpLogin() UORP[%s]!\n",acBuf));
}
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpLogin() Login Server SUCC!\n"));
return 0;
}
int FtpClient::FtpPutFile(char *pRemoteFileName,char *pLocalFileName,char *pLocal,int iLocalPort)
{
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpPutFile() invoked!\n"));
int iLen = 0;
char acBuf[256] = {0};
char acCmd[128] = {0};
char acComma[128] = {0};
char acContent[4097] = {0};
char pLocalAddr[256] = {0};
FILE *fp = NULL;
ACE_Handle_Set handle_set;
ACE_SOCK_Stream L_NewStream;
ACE_SOCK_Acceptor L_Acceptor;
ACE_SOCK_Connector L_Connector;
ACE_INET_Addr L_ControlAddr;
strcpy(pLocalAddr,pLocal);
ACE_INET_Addr L_Addr(iLocalPort,pLocalAddr);
if (-1 == L_Acceptor.open(L_Addr,1))
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","Open Acceptor[%s:%d] Failed!",pLocalAddr,iLocalPort),1);
if (-1 == L_Acceptor.get_local_addr (L_Addr))
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","get_local_addr[%s:%d] Failed!",pLocalAddr,iLocalPort),1);
L_Addr.addr_to_string(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) starting server at port %d and addr[%s]\n",L_Addr.get_port_number (),acBuf));
ACE_OS::strcpy(acComma,pLocalAddr);
ReplaceChar(pLocalAddr,'.',',');
ACE_OS::sprintf(acCmd,"PORT %s,%d,%d\r\n",pLocalAddr,iLocalPort/256,iLocalPort%256);
s_Server.send_urg(acCmd,strlen(acCmd));
ACE_OS::memset(acBuf,0x00,256);
s_Server.recv(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) PORT[%s]\n",acBuf));
ACE_OS::sprintf(acCmd,"STOR %s\r\n",pRemoteFileName);
s_Server.send_urg(acCmd,strlen(acCmd));
ACE_OS::memset(acBuf,0x00,256);
s_Server.recv(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) STOR[%s]\n",acBuf));
handle_set.set_bit (L_Acceptor.get_handle ());
while (1)
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
ACE_Handle_Set temp = handle_set;
int result = ACE_OS::select (int (L_Acceptor.get_handle ())+1,(fd_set *) temp,0,0,timeout);
if (result == -1)
ACE_ERROR ((LM_ERROR,"(%P|%t) %p\n","select"));
else
{
if (temp.is_set (L_Acceptor.get_handle ()))
{
if (-1 == L_Acceptor.accept(L_NewStream))
{
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","get_local_addr"),1);
continue;
}
else
{
ACE_DEBUG ((LM_DEBUG,"(%P|%t) L_Acceptor SUCC!\n"));
}
}
else
{
ACE_DEBUG ((LM_DEBUG,"(%P|%t) spawning twoway server\n"));
break;
}
}
}
L_NewStream.get_remote_addr(L_Addr);
L_Addr.addr_to_string(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) NewServer addr[%s]\n",acBuf));
fp = ACE_OS::fopen (pLocalFileName, ACE_LIB_TEXT ("r"));
if (fp == 0)
{
L_Acceptor.close();
L_NewStream.close();
ACE_ERROR_RETURN ((LM_ERROR,ACE_LIB_TEXT ("Can't open [%s] file\n"),pLocalFileName),-1);
}
while(!feof(fp))
//while(0 != ACE_OS::fread(acContent,sizeof(char),255,fp))
{
ACE_OS::fread(acContent,sizeof(char),4096,fp);
//ACE_OS::fgets(acContent,4096,fp);
iLen = ACE_OS::strlen(acContent);
if (0 == iLen)
{
continue;
}
L_NewStream.send_urg(acContent,iLen);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) send len[%d]\n",iLen));
ACE_OS::memset(acContent,'\0',4096);
}
L_NewStream.close();
L_Acceptor.close();
ACE_OS::fclose(fp);
ACE_OS::memset(acBuf,0x00,256);
s_Server.recv(acBuf,256);
ACE_DEBUG ((LM_DEBUG,"(%P|%t) PORT[%s]",acBuf));
/*
while(0 != ACE_OS::fread(acContent,sizeof(char),4096,fp))
{
L_NewStream.send_urg(acContent,strlen(acContent));
ACE_OS::memset(acContent,'\0',4096);
}
ACE_OS::fclose(fp);
L_Acceptor.close();
L_NewStream.close();
*/
return 0;
}
int FtpClient::FtpLogOn(void)
{
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpLogOn() invoked!\n"));
int iRet = 0;
char acCmd[20] = {0};
ACE_OS::strcpy(acCmd,"QUIT\r\n");
if (s_Server.send_urg(acCmd,strlen(acCmd)) <= 0)
{
ACE_DEBUG ((LM_DEBUG,"FtpClient::FtpLogOn() send cmd failed!\n"));
iRet = -1;
}
s_Server.close();
return iRet;
}
int FtpClient::ReplaceChar(char *pFullString,const char OldChar,const char NewChar)
{
ACE_DEBUG ((LM_DEBUG,"FtpClient::ReplaceChar() invoked!\n"));
char *pFind = pFullString;
ACE_DEBUG ((LM_DEBUG,"FtpClient::ReplaceChar(%s) \n",pFullString));
while(*pFind != '\0')
{
if (OldChar == *pFind)
{
*pFind = (int)NewChar;
}
++pFind;
}
ACE_DEBUG ((LM_DEBUG,"FtpClient::ReplaceChar(%s) END\n",pFullString));
return 0;
}