📄 ftpclient.c
字号:
#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <strings.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include "ftp.h"#define SERVER_CTRL_PORT 21#define MAX_INFO 1024#define CMD_BUF_LEN 100int ftp_Control_sock;char server_Control_Info[MAX_INFO];char server_Data_Info[MAX_INFO];char user_cmd_info[CMD_BUF_LEN];char format_cmd_info[CMD_BUF_LEN];char file_name_info[CMD_BUF_LEN];void get_Server_Control_Info(char* cmd,int length){ int len; if(length!=0) { len = write(ftp_Control_sock, cmd, length); printf("%d bytes writen %s\n", len,cmd); } memset(server_Control_Info, 0, MAX_INFO); int bytes; if((bytes=recv(ftp_Control_sock,server_Control_Info,MAX_INFO,0))==-1) { printf("recv error\n"); exit(-1); } server_Control_Info[bytes]='\0'; printf("Server Message:\n%s\n",server_Control_Info);}struct sockaddr_in get_Server_Data_Port(){ struct sockaddr_in dataSock; char *sc; char ip[16]; char cport[4]; int port; int flag=0; int ipnum=0; int ipt=0; int portnum=0; int portt=0; for (sc =server_Control_Info; *sc != '\0'; ++sc) { if(flag==2) { if(*sc==','||*sc==')') { cport[portnum]='\0'; port=port*portt+atoi(cport); portt=256; portnum=0; } else if(*sc!=',') { cport[portnum]=*sc; portnum++; } } if(flag==1) { if(*sc!=',') { ip[ipnum]=*sc; } else { ipt++; if(ipt<4)ip[ipnum]='.'; else { flag=2; ip[ipnum]='\0'; } } ipnum++; } if(*sc=='(')flag=1; if(*sc==')')break; } bzero(&dataSock, sizeof(dataSock)); dataSock.sin_family = AF_INET; dataSock.sin_port = htons(port); if(inet_pton(AF_INET,ip, &dataSock.sin_addr)<=0) { printf("IP address invalid!\n"); exit(-1); } return dataSock;}void get_Server_Data_Info(char* cmd,int length){ char pasv_cmd[7]="pasv\r\n"; get_Server_Control_Info(pasv_cmd,strlen(pasv_cmd)); struct sockaddr_in data_Temp_addr=get_Server_Data_Port(); int ftp_data_sock; if ((ftp_data_sock=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Create Error:%s\a\n",strerror(errno)); exit(1);
} if(connect(ftp_data_sock, (struct sockaddr*)(&data_Temp_addr), sizeof(struct sockaddr_in)) < 0) { printf("connection failed!\n"); exit(-1); } if (strncmp("dir", cmd, 3) == 0) { char list_cmd[7]="list\r\n"; get_Server_Control_Info(list_cmd,strlen(list_cmd)); int cmd_sock=fileno(stdout); int n; memset(server_Data_Info, 0, MAX_INFO); while ((n = read(ftp_data_sock, server_Data_Info, MAX_INFO)) > 0) { if (write(cmd_sock, server_Data_Info, n) != n) { printf("read from server error in get_server_data\n"); return; } } close(ftp_data_sock); get_Server_Control_Info(list_cmd,0); } ///////////////////////////////////////// if (strncmp("retr", cmd, 4) == 0) { char type_cmd[9]="TYPE I\r\n"; get_Server_Control_Info(type_cmd,strlen(type_cmd)); get_Server_Control_Info(cmd,strlen(cmd)); FILE* fp = fopen(file_name_info, "ab"); if (fp == NULL) { printf("open file %s error\n",file_name_info); return; } int cmd_sock=fileno(fp); int n; memset(server_Data_Info, 0, MAX_INFO); while ((n = read(ftp_data_sock, server_Data_Info, MAX_INFO)) > 0) { if (write(cmd_sock, server_Data_Info, n) != n) { printf("read from server error in get_server_data\n"); return; } } fclose(fp); close(ftp_data_sock); get_Server_Control_Info(cmd,0); char transter[]="226 "; while(strstr(server_Control_Info,transter)==NULL) get_Server_Control_Info(cmd,0); } if (strncmp("stor", cmd, 4) == 0) { char type_cmd[9]="TYPE I\r\n"; get_Server_Control_Info(type_cmd,strlen(type_cmd)); FILE* fp = fopen(file_name_info, "rb"); if (fp == NULL) { printf("open file %s error\r\n",file_name_info); close(ftp_data_sock); return; } get_Server_Control_Info(cmd,strlen(cmd)); int cmd_sock=fileno(fp); int n; memset(server_Data_Info, 0, MAX_INFO); while ((n = read(cmd_sock, server_Data_Info, MAX_INFO)) > 0) { if (write(ftp_data_sock, server_Data_Info, n) != n) { printf("read from server error in get_server_data\n"); return; } } fclose(fp); close(ftp_data_sock); get_Server_Control_Info(cmd,0); char transter[]="226 "; while(strstr(server_Control_Info,transter)==NULL) get_Server_Control_Info(cmd,0); } // close(ftp_data_sock);}int main(int argc,char *argv[]){ struct sockaddr_in servaddr,localaddr; /*************************************************************//* 建立tcp连接 *//*************************************************************/ if(argc != 4) { printf("Useage: %s <IP address> user password\n",argv[0]); exit(-1); } if ((ftp_Control_sock=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Create Error:%s\a\n",strerror(errno)); exit(1);
} bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_CTRL_PORT); if(inet_pton(AF_INET,argv[1], &servaddr.sin_addr)<=0) { printf("IP address invalid!\n"); exit(-1); } if(connect(ftp_Control_sock, (struct sockaddr*)(&servaddr), sizeof(struct sockaddr_in)) < 0) { printf("Connection failed!\n"); exit(-1); } printf("Connected to host %s successfully\n", argv[1]); int bytes;/*************************************************************//* 接收ftp的welcome message *//*************************************************************/ if((bytes=recv(ftp_Control_sock,server_Control_Info,MAX_INFO,0))==-1) { printf("recv error\n"); exit(-1); } server_Control_Info[bytes]='\0'; printf("Server Message:%s\n",server_Control_Info); /*************************************************************//* 登录 *//*************************************************************/ //int lolen; char loginbuf[CMD_BUF_LEN]; snprintf(loginbuf, CMD_BUF_LEN, "USER %s\r\n", argv[2]); get_Server_Control_Info(loginbuf,strlen(loginbuf)); snprintf(loginbuf, CMD_BUF_LEN, "PASS %s\r\n", argv[3]); get_Server_Control_Info(loginbuf,strlen(loginbuf)); while(1) {/*************************************************************//* 接收命令输入 *//*************************************************************/ printf("ftp>"); memset(user_cmd_info, 0, CMD_BUF_LEN); if (fgets(user_cmd_info, CMD_BUF_LEN, stdin) == NULL) { printf("user input error\n"); return -1; } if (strncmp("pwd", user_cmd_info, 3) == 0) { char pwd_cmd[6]="pwd\r\n"; get_Server_Control_Info(pwd_cmd,strlen(pwd_cmd)); } if (strncmp("quit", user_cmd_info, 4) == 0) { char quit_cmd[7]="quit\r\n"; get_Server_Control_Info(quit_cmd,strlen(quit_cmd)); exit(-1); } if (strncmp("?", user_cmd_info, 1) == 0) { int i=0; for(i=0;i<COMMAND_NUM;i++) { printf("%s\n",clientCommand[i]); } } if(strncmp("dir",user_cmd_info,3) == 0) { char dir_cmd[6]="dir\r\n"; get_Server_Data_Info(dir_cmd,strlen(dir_cmd)); } if(strncmp("cd",user_cmd_info,2) == 0) { int ti=0; int length=strlen(user_cmd_info); format_cmd_info[0]='c'; format_cmd_info[1]='w'; format_cmd_info[2]='d'; format_cmd_info[3]=' '; for(ti=3;ti<length;ti++) format_cmd_info[ti+1]=user_cmd_info[ti]; format_cmd_info[ti]='\r'; format_cmd_info[ti+1]='\n'; format_cmd_info[ti+2]='\0'; get_Server_Control_Info(format_cmd_info,length+3); } if(strncmp("get",user_cmd_info,3) == 0) { int ti=0; int length=strlen(user_cmd_info); format_cmd_info[0]='r'; format_cmd_info[1]='e'; format_cmd_info[2]='t'; format_cmd_info[3]='r'; format_cmd_info[4]=' '; for(ti=4;ti<length;ti++) { format_cmd_info[ti+1]=user_cmd_info[ti]; file_name_info[ti-4]=user_cmd_info[ti]; } file_name_info[ti-5]='\0'; format_cmd_info[ti]='\r'; format_cmd_info[ti+1]='\n'; format_cmd_info[ti+2]='\0'; get_Server_Data_Info(format_cmd_info,length+3); } if(strncmp("put",user_cmd_info,3) == 0) { int ti=0; int length=strlen(user_cmd_info); format_cmd_info[0]='s'; format_cmd_info[1]='t'; format_cmd_info[2]='o'; format_cmd_info[3]='r'; format_cmd_info[4]=' '; for(ti=4;ti<length;ti++) { format_cmd_info[ti+1]=user_cmd_info[ti]; file_name_info[ti-4]=user_cmd_info[ti]; } file_name_info[ti-5]='\0'; format_cmd_info[ti]='\r'; format_cmd_info[ti+1]='\n'; format_cmd_info[ti+2]='\0'; get_Server_Data_Info(format_cmd_info,length+3); } } close(ftp_Control_sock); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -