www.pudn.com > client.rar > client.c, change:2009-06-04,size:40125b


#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') 
  { 
   hostaddr.sin_family=AF_INET; 
   hostaddr.sin_port=(unsigned short)htons((unsigned short)atoi(CurrentHost->Hostport)); 
   hostaddr.sin_addr.s_addr=CurrentHost->HostIp; 
   cmdSocket=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); 
   ret=connect(cmdSocket,&hostaddr,sizeof hostaddr); 
   if(ret!=0) 
   { 
    printf("\nConnect error!\n"); 
    return -1; 
   } 
   ret=receive(cmdSocket,data,1024); 
   if(ret!=1) 
   { 
    printf("\nConnect error!\n"); 
    return -1; 
   } 
   if(strncmp(data,"220",3)==0) 
   { 
    printf("\nConnect success,send UserName"); 
   } 
   else 
   { 
    printf("\nConnect error!\n"); 
    return -1; 
   } 
   ZeroMemory(command,1024); 
   strcat(command,"USER "); 
   strcat(command,CurrentHost->UserName); 
   strcat(command,"\r\n\0"); 
   ret=post(cmdSocket,command,strlen(command)); 
   if(ret!=1) 
   { 
    printf("\nConnect error!\n"); 
    return -1; 
   } 
   ZeroMemory(data,1024); 
   ret=receive(cmdSocket,data,1024); 
   if(strncmp(data,"331",3)==0) 
   { 
    printf("\nConnect success,send PassWord"); 
   } 
   else 
   { 
    printf("\nConnect error!\n"); 
    return -1; 
   } 
   ZeroMemory(command,1024); 
   strcat(command,"PASS "); 
   strcat(command,CurrentHost->PassWord); 
   strcat(command,"\r\n\0"); 
   ret=post(cmdSocket,command,strlen(command)); 
   if(ret!=1) 
   { 
    printf("\nConnect error!\n"); 
    return-1; 
   } 
   ret=receive(cmdSocket,data,1024); 
   if(strncmp(data,"230",3)==0) 
   { 
    printf("\nLogin success,wait for command...\n"); 
   }  
   CurrentHost->HostSocketCmd=cmdSocket; 
  } 
 } 
 ZeroMemory(commandLine,1024); 
 goto typeCommand; 
 printf("\n"); 
 return 1; 
} 
 
int _scanf(char *s) 
{ 
 char c=0; 
 int i=0; 
 while(c!='\n') 
 { 
  scanf("%c",&c); 
  *(s+i)=c; 
  i++; 
 } 
 *(s+i-1)=0; 
 *(s+i)=0; 
 return 1; 
} 
 
int receive(SOCKET s,char *buf,int len) 
{ 
 FD_SET ReadSet; 
 struct timeval time; 
 int iret; 
 time.tv_sec=1; 
 FD_ZERO(&ReadSet); 
 FD_SET(s,&ReadSet); 
 time.tv_usec=0; 
 iret=select(0,&ReadSet,0,0,&time); 
 GetLastError(); 
 if(iret==SOCKET_ERROR) 
  return -1; 
 else if(iret==0) 
  return -2; 
 recv(s,buf,len,0); 
 return 1; 
} 
 
int _receive(SOCKET s,char *buf,int len) 
{ 
 FD_SET ReadSet; 
 struct timeval time; 
 int iret; 
 time.tv_sec=1; 
 FD_ZERO(&ReadSet); 
 FD_SET(s,&ReadSet); 
 time.tv_usec=0; 
 iret=select(0,&ReadSet,0,0,&time); 
 GetLastError(); 
 if(iret==SOCKET_ERROR) 
  return -1; 
 else if(iret==0) 
  return -2; 
 iret=recv(s,buf,len,0); 
 return iret; 
} 
 
int post(SOCKET s,char *buf,int len) 
{ 
 FD_SET WriteSet; 
 struct timeval time; 
 int iret; 
 time.tv_sec=1; 
 FD_ZERO(&WriteSet); 
 FD_SET(s,&WriteSet); 
 time.tv_usec=0; 
 iret=select(0,0,&WriteSet,0,&time); 
 GetLastError(); 
 if(iret==SOCKET_ERROR) 
  return -1; 
 else if(iret==0) 
  return -2; 
 send(s,buf,len,0); 
 return 1; 
} 
 
int addToHostList(Host *h) 
{ 
 Host *host; 
 host= &HostList; 
 while(host->next!=NULL) 
 { 
  host=host->next; 
 } 
 host->next=h; 
 h->next=NULL; 
 return 1; 
} 
 
