本文共 7213 字,大约阅读时间需要 24 分钟。
#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; }转载地址:http://xzzji.baihongyu.com/