/*============================================================================
Name : FtpClient.cbp
Author : Haier
Version : 1.01
Copyright : Copyright (c) 2014
Description : Ftp Client in C, Ansi-style, Compile by Gcc,in Linux
============================================================================*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define TRUE (1)
#define BUFFER (1024)
char UserCmd[10],CmdArg[20];
void pwd(int Sock,int SockMsg);
void dir(int Sock,int SockMsg);
void cd(int Sock,int SockMsg,char *DirName);
void cdback(int Sock,int SockMsg);
void quit(int Sock,int SockMsg);
void help(int Sock,int SockMsg);
void get(int Sock,int SockMsg,char *FileName);
void put(int Sock,int SockMsg,char *FileName);
int main(int argc,char *argv[])
{
int Sock,SockMsg;
struct hostent *Host;
argv[1]="test02";
argv[2]="5500";
struct sockaddr_in Server,ServerMsg;
Sock =socket(AF_INET,SOCK_STREAM,0);
SockMsg=socket(AF_INET,SOCK_STREAM,0);
if(Sock<0 || SockMsg<0)
{
perror("Socket Failed !\n");
exit(1);
}
Host=gethostbyname(argv[1]);
if(Host==0)
{
fprintf(stderr,"%s:Unknown host !\n",argv[1]);
exit(1);
}
Server.sin_family=AF_INET;
Server.sin_port =htons(atoi(argv[2]));
memcpy((char*)&Server.sin_addr,(char*)Host->h_addr,Host->h_length);
ServerMsg.sin_family=AF_INET;
ServerMsg.sin_port =htons(atoi(argv[2])+1);
memcpy((char*)&ServerMsg.sin_addr,(char*)Host->h_addr,Host->h_length);
if(connect(Sock,(struct sockaddr *)&Server,sizeof(Server)))
{
perror("1:Connect Failed !\n");
exit(1);
}
if(connect(SockMsg,(struct sockaddr *)&ServerMsg,sizeof(ServerMsg)))
{
perror("2:Connect Failed !\n");
exit(1);
}
while(TRUE)
{
memset(UserCmd,0,sizeof(UserCmd));
memset(CmdArg,0,sizeof(CmdArg));
printf("ftp>");
scanf("%s",UserCmd);
if(strcmp(UserCmd,"quit")==0)
{
quit(Sock,SockMsg);
close(Sock);
close(SockMsg);
exit(0);
}
else if(strcmp(UserCmd,"?")==0)
{
help(Sock,SockMsg);
}
else if(strcmp(UserCmd,"pwd")==0)
{
pwd(Sock,SockMsg);
}
else if(strcmp(UserCmd,"dir")==0)
{
dir(Sock,SockMsg);
}
else if(strcmp(UserCmd,"cd")==0)
{
scanf("%s",CmdArg);
cd(Sock,SockMsg,CmdArg);
}
else if(strcmp(UserCmd,"cd..")==0)
{
cdback(Sock,SockMsg);
}
else if(strcmp(UserCmd,"get")==0)
{
scanf("%s",CmdArg);
get(Sock,SockMsg,CmdArg);
}
else if(strcmp(UserCmd,"put")==0)
{
scanf("%s",CmdArg);
put(Sock,SockMsg,CmdArg);
}
else
{
printf("Unknown Command !\n");
}
}
}
void pwd(int Sock,int SockMsg)
{
char DirName[30];
write(SockMsg,UserCmd,sizeof(UserCmd));
read(Sock,DirName,sizeof(DirName));
printf("%s",DirName);
}
void dir(int Sock,int SockMsg)
{
int i,FileCount;
char FileInfo[50];
write(SockMsg,UserCmd,sizeof(UserCmd));
read(Sock,&FileCount,sizeof(FileCount));
if(FileCount>0)
{
printf("FileCount: %d\n",FileCount);
for(i=0; i<FileCount; i++)
{
memset(FileInfo,0,sizeof(FileInfo));
read(Sock,FileInfo,sizeof(FileInfo));
printf("%s\n",FileInfo);
}
}
else if(FileCount==0)
{
printf("Empty !\n");
return ;
}
else
{
printf("Error in dir !\n");
return ;
}
}
void cd(int Sock,int SockMsg,char *DirName)
{
char CurrentDirPath[100];
write(SockMsg,UserCmd,sizeof(UserCmd));
write(SockMsg,CmdArg,sizeof(CmdArg));
read(Sock,CurrentDirPath,sizeof(CurrentDirPath));
printf("%s\n",CurrentDirPath);
}
void cdback(int Sock,int SockMsg)
{
write(SockMsg,UserCmd,sizeof(UserCmd));
}
void quit(int Sock,int SockMsg)
{
write(SockMsg,UserCmd,sizeof(UserCmd));
}
void help(int Sock,int SockMsg)
{
char helpBuf[200];
write(SockMsg,UserCmd,sizeof(UserCmd));
read(Sock,helpBuf,sizeof(helpBuf));
printf("%s\n",helpBuf);
}
void get(int Sock,int SockMsg,char *FileName)
{
char LocalFilePath[100];
int fd;
char Buffer[BUFFER];
long FileSize;
write(SockMsg,UserCmd,sizeof(UserCmd));
write(SockMsg,CmdArg,sizeof(CmdArg));
printf("%s,%s\n",UserCmd,CmdArg);
memset(LocalFilePath,0,sizeof(LocalFilePath));
getcwd(LocalFilePath,sizeof(LocalFilePath));
strcat(LocalFilePath,"/");
strcat(LocalFilePath,FileName);
fd=open(LocalFilePath,O_RDWR|O_CREAT,S_IREAD|S_IWRITE);
if(fd>0)
{
memset(Buffer,0,BUFFER);
read(Sock,&FileSize,sizeof(long));
while(FileSize>BUFFER)
{
read(Sock,Buffer,BUFFER);
write(fd,Buffer,BUFFER);
FileSize-=BUFFER;
}
read(Sock,Buffer,FileSize);
write(fd,Buffer,FileSize);
close(fd);
printf("Finished !\n");
}
else
{
printf("Open File Failed !\n");
}
}
void put(int Sock,int SockMsg,char *FileName)
{
char LocalFilePath[100];
int fd;
char Buffer[BUFFER];
struct stat FileStat;
long FileSize;
write(SockMsg,UserCmd,sizeof(UserCmd));
write(SockMsg,CmdArg,sizeof(CmdArg));
memset(LocalFilePath,0,sizeof(LocalFilePath));
getcwd(LocalFilePath,sizeof(LocalFilePath));
strcat(LocalFilePath,"/");
strcat(LocalFilePath,FileName);
fd=open(LocalFilePath,O_RDONLY,S_IREAD);
if(fd>0)
{
fstat(fd,&FileStat);
FileSize=FileStat.st_size;
write(Sock,&FileSize,sizeof(FileSize));
memset(Buffer,0,BUFFER);
while(FileSize>BUFFER)
{
read(fd,Buffer,BUFFER);
write(Sock,Buffer,BUFFER);
FileSize-=BUFFER;
}
read(fd,Buffer,FileSize);
write(Sock,Buffer,FileSize);
close(fd);
printf("Finished !\n");
}
else
{
printf("Create %s Failed !\n");
}
}