int Login() 
{ 
 SOCKET cmdSocket; 
 struct sockaddr_in hostaddr; 
 Host *host; 
 int ret; 
 unsigned short port; 
 char **ptr=NULL; 
 int *addr=NULL; 
 struct hostent *iphost=NULL; 
 char data[1024]={0}; 
 char command[1024]={0}; 
 host=(Host *)malloc(sizeof(Host)); 
 printf("Enter HostName:"); 
 _scanf(host->HostName); 
 iphost=gethostbyname(host->HostName); 
 if(iphost==NULL) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 printf("Enter port(Default is 21):"); 
 _scanf(host->Hostport); 
 port=atoi(host->Hostport); 
 if(port==0 || port>65535)  
  port=21; 
  ptr=iphost->h_addr_list; 
 addr=(int *)(*(ptr)); 
 hostaddr.sin_family=AF_INET; 
 hostaddr.sin_port=(unsigned short)htons(port); 
 hostaddr.sin_addr.s_addr=*(addr); 
 cmdSocket=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); 
 ret=connect(cmdSocket,&hostaddr,sizeof hostaddr); 
 if(ret!=0) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 host->HostSocketCmd=cmdSocket; 
 ret=receive(host->HostSocketCmd,data,1024); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 if(strncmp(data,"220",3)==0) 
 { 
  printf("\nConnect success,need UserName:"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 _scanf(host->UserName); 
 ZeroMemory(command,1024); 
 strcat(command,"USER "); 
 strcat(command,host->UserName); 
 strcat(command,"\r\n\0"); 
 ret=post(host->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ZeroMemory(data,1024); 
 ret=receive(host->HostSocketCmd,data,1024); 
 if(strncmp(data,"331",3)==0) 
 { 
  printf("\nConnect success,need PassWord:"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 _scanf(host->PassWord); 
 ZeroMemory(command,1024); 
 strcat(command,"PASS "); 
 strcat(command,host->PassWord); 
 strcat(command,"\r\n\0"); 
 ret=post(host->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ret=receive(host->HostSocketCmd,data,1024); 
 if(strncmp(data,"230",3)==0) 
 { 
  printf("\nLogin success!"); 
  host->HostIp=hostaddr.sin_addr.s_addr; 
  ZeroMemory(command,1024); 
  strcat(command,"REST 100\r\n\0"); 
  ret=post(host->HostSocketCmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   printf("\nlose connection.\n"); 
   return -1; 
  } 
  ZeroMemory(data,1024); 
  ret=receive(host->HostSocketCmd,data,1024); 
  if(ret!=1) 
  { 
   printf("\nlose connection.\n"); 
   return -1; 
  } 
  if(strstr(data,"350 Restarting at 100")!=0) 
  { 
   host->npsupport=1; 
   printf("\n站点支持断点续传\n"); 
  } 
  else 
  { 
   host->npsupport=0; 
   printf("\n站点不支持断点续传\n"); 
  } 
  ZeroMemory(command,1024); 
  strcat(command,"REST 0\r\n\0"); 
  ret=post(host->HostSocketCmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   printf("\nlose connection.\n"); 
   return -1; 
  } 
  ZeroMemory(data,1024); 
  ret=receive(host->HostSocketCmd,data,1024); 
  strcpy(command,"PWD"); 
  strcat(command,"\r\n"); 
  ret=post(host->HostSocketCmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   printf("\nConnect error!\n"); 
   return -1; 
  } 
  ret=receive(host->HostSocketCmd,data,128); 
  if(ret!=1) 
  { 
   printf("\nConnect error!\n"); 
   return -1; 
  } 
  else 
  { 
   if(strncmp(data,"257",3)==0) 
   { 
    int i=0; 
    char *ptr1; 
    ptr1=data+5; 
    while(*(ptr1)!='\"') 
    { 
     *(host->CurrentDir+i)=*(ptr1); 
     ptr1++; 
     i++; 
    } 
    *(host->CurrentDir+i)='\0'; 
    printf("Current directory is: %s",host->CurrentDir); 
   } 
  } 
  addToHostList(host); 
  CurrentHost=host; 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 return 1; 
} 
 
DWORD WINAPI ListenProc(LPVOID lParam) 
{ 
 SOCKET dataSock; 
 SOCKET ss; 
 SOCKET *s; 
 int ret; 
 s=lParam; 
 dataSock=*(s); 
 ret=listen(dataSock,1); 
 if(ret!=0) 
 { 
  printf("\nfail to listen...\n"); 
  return -1; 
 } 
 ss=accept(dataSock,NULL,0); 
 *(s)=ss; 
 if(ss==INVALID_SOCKET) 
 { 
  printf("\nhost fail to connect...\n"); 
  return -1; 
 } 
 return 1;  
} 
 
int ListDir() 
{ 
 char command[1024]={0}; 
 char _data[128]={0}; 
 char *data; 
 char numBuf[8]={0}; 
 char attrib[32]={0}; 
 char Size[32]={0}; 
 char param1[64]={0}; 
 char fileName[128]={0}; 
 char *ptr1,*ptr2; 
 int  flag=0,ip=0,jp=0; 
 SOCKET dataSock; 
 struct sockaddr_in hostaddr; 
 unsigned short i,j,port; 
 int ret; 
 data=(char *)malloc(sizeof(char)*128000); 
 ZeroMemory(data,128000); 
 ZeroMemory(command,1024); 
 if(PasvOrPort==0) 
 { 
  strcat(command,"PASV \r\n\0"); 
  ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   printf("\nConnect error!\n"); 
   free(data); 
   return -1; 
  } 
  ret=receive(CurrentHost->HostSocketCmd,data,1024); 
  if(strncmp(data,"227",3)==0) 
  { 
   printf("%s\n",data); 
  } 
  else 
  { 
   free(data); 
   return -1; 
  } 
  ptr1=data+strlen(data); 
  while(*(ptr1)!=')') 
   ptr1--; 
  ptr2=ptr1; 
  while(*(ptr2)!=',') 
   ptr2--; 
  ZeroMemory(numBuf,8); 
  strncpy(numBuf,ptr2+1,ptr1-ptr2-1); 
  j=atoi(numBuf); 
  ptr2--; 
  ptr1=ptr2; 
  ptr2++; 
  while(*(ptr1)!=',') 
   ptr1--; 
  ZeroMemory(numBuf,8); 
  strncpy(numBuf,ptr1+1,ptr2-ptr1-1); 
  i=atoi(numBuf); 
  port=i*256+j; 
  dataSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_addr.s_addr=CurrentHost->HostIp; 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_port=htons(port); 
  ret=connect(dataSock,&hostaddr,sizeof hostaddr); 
  if(ret!=0) 
  { 
   printf("\nConnect error!\n"); 
   free(data); 
   return -1; 
  } 
 } 
 else 
 { 
  dataSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_addr.s_addr=INADDR_ANY; 
  hostaddr.sin_port=0; 
  ret=bind(dataSock,&hostaddr,sizeof(hostaddr)); 
  CreateThread(0,0,ListenProc,&dataSock,0,0); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   printf("\nfail to bind a port for listenning...\n"); 
   return -1; 
  } 
  ip=sizeof(struct sockaddr); 
  ret=getsockname(dataSock,(struct sockaddr *)&hostaddr,&ip); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   printf("\nfail to decide the port number...\n"); 
   return -1; 
  } 
  ip=ntohs(hostaddr.sin_port)/256; 
  jp=ntohs(hostaddr.sin_port)%256; 
  strcat(command,"PORT "); 
  ZeroMemory(param1,128); 
  ret=sizeof(struct sockaddr_in); 
  getsockname(CurrentHost->HostSocketCmd,&hostaddr,&ret); 
  strcpy(_data,inet_ntoa(hostaddr.sin_addr)); 
  ptr1=_data; 
  while(*(ptr1)!=0) 
  { 
   if(*(ptr1)=='.') 
   { 
    *(ptr1)=','; 
   } 
   ptr1++; 
  } 
  strcat(command,_data); 
  strcat(command,","); 
  strcat(command,itoa(ip,numBuf,10)); 
  strcat(command,","); 
  strcat(command,itoa(jp,numBuf,10)); 
  strcat(command,"\r\n\0\0"); 
  ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   printf("\nConnect error!\n"); 
   free(data); 
   return -1; 
  } 
  ret=receive(CurrentHost->HostSocketCmd,data,1024); 
  if(strncmp(data,"200",3)==0) 
  { 
   printf("%s\n",data); 
  } 
  else 
  { 
   free(data); 
   return -1; 
  } 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"LIST"); 
 strcat(command,"\r\n\0"); 
 ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(data); 
  return -1; 
 } 
receiveData: 
 Sleep(20); 
 ZeroMemory(data,128000); 
 ret=_receive(dataSock,data,128000); 
 if(ret==0) 
 { 
  closesocket(dataSock); 
  goto ending; 
 } 
 printf("%s",data); 
 if(flag==0) 
 { 
  ret=_receive(CurrentHost->HostSocketCmd,_data,128); 
  if(strstr(_data,"226")!=NULL) 
  { 
   flag=1; 
   goto receiveData; 
  } 
 } 
 goto receiveData; 
ending: 
 if(flag!=1) 
  ret=_receive(CurrentHost->HostSocketCmd,_data,128); 
 free(data); 
 return 1; 
} 
 
int changeDirectory(char *directory) 
{ 
 char command[128]="CWD "; 
 char data[128]="\0"; 
 int ret; 
 strcat(command,directory); 
 strcat(command,"\r\n"); 
 ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ret=receive(CurrentHost->HostSocketCmd,data,128); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 printf("%s\n",data); 
 if(strncmp(data,"250",3)==0) 
 { 
  strcpy(command,"PWD \r\n\0"); 
  ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
  if(ret==-1) 
  { 
   printf("\nConnect error!\n"); 
   return -1; 
  } 
  ret=receive(CurrentHost->HostSocketCmd,data,128); 
  if(ret!=1) 
  { 
   printf("\nConnect error!\n"); 
   return -1; 
  } 
  else 
  { 
   if(strncmp(data,"257",3)==0) 
   { 
    int i=0; 
    char *ptr1; 
    ptr1=data+5; 
    while(*(ptr1)!='\"') 
    { 
     *(CurrentHost->CurrentDir+i)=*(ptr1); 
     ptr1++; 
     i++; 
    } 
    *(CurrentHost->CurrentDir+i)='\0'; 
    printf("Current directory is: %s",CurrentHost->CurrentDir); 
   } 
  } 
 } 
 return 1; 
} 
 
int showCurrentDirectory() 
{ 
 char command[128]="PWD"; 
 char data[128]="\0"; 
 int ret; 
 strcat(command,"\r\n"); 
 ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ret=receive(CurrentHost->HostSocketCmd,data,128); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 printf("%s\n",data); 
 return 1; 
} 
 
DWORD WINAPI downLoadProcA(LPVOID lpParam) 
{ 
 RESUME *r; 
 int ii; 
 unsigned short i,j,port; 
 char *ptr1,*ptr2; 
 char command[64]={0}; 
 char already[64]={0}; 
 char _data[128]={0}; 
 char param1[128]={0}; 
 char *data; 
// start pasv   
 char numBuf[8]={0}; 
 HANDLE hFile; 
 HANDLE hTmpFile; 
 HANDLE hListenThread; 
 SOCKET dataSock; 
 struct sockaddr_in hostaddr; 
 int ret,_ret,ip,jp; 
 int flag=0; 
 r=lpParam; 
 r->state=1; 
 data=VirtualAlloc(NULL,1024*1024,MEM_COMMIT,PAGE_READWRITE); 
 if(data==NULL){VirtualFree(data,1024*1024,MEM_DECOMMIT);r->state=0; return-1;} 
 ZeroMemory(data,1024*1024); 
// set pointer 
 ZeroMemory(command,64); 
 strcat(command,"REST "); 
 ii=r->alreadydone; 
 _itoa(ii,already,10); 
 strcat(command,already); 
 strcat(command,"\r\n\0\0"); 
 ret=post(r->sockcmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  return -1; 
 } 
 ZeroMemory(data,1024*1024); 
 ret=receive(r->sockcmd,data,1024*1024); 
 if(ret!=1) 
 { 
  return -1; 
 } 
 if(strstr(data,"350 Restarting")==0 && strncmp(data,"501",3)!=0) 
  return -1; 
// set pasv 
 if(PasvOrPort==0) 
 { 
  ZeroMemory(command,64); 
  strcat(command,"PASV \r\n\0"); 
  ret=post(r->sockcmd,command,64); 
  if(ret!=1) 
  { 
   {VirtualFree(data,1024*1024,MEM_DECOMMIT);r->state=0; return-1;} 
  } 
  ZeroMemory(data,1024*1024); 
  ret=receive(r->sockcmd,data,1024*1024); 
  if(strncmp(data,"227",3)!=0) 
   {VirtualFree(data,1024*1024,MEM_DECOMMIT);r->state=0; return-1;} 
  ptr1=data+strlen(data); 
  while(*(ptr1)!=')') 
   ptr1--; 
  ptr2=ptr1; 
  while(*(ptr2)!=',') 
   ptr2--; 
  strncpy(numBuf,ptr2+1,ptr1-ptr2-1); 
  j=atoi(numBuf); 
  ptr2--; 
  ptr1=ptr2; 
  ptr2++; 
  while(*(ptr1)!=',') 
   ptr1--; 
  strncpy(numBuf,ptr1+1,ptr2-ptr1-1); 
  i=atoi(numBuf); 
  port=i*256+j; 
  dataSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_addr.s_addr=r->hostip; 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_port=htons(port); 
  ret=connect(dataSock,&hostaddr,sizeof hostaddr); 
  if(ret!=0) 
   {VirtualFree(data,1024*1024,MEM_DECOMMIT); r->state =0;return-1;} 
 } 
 else 
 { 
  r->sockdata=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_addr.s_addr=INADDR_ANY; 
  hostaddr.sin_port=0; 
  ret=bind(r->sockdata,&hostaddr,sizeof(hostaddr)); 
  dataSock=r->sockdata; 
  hListenThread=CreateThread(0,0,ListenProc,&(r->sockdata),0,0); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   return -1; 
  } 
  ip=sizeof(struct sockaddr); 
  ret=getsockname(r->sockdata,(struct sockaddr *)&hostaddr,&ip); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   return -1; 
  } 
  ip=ntohs(hostaddr.sin_port)/256; 
  jp=ntohs(hostaddr.sin_port)%256; 
  ZeroMemory(command,64); 
  strcat(command,"PORT "); 
  ZeroMemory(param1,128); 
  ret=sizeof(struct sockaddr_in); 
  getsockname(r->sockcmd,&hostaddr,&ret); 
  strcpy(_data,inet_ntoa(hostaddr.sin_addr)); 
  ptr1=_data; 
  while(*(ptr1)!=0) 
  { 
   if(*(ptr1)=='.') 
   { 
    *(ptr1)=','; 
   } 
   ptr1++; 
  } 
  strcat(command,_data); 
  strcat(command,","); 
  strcat(command,itoa(ip,numBuf,10)); 
  strcat(command,","); 
  strcat(command,itoa(jp,numBuf,10)); 
  strcat(command,"\r\n\0\0"); 
  ret=post(r->sockcmd,command,strlen(command)); 
  if(ret!=1) 
  { 
   free(data); 
   return -1; 
  } 
  ZeroMemory(data,1024*1024); 
  ret=receive(r->sockcmd,data,1024*1024); 
  if(strncmp(data,"200",3)!=0) 
  { 
   free(data); 
   return -1; 
  } 
 } 
 hFile=CreateFile(r->dest,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
 hTmpFile=CreateFile(r->tmp,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
 r->hTmpFile=hTmpFile; 
 if(hFile==INVALID_HANDLE_VALUE || hTmpFile==INVALID_HANDLE_VALUE){VirtualFree(data,1024*1024,MEM_DECOMMIT); return-1;} 
 SetFilePointer(hTmpFile,128+128+128+128+128+128,0,FILE_BEGIN); 
 SetFilePointer(hFile,r->alreadydone,0,FILE_BEGIN); 
 ZeroMemory(command,64); 
 strcat(command,"RETR "); 
 strcat(command,r->file); 
 strcat(command,"\r\n\0"); 
 ret=post(r->sockcmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  CloseHandle(hFile); 
  CloseHandle(hTmpFile); 
  DeleteFile(r->tmp); 
  {VirtualFree(data,1024*1024,MEM_DECOMMIT); r->state=0;return -1;} 
 } 
 ZeroMemory(data,1024*1024); 
 ret=_receive(r->sockcmd,data,1024*1024); 
 if(PasvOrPort==1) 
 { 
waiting: 
  if(dataSock==r->sockdata) 
  { 
   Sleep(20); 
   goto waiting; 
  } 
  dataSock=r->sockdata; 
 } 
// get data 
getdata: 
 ZeroMemory(data,1024*1024); 
 ret=_receive(dataSock,data,1024*1024); 
 if(ret<0){VirtualFree(data,1024*1024,MEM_DECOMMIT); r->state=0;return -1;} 
// refresh data  
 WriteFile(hFile,data,ret,&_ret,0); 
 FlushFileBuffers(hFile); 
 r->alreadydone+=ret; 
 WriteFile(hTmpFile,((char *)r+128*6),sizeof(RESUME)-128*6,&_ret,0); 
 FlushFileBuffers(hTmpFile); 
 SetFilePointer(hTmpFile,128+128+128+128+128+128,0,FILE_BEGIN); 
 if(flag==0) 
 { 
  ret=_receive(r->sockcmd,data,512); 
  flag=1; 
  goto getdata; 
 } 
 if(flag==1) 
 { 
  if(r->size==r->alreadydone) 
   goto ending; 
  else 
   goto getdata; 
 } 
ending: 
 CloseHandle(hFile); 
 CloseHandle(hTmpFile); 
 closesocket(dataSock); 
 VirtualFree(data,1024*1024,MEM_DECOMMIT); 
 DeleteFile(r->tmp); 
 r->state=0; 
 return 1; 
} 
 
int addtoDownLoadList(RESUME *r) 
{ 
 r->next=ResumeFile.next; 
 ResumeFile.next=r; 
 return 1; 
} 
 
int downLoad(char *file,char *directory) 
{ 
// login 
 HANDLE hFile; 
 SOCKET cmdSocket; 
 struct sockaddr_in hostaddr; 
 Host *host; 
 RESUME *r; 
 int ret; 
 unsigned short port; 
 char **ptr=NULL,*_file=NULL; 
 int *addr=NULL; 
 struct hostent *iphost=NULL; 
 char data[1024]={0}; 
 char command[1024]={0}; 
 char incomName[80]={0}; 
 host=CurrentHost; 
 _file=file+strlen(file)-1; 
 while(_file>=file && *(_file)!='/') 
 { 
  _file--; 
 } 
 if(_file<file)_file=file; 
 else 
  if(*(_file)=='/') 
   _file++; 
 iphost=gethostbyname(host->HostName); 
 r=(RESUME *)malloc(sizeof(RESUME)); 
 ZeroMemory(r,sizeof(RESUME)); 
 if(iphost==NULL) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 port=atoi(host->Hostport); 
 if(port==0 || port>65535)  
  port=21; 
  ptr=iphost->h_addr_list; 
 addr=(int *)(*(ptr)); 
 hostaddr.sin_family=AF_INET; 
 hostaddr.sin_port=(unsigned short)htons(port); 
 hostaddr.sin_addr.s_addr=*(addr); 
 cmdSocket=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); 
 ret=connect(cmdSocket,&hostaddr,sizeof hostaddr); 
  if(ret!=0) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 if(strncmp(data,"220",3)==0) 
 { 
  printf("\nConnect success,send UserName"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"USER "); 
 strcat(command,host->UserName); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(data,1024); 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"331",3)==0) 
 { 
  printf("\nConnect success,send PassWord"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"PASS "); 
 strcat(command,host->PassWord); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"230",3)==0) 
 { 
  printf("\nLogin success,prepare to download\n"); 
 } 
 else 
 { 
  printf("\nConnect error!download aborted\n"); 
  free(r);return-1; 
 } 
 if(strncmp(file,"/",1)!=0) 
 { 
  strcpy(r->file,CurrentHost->CurrentDir); 
  if(*(CurrentHost->CurrentDir+strlen(CurrentHost->CurrentDir)-1)!='/') 
   strcat(r->file,"/"); 
  strcat(r->file,_file); 
 } 
 else 
 { 
  strcat(r->file,file); 
 } 
// get file size 
 ZeroMemory(command,1024); 
 strcat(command,"SIZE "); 
 strcat(command,r->file); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(data,1024); 
 ret=receive(cmdSocket,data,1024); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 if(strncmp(data,"213",3)!=0) 
 { 
  printf("\nCan't find the file\n"); 
  free(r);return-1; 
 } 
 r->size=atoi(data+4); 
 r->alreadydone=0; 
 r->sockcmd=cmdSocket; 
 r->hostPort=(unsigned short)htons((unsigned short)atoi(CurrentHost->Hostport)); 
 strcpy(r->dest,directory); 
 strcat(r->dest,"\\"); 
 strcat(r->dest,_file); 
 r->next=NULL; 
// fill profile and create profile and realfile 
 strcpy(incomName,"incompletes\\"); 
 strcat(incomName,_file); 
 strcat(incomName,".tmp"); 
 strcpy(r->tmp,incomName); 
 hFile=CreateFile(incomName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); 
 if(hFile==INVALID_HANDLE_VALUE) 
 { 
  printf("cannot create profile,download fail."); 
  free(r);return-1; 
 } 
 ret=0; 
 r->hostip=hostaddr.sin_addr.s_addr; 
 strcpy(r->hostSite,CurrentHost->HostName); 
 strcpy(r->PassWord,CurrentHost->PassWord); 
 strcpy(r->UserName,CurrentHost->UserName); 
 WriteFile(hFile,r,sizeof(RESUME),&ret,0); 
 if(!ret) 
 { 
  printf("\ncannot write profile,download fail\n"); 
  free(r);return-1; 
 } 
 CloseHandle(hFile); 
 hFile=CreateFile(r->dest,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_DELETE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); 
 if(hFile==INVALID_HANDLE_VALUE) 
 { 
  printf("cannot create file,download fail."); 
  free(r);return-1; 
 } 
 CloseHandle(hFile); 
 r->state=0; 
 addtoDownLoadList(r); 
