#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winbase.h>
typedef struct Hoststruct
{
char HostName[128];
unsigned int HostIp;
char Hostport[32];
char UserName[128];
char PassWord[128];
char CurrentDir[128];
SOCKET HostSocketCmd;
SOCKET HostSocketData;
int npsupport;
int HostState;
struct Hoststruct *next;
}Host;
typedef struct _RESUME
{
char dest[128];
char tmp[128];
char file[128];
char hostSite[128];
char UserName[128];
char PassWord[128];
int size;
int alreadydone;
int hostip;
unsigned short hostPort;
int state;
struct _RESUME *next;
SOCKET sockcmd;
SOCKET sockdata;
HANDLE hThread;
HANDLE hTmpFile;
}RESUME;
typedef struct _upload
{
SOCKET cmdSock;
SOCKET sockdata;
char file[128];
char dest[128];
char hostSite[128];
int size;
int alreadydone;
HANDLE hThread;
struct _upload *next;
}UPLOAD;
Host HostList;
Host *CurrentHost;
RESUME ResumeFile;
UPLOAD Up;
char numResumeFiles;
int PasvOrPort;
int resumeList();
int _scanf(char *s);
int Login();
int ListDir();
int receive(SOCKET s,char *buf,int len);
int post(SOCKET s,char *buf,int len);
int addToHostList(Host *h);
int changeDirectory(char *directory);
int showCurrentDirectory();
int downLoad(char *file,char *directory);
int resumeDownLoad(RESUME *profile);
int upLoad(char *file,char *dest);
int DeleteDown(RESUME *r);
int DeleteHost(Host *h);
int DetectCurrentHostHost();
int main(int argc, char* argv[])
{
int ret;
WSADATA wsa;
RESUME *r;
HANDLE hout;
COORD cord;
struct in_addr in;
char *cmd;
char commandLine[1024]={0};
char param1[1024]={0};
char param2[1024]={0};
char command[1024]={0};
char answer;
struct sockaddr_in hostaddr;
char data[1024]={0};
SOCKET cmdSocket;
resumeList();
CreateDirectory("incompletes",0);
CreateDirectory("downloads",0);
hout = GetStdHandle(STD_OUTPUT_HANDLE);
cord.X=128;
cord.Y=8192;
SetConsoleScreenBufferSize(hout,cord);
if(!WSAStartup(0x0101,&wsa))
{
printf("winsock initialization done! wait for command.../n");
printf("type /" ? /"for help");
}
else
{
printf("fail to initialize winsock!/n");
return 0;
}
typeCommand:
printf("/n");
printf("ftp> ");
ZeroMemory(commandLine,1024);
ZeroMemory(param1,1024);
ZeroMemory(param2,1024);
_scanf(commandLine);
//process commandling...
cmd=commandLine;
while(*(cmd)==' ')cmd++;
if(strncmp(cmd,"login",5)==0)
{
Login();
}
else if(strncmp(cmd,"quit",4)==0)
{
printf("bye^_^");
WSACleanup();
return 1;
}
else if(strncmp(cmd,"show site",9)==0)
{
int d=0;
Host *phosts;
phosts=HostList.next;
printf("/n");
while(phosts!=NULL)
{
d++;
in.S_un.S_addr=phosts->HostIp;
printf("%d. Site:%s Ip:%s/n",d,phosts->HostName,inet_ntoa(in));
phosts=phosts->next;
}
}
else if(strncmp(cmd,"site",4)==0)
{
int psite=0;
Host *phost;
phost=HostList.next;
cmd=cmd+5;
ZeroMemory(param1,sizeof(param1));
while(*(cmd)!=0)
{
param1[psite]=*(cmd);
cmd++;
psite++;
}
psite=atoi(param1);
psite--;
while(psite && phost!=NULL)
{
psite--;
phost=phost->next;
}
if(phost!=NULL)
{
CurrentHost=phost;
printf("/nCurrentHost:%s/n",CurrentHost->HostName);
}
}
else if(strncmp(cmd,"resume",6)==0)
{
int k=0,s=1;
cmd=cmd+7;
ZeroMemory(param1,sizeof(param1));
while(*(cmd)!=0)
{
param1[k]=*(cmd);
cmd++;
k++;
}
k=atoi(param1);
r=ResumeFile.next;
while(r!=NULL)
{
if(s==k)goto resume;
s++;
r=r->next;
}
resume:
if(r!=NULL)
{
if(r->alreadydone>=r->size)
printf("/ndownload file %s already complete/n,",r->file);
else
resumeDownLoad(r);
}
}
else if(strncmp(cmd,"show down",9)==0)
{
int c=0;
r=&ResumeFile;
r=r->next;
printf("/n");
while(r!=NULL)
{
c++;
in.S_un.S_addr=r->hostip;
if(r->state==1)
{printf("%d.",c);printf("file %s from site %s,total %d,already done: %d/nstate: on/n",r->file,inet_ntoa(in),r->size,r->alreadydone);}
else
{printf("%d.",c);printf("file %s from site %s,total %d,already done: %d/nstate: off/n",r->file,inet_ntoa(in),r->size,r->alreadydone);}
r=r->next;
}
}
else if(strncmp(cmd,"show up",7)==0)
{
int c=0;
UPLOAD *u;
u=&Up;
u=u->next;
printf("/n");
while(u!=NULL)
{
c++;
if(u->alreadydone==1)
{printf("%d.",c);printf("upload file %s to site %s/%s succeeded/n",u->file,u->hostSite,u->dest);}
else if(u->alreadydone==0)
{printf("%d.",c);printf("upload file %s to site %s/%s is being done",u->file,u->hostSite,u->dest);}
u=u->next;
}
}
else if(strncmp(cmd,"cancel",6)==0)
{
int pr=0;
RESUME *res;
res=ResumeFile.next;
cmd=cmd+7;
ZeroMemory(param1,sizeof(param1));
while(*(cmd)!=0)
{
param1[pr]=*(cmd);
cmd++;
pr++;
}
pr=atoi(param1);
pr--;
while(pr && res!=NULL)
{
pr--;
res=res->next;
}
if(res!=NULL)
{
TerminateThread(res->hThread,0);
closesocket(res->sockcmd);
closesocket(res->sockdata);
CloseHandle(res->hTmpFile);
res->state=0;
DeleteFile(res->tmp);
DeleteDown(res);
}
}
else if(strncmp(cmd,"stop",4)==0)
{
int pfile=0;
RESUME *re;
re=ResumeFile.next;
cmd=cmd+5;
ZeroMemory(param1,sizeof(param1));
while(*(cmd)!=0)
{
param1[pfile]=*(cmd);
cmd++;
pfile++;
}
pfile=atoi(param1);
pfile--;
while(pfile && re!=NULL)
{
pfile--;
re=re->next;
}
if(re!=NULL)
{
TerminateThread(re->hThread,0);
closesocket(re->sockcmd);
closesocket(re->sockdata);
if(re->alreadydone!=re->size)re->state=0;
}
}
if(CurrentHost==NULL)goto typeCommand;
if(strncmp(cmd,"dir",3)==0)
{
if(CurrentHost!=NULL)
{
ListDir();
}
}
else if(strncmp(cmd,"cd",2)==0)
{
int i=0;
cmd=cmd+3;
while(*(cmd)!=0)
{
param1[i]=*(cmd);
cmd++;
i++;
}
changeDirectory(param1);
}
else if(strncmp(cmd,"pos",3)==0)
{
showCurrentDirectory();
}
else if(strncmp(cmd,"download",8)==0)
{
int j=0;
cmd=cmd+9;
while(*(cmd)!=0)
{
param1[j]=*(cmd);
cmd++;
j++;
}
printf("/n保存路径(默认为//downloads//):/n");
_scanf(param2);
if(param2[0]!=0)
{
int err;
CreateDirectory(param2,0);
err=GetLastError();
if(err!=183 && err!=0)
{
printf("/n路径错误/n");
goto typeCommand;
}
}
else
{
strcpy(param2,"downloads/0");
}
downLoad(param1,param2);
}
else if(strncmp(cmd,"upload",6)==0)
{
printf("/n源文件路径:/n");
_scanf(param1);
printf("/n目标:/n");
_scanf(param2);
upLoad(param1,param2);
}
else if(strncmp(cmd,"show current",12)==0)
{
printf("/nCurrentHost: %s/n",CurrentHost->HostName);
}
else if(strncmp(cmd,"pasv",4)==0)
{
printf("Enter pasv mode.../n");
PasvOrPort=0;
}
else if(strncmp(cmd,"port",4)==0)
{
PasvOrPort=1;
printf("Enter port mode.../n");
}
else if(strncmp(cmd,"logoff",6)==0)
{
if(CurrentHost!=NULL)
{
closesocket(CurrentHost->HostSocketCmd);
closesocket(CurrentHost->HostSocketData);
printf("/nHost:%s,logoff!/n",CurrentHost->HostName);
DeleteHost(CurrentHost);
CurrentHost=NULL;
}
}
if(CurrentHost!=NULL)
ret=DetectCurrentHostHost();
if(ret<0 && CurrentHost!=NULL)
{
answer='y';
printf("/ncurrent connection closed by remote host,reconnecting.../n");
if(answer=='y')