#include "FtpSource.h"
#include <stdio.h>
#include "FtpServer.h"
CFtpServer *g_pFtpServer = NULL;
FtpFileSourcePool CFtpSource::m_FileSourcePool;
static long g_nKeyEnd = 4 * 256;
static int g_nListens = 0;
void log(const char *strFormat, ...)
{
#ifndef _DEBUG
va_list ap;
//char message[255];
char buf[128];
SYSTEMTIME systime;
GetLocalTime(&systime);
FILE *g_log = fopen("c:\\record_server_log.txt", "ab");
if (nullptr == g_log)
{
return;
}
_fseeki64(g_log, 0, SEEK_END);
sprintf(buf, "%02d-%02d-%02d ",
systime.wHour, systime.wMinute, systime.wSecond);
fwrite(buf, 1, strlen(buf), g_log);
va_start(ap, strFormat);
vfprintf(g_log, strFormat, ap);
fflush(g_log);
fwrite("\n", 1, strlen("\n"), g_log);
fclose(g_log);
g_log = nullptr;
va_end(ap);
#endif
}
CFtpSource::CFtpSource()
{
m_bStopProcess = false;
m_Key = 0;
m_listensock = INVALID_SOCKET;
}
CFtpSource::~CFtpSource(void)
{
int n = 0;
}
void CFtpSource::Release()
{
}
LONG CFtpSource::Stop()
{
m_bStopProcess = true;
Wait(1000);
return 0L;
}
bool CFtpSource::Create(SOCKET sock)
{
if(!m_cSocket.Create(AF_INET,3000,3000,3000,sock))
{
return false;
}
if (10000 <= g_nKeyEnd)
{
g_nKeyEnd = 4 * 256;
}
m_Key = g_nKeyEnd++;
return true;
}
long CFtpSource::GetKey()
{
return m_Key;
}
int CFtpSource::Thread()
{
ThreadStarted();
#if 0
char inBuffer[1024] = {0};
char outBuffer[1024] = {0};
int nRecvLen = 0;
CGSTcpSocket cUploadSock;
long Result = 0;
m_cSocket.SetNoBlock(false);
sprintf_s(outBuffer,1024,"220 GSurf_Pro FTP Server Version 1.0\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
int error = GetLastError();
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
//user check
sprintf_s(outBuffer,1024,"331 User name ok, need password\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
//pass check
sprintf_s(outBuffer,1024,"230 User logged in\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
bool bSysTest = false;
if (NULL != strstr(inBuffer,"SYST"))
{
bSysTest = true;
sprintf_s(outBuffer,1024,"215 UNIX Type: L8\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
}
//type I
sprintf_s(outBuffer,1024,"200 Type set to I.\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
//CWD
if (NULL != strstr(inBuffer,"CWD /"))
{
sprintf_s(outBuffer,1024,"250 CWD command successful\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
//PASV
int nPort1 = 0;
int nPort2 = 0;
port_hton(m_Key *5 ,nPort1,nPort2);
int a = 0,b = 0,c = 0,d = 0;
if(4 != sscanf(g_pFtpServer->m_pServerAddr,"%d.%d.%d.%d",&a,&b,&c,&d))
{
goto ERROR1;
}
sprintf_s(outBuffer,1024,"227 Entering passive mode (%d,%d,%d,%d,%d,%d)\r\n",a,b,c,d,nPort1,nPort2);
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
SOCKET UploadSock = ListenUpload();
if (INVALID_SOCKET == UploadSock)
{
goto ERROR1;
}
cUploadSock.Create(AF_INET,3000,3000,3000,UploadSock);
cUploadSock.SetNoBlock(false);
FILE *pFile = NULL;
char filepath[255] = {0};;
char *pContext = NULL;
char szRecvBuf[4096] = {0};
long RecSize = 0;
fd_set set;
struct timeval TimeOut;
struct sockaddr_in sa_name;
int sa_name_len = sizeof(sa_name);
TimeOut.tv_sec = 0;
TimeOut.tv_usec = 1000*1000;
do
{
FD_ZERO(&set);
FD_SET(cUploadSock.m_sock, &set);
FD_SET(m_cSocket.m_sock, &set);
if(0 < select(2, &set,NULL, NULL, &TimeOut))
{
if (FD_ISSET(m_cSocket.m_sock,&set))
{
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
char *p = strstr(inBuffer,"STOR ");
if (NULL == p)
{
if (NULL == strstr(inBuffer,"QUIT"))
{
break;
}
}
else
{
p += strlen("STOR ");
char *pEnd = strstr(p,"\r\n");
if (NULL == pEnd)
{
goto ERROR1;
}
if(SOCKET_ERROR == getpeername(m_cSocket.m_sock,(sockaddr*)&sa_name,&sa_name_len))
{
goto ERROR1;
}
unsigned long dwIP = ntohl(sa_name.sin_addr.S_un.S_addr);
memcpy(filepath,p,pEnd - p);
g_messagecallback(dwIP,MSG_QUERY_DEVICE,&Result,filepath);
if (-1 == Result)
{
if (bSysTest)
{
sprintf_s(outBuffer,1024,"125 Using existing data connection\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
do
{
if(!cUploadSock.Recv(szRecvBuf,4096,nRecvLen))
{
goto ERROR1;
}
if (nRecvLen == 0)
{
break;
}
RecSize += nRecvLen;
} while (1 );
goto END_POS;
}
else
{
goto ERROR1;
}
}
if(!CreateFullPath(filepath))
{
goto ERROR1;
}
sprintf_s(outBuffer,1024,"125 Using existing data connection\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
pFile = fopen(filepath,"wb");
if (NULL == pFile)
{
goto ERROR1;
}
}
}
else if (FD_ISSET(cUploadSock.m_sock,&set))
{
if (!cUploadSock.Recv(szRecvBuf,4096,nRecvLen) || 0 == nRecvLen)
{
break;
}
int nError = GetLastError();
RecSize += nRecvLen;
fwrite(szRecvBuf,1,nRecvLen,pFile);
}
}
}while(1);
if (NULL != pFile)
{
fclose(pFile);
pFile = NULL;
}
END_POS:
sprintf_s(outBuffer,1024,"226 Closing data connection; File transfer successful.\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (!m_cSocket.Recv(inBuffer,1024,nRecvLen))
{
goto ERROR1;
}
inBuffer[nRecvLen] = '\0';
TRACE("%s\n",inBuffer);
//QUIT
sprintf_s(outBuffer,1024,"221 Service closing control connection\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))
{
goto ERROR1;
}
if (INVALID_SOCKET != m_listensock)
{
closesocket(m_listensock);
m_listensock = INVALID_SOCKET;
}
g_messagecallback(0,MSG_DELETE_SOURCE_CONNECT,&m_Key,pContext);
return 0L;
ERROR1:
if (INVALID_SOCKET != m_listensock)
{
closesocket(m_listensock);
m_listensock = INVALID_SOCKET;
}
g_messagecallback(m_cSocket.m_sock,MSG_DELETE_SOURCE_CONNECT,&m_Key,pContext);
#else
char inBuffer[1024] = {0};
char outBuffer[1024] = {0};
int nRecvLen = 0;
CGSTcpSocket cUploadSock;
long Result = 0;
m_cSocket.SetNoBlock(false);
sprintf_s(outBuffer,1024,"220 GSurf_Pro FTP Server Version 1.0\r\n");
if (!m_cSocket.Send(outBuffer,strlen(outBuffer)))