// start download 
 r->hThread=CreateThread(0,0,downLoadProcA,r,0,0); 
 return 1;  
} 
 
int resumeDownLoad(RESUME *profile) 
{ 
// login 
 SOCKET cmdSocket; 
 struct sockaddr_in hostaddr; 
 int ret; 
 unsigned short port; 
 char **ptr=NULL; 
 int *addr=NULL; 
 struct hostent *iphost=NULL; 
 char data[1024]={0}; 
 char command[1024]={0}; 
 char incomName[80]={0}; 
 iphost=gethostbyname(profile->hostSite); 
 if(iphost==NULL) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 port=profile->hostPort; 
 if(port==0 || port>65535)  
  port=21; 
  ptr=iphost->h_addr_list; 
 addr=(int *)(*(ptr)); 
 hostaddr.sin_family=AF_INET; 
 hostaddr.sin_port=(unsigned short)port; 
 hostaddr.sin_addr.s_addr=*(addr); 
 cmdSocket=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); 
 ret=connect(cmdSocket,&hostaddr,sizeof hostaddr); 
 if(ret!=0) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 if(strncmp(data,"220",3)==0) 
 { 
  printf("\nConnect success,send UserName"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"USER "); 
 strcat(command,profile->UserName); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ZeroMemory(data,1024); 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"331",3)==0) 
 { 
  printf("\nConnect success,send PassWord"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"PASS "); 
 strcat(command,profile->PassWord); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  return -1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"230",3)==0) 
 { 
  printf("\nLogin success,prepare to download"); 
 } 
 else 
 { 
  printf("\nConnect error!download aborted\n"); 
  return -1; 
 } 
