本文共 3472 字,大约阅读时间需要 11 分钟。
#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> struct sockaddr_in ftp_server; int sock_control; int sock_data; 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=0; outtime.tv_usec=300000; 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 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"); write(sock_control,rcv_buff,strlen(rcv_buff)); while(1) { bzero(rcv_buff,sizeof(rcv_buff)); ret=read(sock_control,rcv_buff,1024); if(ret>0) { printf("read:@@ %s @@\n",rcv_buff); }else{ break; } } //PASS. bzero(rcv_buff,sizeof(rcv_buff)); strcpy(rcv_buff,"PASS smartbean\r\n"); write(sock_control,rcv_buff,strlen(rcv_buff)); while(1) { bzero(rcv_buff,sizeof(rcv_buff)); ret=read(sock_control,rcv_buff,1024); if(ret>0) { printf("read:@@ %s @@\n",rcv_buff); }else{ break; } } #endif #if 1 //enter PASV(passive) mode. bzero(rcv_buff,sizeof(rcv_buff)); strcpy(rcv_buff,"PASV\r\n"); write(sock_control,rcv_buff,strlen(rcv_buff)); bzero(rcv_buff,sizeof(rcv_buff)); while(1) { ret=read(sock_control,rcv_buff,1024); if(ret>0) { printf("read:@@ %s @@\n",rcv_buff); }else{ break; } } //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); //use new port to connect server to get the data connection. ftp_server.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=0; outtime.tv_usec=300000; 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_server,sizeof(struct sockaddr_in))<0) { return -1; } printf("create data connection sucess!\n"); #endif #if 1 //use PI(control channel) to send PWD command //PWD's result was returned by PI. bzero(rcv_buff,sizeof(rcv_buff)); strcpy(rcv_buff,"PWD\r\n"); write(sock_control,rcv_buff,strlen(rcv_buff)); bzero(rcv_buff,sizeof(rcv_buff)); while(1) { ret=read(sock_control,rcv_buff,1024); if(ret>0) { printf("read:@@ %s @@\n",rcv_buff); }else{ break; } } #endif return 0; }