#include<netdb.h>
#include<errno.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<unistd.h>
#include<termios.h>
#include <stdio.h>
#include<strings.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int fileSize;
int fileFd;
char *pbuffer;
int sendTotal;
int sendedLen;
int sendEach;
struct sockaddr_in ftp_server,ftp_data;
int sock_control;
int sock_data;
char *message="hello,this is a ftp client RFC959 test";
struct timeval outtime;
int ret;
char rcv_buff[1024];
int reply_code;
int main()
{
bzero(&ftp_server,sizeof(struct sockaddr_in));
ftp_server.sin_family=AF_INET;
ftp_server.sin_port=htons(21);
ftp_server.sin_addr.s_addr=inet_addr("127.0.0.1");
#if 1
//connec to ftp server.
sock_control=socket(AF_INET,SOCK_STREAM,0);
if(sock_control<0)
{
printf("create socket failed!\n");
return -1;
}
outtime.tv_sec=1;
outtime.tv_usec=0;
ret=setsockopt(sock_control,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
if(ret!=0)
{
printf("setsockopt failed!\n");
return -1;
}
if(connect(sock_control,(struct sockaddr *)&ftp_server,sizeof(struct sockaddr_in))<0)
{
return -1;
}
#endif
//read server's reply.(welcome message).
#if 1
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
else
{
printf("read welcome message failed\n");
return -1;
}
#endif
#if 1
//ftp user login.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"USER shell.albert\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//PASS.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"PASS smartbean\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
#if 1
//enter PASV(passive) mode.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"PASV\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//parse out the port number.P1*256+P2.
int nPasvPort;
char *sPasvPort=0;
sPasvPort=strrchr(rcv_buff,',');
if(sPasvPort==NULL)
{
printf("get pasv port1 error!\n");
return;
}
nPasvPort=atoi(sPasvPort+1);
*sPasvPort='\0';
sPasvPort=strrchr(rcv_buff,',');
if(sPasvPort==NULL)
{
printf("get pasv port2 error!\n");
return;
}
nPasvPort+=atoi(sPasvPort+1)*256;
printf("pasv port=%d\n",nPasvPort);
printf("send type command\n");
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"TYPE I\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
printf("type end\n");
#if 1
//use new port to connect server to get the data connection.
bzero(&ftp_data,sizeof(struct sockaddr_in));
ftp_data.sin_family=AF_INET;
ftp_data.sin_addr.s_addr=inet_addr("127.0.0.1");
ftp_data.sin_port=htons(nPasvPort);
sock_data=socket(AF_INET,SOCK_STREAM,0);
if(sock_data<0)
{
printf("create socket failed!\n");
return -1;
}
outtime.tv_sec=1;
outtime.tv_usec=0;
ret=setsockopt(sock_data,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
if(ret!=0)
{
printf("setsockopt failed!\n");
return -1;
}
if(connect(sock_data,(struct sockaddr *)&ftp_data,sizeof(struct sockaddr_in))<0)
{
return -1;
}
printf("create data connection sucess!\n");
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
//upload file.
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"STOR /home/shell.albert/upload.pdf\r\n");
printf("cmd:%s\n",rcv_buff);
ret=write(sock_control,rcv_buff,strlen(rcv_buff));
printf("write %d bytes\n",ret);
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
printf("read from STOR:%d,%d\n",ret,errno);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//write data to data socket.
fileFd=open("/home/shell.albert/temporary/client/a.pdf",O_RDONLY);
if(fileFd<0)
{
printf("open source file failed!\n");
return -1;
}
fileSize=lseek(fileFd,0,SEEK_END);
if(fileSize<0)
{
printf("wrong file length!\n");
return -1;
}
printf("fileSize=%d\n",fileSize);
pbuffer=(char*)malloc(fileSize);
if(pbuffer==NULL)
{
printf("malloc() failed!\n");
return -1;
}
lseek(fileFd,0,SEEK_SET);
if(read(fileFd,pbuffer,fileSize)!=fileSize)
{
printf("read error!\n");
return -1;
}
sendTotal=fileSize;
sendedLen=0;
while(sendTotal>0)
{
sendEach=write(sock_data,pbuffer+sendedLen,sendTotal-sendedLen);
if(sendEach<0)
{
printf("send error!\n");
return -1;
}
sendTotal-=sendEach;
sendedLen+=sendEach;
}
printf("send finish!\n");
close(fileFd);
free(pbuffer);
//send finish,close socket.
close(sock_data);
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
//send QUIT command.
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"QUIT\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
close(sock_control);
return 0;
}
#include<errno.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<unistd.h>
#include<termios.h>
#include <stdio.h>
#include<strings.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int fileSize;
int fileFd;
char *pbuffer;
int sendTotal;
int sendedLen;
int sendEach;
struct sockaddr_in ftp_server,ftp_data;
int sock_control;
int sock_data;
char *message="hello,this is a ftp client RFC959 test";
struct timeval outtime;
int ret;
char rcv_buff[1024];
int reply_code;
int main()
{
bzero(&ftp_server,sizeof(struct sockaddr_in));
ftp_server.sin_family=AF_INET;
ftp_server.sin_port=htons(21);
ftp_server.sin_addr.s_addr=inet_addr("127.0.0.1");
#if 1
//connec to ftp server.
sock_control=socket(AF_INET,SOCK_STREAM,0);
if(sock_control<0)
{
printf("create socket failed!\n");
return -1;
}
outtime.tv_sec=1;
outtime.tv_usec=0;
ret=setsockopt(sock_control,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
if(ret!=0)
{
printf("setsockopt failed!\n");
return -1;
}
if(connect(sock_control,(struct sockaddr *)&ftp_server,sizeof(struct sockaddr_in))<0)
{
return -1;
}
#endif
//read server's reply.(welcome message).
#if 1
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
else
{
printf("read welcome message failed\n");
return -1;
}
#endif
#if 1
//ftp user login.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"USER shell.albert\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//PASS.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"PASS smartbean\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
#if 1
//enter PASV(passive) mode.
bzero(rcv_buff,sizeof(rcv_buff));
strcpy(rcv_buff,"PASV\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//parse out the port number.P1*256+P2.
int nPasvPort;
char *sPasvPort=0;
sPasvPort=strrchr(rcv_buff,',');
if(sPasvPort==NULL)
{
printf("get pasv port1 error!\n");
return;
}
nPasvPort=atoi(sPasvPort+1);
*sPasvPort='\0';
sPasvPort=strrchr(rcv_buff,',');
if(sPasvPort==NULL)
{
printf("get pasv port2 error!\n");
return;
}
nPasvPort+=atoi(sPasvPort+1)*256;
printf("pasv port=%d\n",nPasvPort);
printf("send type command\n");
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"TYPE I\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
printf("type end\n");
#if 1
//use new port to connect server to get the data connection.
bzero(&ftp_data,sizeof(struct sockaddr_in));
ftp_data.sin_family=AF_INET;
ftp_data.sin_addr.s_addr=inet_addr("127.0.0.1");
ftp_data.sin_port=htons(nPasvPort);
sock_data=socket(AF_INET,SOCK_STREAM,0);
if(sock_data<0)
{
printf("create socket failed!\n");
return -1;
}
outtime.tv_sec=1;
outtime.tv_usec=0;
ret=setsockopt(sock_data,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));
if(ret!=0)
{
printf("setsockopt failed!\n");
return -1;
}
if(connect(sock_data,(struct sockaddr *)&ftp_data,sizeof(struct sockaddr_in))<0)
{
return -1;
}
printf("create data connection sucess!\n");
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
//upload file.
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"STOR /home/shell.albert/upload.pdf\r\n");
printf("cmd:%s\n",rcv_buff);
ret=write(sock_control,rcv_buff,strlen(rcv_buff));
printf("write %d bytes\n",ret);
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
printf("read from STOR:%d,%d\n",ret,errno);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
//write data to data socket.
fileFd=open("/home/shell.albert/temporary/client/a.pdf",O_RDONLY);
if(fileFd<0)
{
printf("open source file failed!\n");
return -1;
}
fileSize=lseek(fileFd,0,SEEK_END);
if(fileSize<0)
{
printf("wrong file length!\n");
return -1;
}
printf("fileSize=%d\n",fileSize);
pbuffer=(char*)malloc(fileSize);
if(pbuffer==NULL)
{
printf("malloc() failed!\n");
return -1;
}
lseek(fileFd,0,SEEK_SET);
if(read(fileFd,pbuffer,fileSize)!=fileSize)
{
printf("read error!\n");
return -1;
}
sendTotal=fileSize;
sendedLen=0;
while(sendTotal>0)
{
sendEach=write(sock_data,pbuffer+sendedLen,sendTotal-sendedLen);
if(sendEach<0)
{
printf("send error!\n");
return -1;
}
sendTotal-=sendEach;
sendedLen+=sendEach;
}
printf("send finish!\n");
close(fileFd);
free(pbuffer);
//send finish,close socket.
close(sock_data);
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
#endif
//send QUIT command.
memset(rcv_buff,0,sizeof(rcv_buff));
strcpy(rcv_buff,"QUIT\r\n");
printf("cmd:%s\n",rcv_buff);
write(sock_control,rcv_buff,strlen(rcv_buff));
memset(rcv_buff,0,sizeof(rcv_buff));
ret=read(sock_control,rcv_buff,1024);
if(ret>0)
{
printf("read:@@ %s @@\n",rcv_buff);
reply_code=atoi(rcv_buff);
//continue to read the rest welcome message.
while(1)
{
rcv_buff[ret]='\0';
ret=read(sock_control,rcv_buff,1024);
if (ret<=0)
{
break;
}
printf("read:@@ %s @@\n",rcv_buff);
}
}
close(sock_control);
return 0;
}