// start download  
 profile->state=0; 
 profile->sockcmd=cmdSocket; 
// start download 
 profile->hThread=CreateThread(0,0,downLoadProcA,profile,0,0); 
 return 1; 
} 
 
int resumeList() 
{ 
 RESUME *r; 
 int ret; 
 HANDLE hFind,hFile; 
 WIN32_FIND_DATA wfd; 
 char name[128]; 
 hFind=FindFirstFile("incompletes\\*.tmp",&wfd); 
 if(hFind==INVALID_HANDLE_VALUE)return 0; 
 r=(RESUME *)malloc(sizeof(RESUME)); 
 strcpy(name,"incompletes\\"); 
 strcat(name,wfd.cFileName); 
 hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
 if(hFile!=INVALID_HANDLE_VALUE) 
 { 
  ReadFile(hFile,r,sizeof(RESUME),&ret,0); 
  CloseHandle(hFile); 
  r->state=0; 
  addtoDownLoadList(r); 
 } 
 else 
 { 
  free(r); 
 } 
 while(FindNextFile(hFind,&wfd)!=0) 
 { 
  r=(RESUME *)malloc(sizeof(RESUME)); 
  strcpy(name,"incompletes\\"); 
  strcat(name,wfd.cFileName); 
  hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
  if(hFile!=INVALID_HANDLE_VALUE) 
  { 
   ReadFile(hFile,r,sizeof(RESUME),&ret,0); 
   CloseHandle(hFile); 
   r->state=0; 
   addtoDownLoadList(r); 
  } 
  else 
  { 
   free(r); 
  }   
 } 
 FindClose(hFind); 
 return 1; 
} 
int addtoUpLoadList(UPLOAD *r) 
{ 
 r->next=Up.next; 
 Up.next=r; 
 return 1; 
} 
 
DWORD WINAPI upLoadProcA(LPVOID lpParam) 
{ 
 UPLOAD *r; 
 HANDLE hListenThread; 
 unsigned short i,j,port; 
 char *ptr1,*ptr2; 
 char command[64]={0}; 
 char param1[128]={0}; 
 char already[64]={0}; 
 char _data[512]={0}; 
 char *data; 
// start pasv   
 char numBuf[8]={0}; 
 HANDLE hFile; 
 SOCKET dataSock; 
 struct sockaddr_in hostaddr; 
 int ret,ip,jp; 
 int flag=0; 
 r=lpParam; 
 data=VirtualAlloc(NULL,r->size,MEM_COMMIT,PAGE_READWRITE); 
 if(data==NULL){VirtualFree(data,1024*1024,MEM_DECOMMIT); return-1;} 
 ZeroMemory(data,r->size); 
// set pasv 
 if(PasvOrPort==0) 
 { 
  ZeroMemory(command,64); 
  strcat(command,"PASV \r\n\0"); 
  ret=post(r->cmdSock,command,64); 
  if(ret!=1) 
   {VirtualFree(data,1024*1024,MEM_DECOMMIT); return-1;} 
  ZeroMemory(_data,512); 
  ret=receive(r->cmdSock,_data,512); 
  if(strncmp(_data,"227",3)!=0) 
   {VirtualFree(data,r->size,MEM_DECOMMIT); return-1;} 
  ptr1=_data+strlen(_data); 
  while(*(ptr1)!=')') 
   ptr1--; 
  ptr2=ptr1; 
  while(*(ptr2)!=',') 
   ptr2--; 
  strncpy(numBuf,ptr2+1,ptr1-ptr2-1); 
  j=atoi(numBuf); 
  ptr2--; 
  ptr1=ptr2; 
  ptr2++; 
  while(*(ptr1)!=',') 
   ptr1--; 
  strncpy(numBuf,ptr1+1,ptr2-ptr1-1); 
  i=atoi(numBuf); 
  port=i*256+j; 
  dataSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_addr.s_addr=CurrentHost->HostIp; 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_port=htons(port); 
  ret=connect(dataSock,&hostaddr,sizeof hostaddr); 
  if(ret!=0) 
  { 
   {VirtualFree(data,r->size,MEM_DECOMMIT);return-1;} 
  } 
 } 
 else 
 { 
  r->sockdata=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
  hostaddr.sin_family=AF_INET; 
  hostaddr.sin_addr.s_addr=INADDR_ANY; 
  hostaddr.sin_port=0; 
  ret=bind(r->sockdata,&hostaddr,sizeof(hostaddr)); 
  dataSock=r->sockdata; 
  hListenThread=CreateThread(0,0,ListenProc,&(r->sockdata),0,0); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   return -1; 
  } 
  ip=sizeof(struct sockaddr); 
  ret=getsockname(r->sockdata,(struct sockaddr *)&hostaddr,&ip); 
  if(ret==SOCKET_ERROR) 
  { 
   free(data); 
   return -1; 
  } 
  ip=ntohs(hostaddr.sin_port)/256; 
  jp=ntohs(hostaddr.sin_port)%256; 
  ZeroMemory(command,64); 
  strcat(command,"PORT "); 
  ZeroMemory(param1,128); 
  ret=sizeof(struct sockaddr_in); 
  getsockname(r->cmdSock,&hostaddr,&ret); 
  strcpy(_data,inet_ntoa(hostaddr.sin_addr)); 
  ptr1=_data; 
  while(*(ptr1)!=0) 
  { 
   if(*(ptr1)=='.') 
   { 
    *(ptr1)=','; 
   } 
   ptr1++; 
  } 
  strcat(command,_data); 
  strcat(command,","); 
  strcat(command,itoa(ip,numBuf,10)); 
  strcat(command,","); 
  strcat(command,itoa(jp,numBuf,10)); 
  strcat(command,"\r\n\0\0"); 
  ret=post(r->cmdSock,command,strlen(command)); 
  if(ret!=1) 
  { 
   free(data); 
   return -1; 
  } 
  ZeroMemory(_data,512); 
  ret=receive(r->cmdSock,_data,512); 
  if(strncmp(_data,"200",3)!=0) 
  { 
   free(data); 
   return -1; 
  } 
 } 
 hFile=CreateFile(r->file,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
 GetLastError(); 
 if(hFile!=INVALID_HANDLE_VALUE) 
 { 
  ReadFile(hFile,data,r->size,&ret,0); 
  FlushFileBuffers(hFile); 
  CloseHandle(hFile); 
 } 
 else 
 { 
  return -1; 
 } 
 ZeroMemory(command,64); 
 strcat(command,"STOR "); 
 strcat(command,r->dest); 
 strcat(command,"\r\n\0\0"); 
 ret=post(r->cmdSock,command,strlen(command)); 
 ret=receive(r->cmdSock,_data,512); 
 if(strncmp(_data,"150 ",3)==0) 
// upLoad! 
 { 
  if(PasvOrPort==1) 
  { 
waiting: 
   if(dataSock==r->sockdata) 
   { 
    Sleep(20); 
    goto waiting; 
   } 
   dataSock=r->sockdata; 
  } 
  send(dataSock,data,r->size,0); 
  closesocket(dataSock); 
  ret=receive(r->cmdSock,_data,512); 
  if(strncmp(_data,"226",3)==0) 
   r->alreadydone=1; 
  else 
   r->alreadydone=-1; 
  return 1; 
 } 
 else 
 { 
  r->alreadydone=-1; 
  return 1; 
 } 
} 
 
int upLoad(char *file,char *dest) 
{ 
 HANDLE hFile; 
 SOCKET cmdSocket; 
 struct sockaddr_in hostaddr; 
 Host *host; 
 UPLOAD *r; 
 int ret; 
 unsigned short port; 
 char **ptr=NULL,*_file=NULL; 
 int *addr=NULL; 
 struct hostent *iphost=NULL; 
 char data[1024]={0}; 
 char command[1024]={0}; 
 char incomName[80]={0}; 
 host=CurrentHost; 
 iphost=gethostbyname(host->HostName); 
 r=(UPLOAD *)malloc(sizeof(UPLOAD)); 
 ZeroMemory(r,sizeof(UPLOAD)); 
 if(iphost==NULL) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 port=atoi(host->Hostport); 
 if(port==0 || port>65535)  
  port=21; 
  ptr=iphost->h_addr_list; 
 addr=(int *)(*(ptr)); 
 hostaddr.sin_family=AF_INET; 
 hostaddr.sin_port=(unsigned short)htons(port); 
 hostaddr.sin_addr.s_addr=*(addr); 
 cmdSocket=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); 
 ret=connect(cmdSocket,&hostaddr,sizeof hostaddr); 
  if(ret!=0) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 if(strncmp(data,"220",3)==0) 
 { 
  printf("\nConnect success,send UserName"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"USER "); 
 strcat(command,host->UserName); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(data,1024); 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"331",3)==0) 
 { 
  printf("\nConnect success,send PassWord"); 
 } 
 else 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ZeroMemory(command,1024); 
 strcat(command,"PASS "); 
 strcat(command,host->PassWord); 
 strcat(command,"\r\n\0"); 
 ret=post(cmdSocket,command,strlen(command)); 
 if(ret!=1) 
 { 
  printf("\nConnect error!\n"); 
  free(r);return-1; 
 } 
 ret=receive(cmdSocket,data,1024); 
 if(strncmp(data,"230",3)==0) 
 { 
  printf("\nLogin success,prepare to upload"); 
 } 
 else 
 { 
  printf("\nConnect error!upload aborted\n"); 
  free(r);return-1; 
 } 
 r->cmdSock=cmdSocket; 
 strcpy(r->dest,dest); 
 strcpy(r->file,file); 
 r->next=NULL; 
 hFile=CreateFile(file,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
 if(hFile==INVALID_HANDLE_VALUE) 
 { 
  printf("\ncannot open the file for upload!\n"); 
  closesocket(cmdSocket); 
  free(r); 
  return -1; 
 } 
 ret=GetFileSize(hFile,0); 
 CloseHandle(hFile); 
 r->size=ret; 
 r->alreadydone=0; 
 strcpy(r->hostSite,CurrentHost->HostName); 
 addtoUpLoadList(r); 
// start download 
 r->hThread=CreateThread(0,0,upLoadProcA,r,0,0); 
 return 1;  
} 
 
int DeleteDown(RESUME *r) 
{ 
 RESUME *p; 
 p=&ResumeFile; 
 while(p->next!=r && p) 
 { 
  p=p->next; 
 } 
 if(p->next==r) 
 { 
  p->next=r->next; 
  free(r); 
 } 
 return 1; 
} 
 
int DeleteHost(Host *h) 
{ 
 Host *p; 
 p=&HostList; 
 while(p && p->next!=h) 
 { 
  p=p->next; 
 } 
 if(p->next==h) 
 { 
  p->next=h->next; 
  free(h); 
 } 
 return 1; 
} 
 
int DetectCurrentHostHost() 
{ 
 char command[128]="PWD"; 
 char data[128]="\0"; 
 int ret; 
 strcat(command,"\r\n"); 
 ret=post(CurrentHost->HostSocketCmd,command,strlen(command)); 
 if(ret!=1) 
 { 
  return -1; 
 } 
 ret=receive(CurrentHost->HostSocketCmd,data,128); 
 if(ret!=1 || strncmp(data,"257",3)!=0) 
 { 
  return -1; 
 } 
 return 1; 
}