📄 client.c~
字号:
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<sys/fcntl.h>#include<stdlib.h>#include<string.h>#include<netdb.h>#include<errno.h>#include<arpa/inet.h>#include<sys/stat.h>#include<unistd.h> //to use read and write#include<termios.h>#include"echo.h"#define DEFAULT_PORT 21char user[64];char password[40];struct sockaddr_in ftp_server,local_host;struct hostent * server_hostent;int sock_control;int mode=1;//1--PASV 0--PORT//static struct termios stored_settings;void cmd_err_exit(char* error_message,int error_code){ printf("%s error code: %d\n",error_message,error_code); exit(error_code);}int fill_host_addr(char *host_ip_addr,struct sockaddr_in *host,int port){ if(port<=0||port>=(1<<16)) return 254; bzero(host,sizeof(struct sockaddr_in));//填充为0 host->sin_family=AF_INET; host->sin_port=htons(port); if(inet_addr(host_ip_addr)!=-1) host->sin_addr.s_addr=inet_addr(host_ip_addr); else { if((server_hostent=gethostbyname(host_ip_addr))!=0) { memcpy(&host->sin_addr,server_hostent->h_addr,sizeof(host->sin_addr)); } else return 253; } return 1;}int xconnect(struct sockaddr_in *s_addr,int type){ struct timeval outtime; int set; int s=socket(AF_INET,SOCK_STREAM,0); if(s<0) cmd_err_exit("Creat socket error",249); if(type==1) { outtime.tv_sec=0; outtime.tv_usec=300000; } else { outtime.tv_sec=5; outtime.tv_usec=0; } set=setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime)); if(set!=0) cmd_err_exit("set socket error",1); //connect to the server if(connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in))<0) { printf("Can't connet to the server:%s,port:%d\n",inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port)); exit(252); } else printf("Successfully connect to server:%s,port:%d\n",inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port)); return s;}//send command to server with sock_fdint ftp_send_cmd(const char* s1,const char* s2,int sock_fd){ char send_buf[256]; int send_err,len; if(s1) { strcpy(send_buf,s1); if(s2) { strcat(send_buf,s2); strcat(send_buf,"\r\n"); } else strcat(send_buf,"\r\n"); len=strlen(send_buf); send_err=send(sock_fd,send_buf,len,0); } //在socket上发送数据 //函数返回实际发送/接收的字节数,返回-1 表示出错,需要关闭此连接。 //函数缺省是阻塞函数,直到发送/接收完毕或出错 //注意:如果 send 函数返回值与参数 len 不相等,则剩余的未发送信息需要再次发送 if(send_err<0) printf("send error\n"); return send_err;}//get the server's reply message for sock_fdint ftp_get_reply(int sock_fd){ static int reply_code=0,count=0; char rcv_buff[512]; count=read(sock_fd,rcv_buff,510); if(count>0) reply_code=atoi(rcv_buff); else return 0; while(1) { if (count<=0) break; rcv_buff[count]='\0'; printf("%s",rcv_buff); count=read(sock_fd,rcv_buff,510); } return reply_code;}int get_port(){ char port_respond[512]; char *temp; int count,port_num; ftp_send_cmd("PASV",NULL,sock_control);//进入被动模式 count=read(sock_control,port_respond,510); if(count<=0) return 0; port_respond[count]='\0'; if(atoi(port_respond)==227)//确定进入被动模式 { temp=strrchr(port_respond,',');//在串中指定字符的最后一个出现位置以找出n6 port_num=atoi(temp+1); *temp='\0'; //截断n6来取n5; temp=strrchr(port_respond,','); port_num+=atoi(temp+1)*256; return port_num; } return 0;}int rand_local_port(){ int port; srand((unsigned)time(NULL)); port = rand() % 40000 + 1025; return port;}int xconnect_ftpdata(){ if(mode) { int data_port = get_port(); if(data_port != 0) ftp_server.sin_port=htons(data_port); return(xconnect(&ftp_server, 0)); } else { int client_port, get_sock, opt, set; char cmd_buf[32]; struct timeval outtime; struct sockaddr_in local; char local_ip[24]; char *ip_1, *ip_2, *ip_3, *ip_4; int addr_len = sizeof(struct sockaddr); client_port = rand_local_port(); get_sock = socket(AF_INET, SOCK_STREAM, 0); if(get_sock < 0) { cmd_err_exit("socket()", 1); } //set outtime for the data socket outtime.tv_sec = 7; outtime.tv_usec = 0; opt = SO_REUSEADDR; set = setsockopt(get_sock, SOL_SOCKET,SO_RCVTIMEO, \ &outtime,sizeof(outtime)); if(set !=0) { printf("set socket %s errno:%d\n",strerror(errno),errno); cmd_err_exit("set socket", 1); } set = setsockopt(get_sock, SOL_SOCKET,SO_REUSEADDR, \ &opt,sizeof(opt)); if(set !=0) { printf("set socket %s errno:%d\n",strerror(errno),errno); cmd_err_exit("set socket", 1); } bzero(&local_host,sizeof(local_host)); local_host.sin_family = AF_INET; local_host.sin_port = htons(client_port); local_host.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&local, sizeof(struct sockaddr)); while(1) { set = bind(get_sock, (struct sockaddr *)&local_host, \ sizeof(local_host)); if(set != 0 && errno == 11) { client_port = rand_local_port(); continue; } set = listen(get_sock, 1); if(set != 0 && errno == 11) { cmd_err_exit("listen()", 1); } //get local host's ip if(getsockname(sock_control,(struct sockaddr*)&local,\ (socklen_t *)&addr_len) < 0) return -1; snprintf(local_ip, sizeof(local_ip), inet_ntoa(local.sin_addr)); //change the format to the PORT command needs. local_ip[strlen(local_ip)]='\0'; ip_1 = local_ip; ip_2 = strchr(local_ip, '.'); *ip_2 = '\0'; ip_2++; ip_3 = strchr(ip_2, '.'); *ip_3 = '\0'; ip_3++; ip_4 = strchr(ip_3, '.'); *ip_4 = '\0'; ip_4++; snprintf(cmd_buf, sizeof(cmd_buf), "PORT %s,%s,%s,%s,%d,%d", \ ip_1, ip_2, ip_3, ip_4, client_port >> 8, client_port&0xff); ftp_send_cmd(cmd_buf, NULL, sock_control); if(ftp_get_reply(sock_control) != 200) { printf("Can not use PORT mode!Please use \"mode\" change to PASV mode.\n"); return -1; } else return get_sock; } }}void get_user(){ char buf[64]; printf("User:(Press Enter for anonymous):"); fgets(buf,sizeof(buf),stdin); if(buf[0]=='\n') strncpy(user,"anonymous",9); else strncpy(user,buf,strlen(buf)-1); printf("int get_user();user:%s\n",user);}void get_pass(){ char buf[40]; printf("Password:(Press Enter for anonymous):"); echo_off(); fgets(buf,sizeof(buf),stdin); if(buf[0]=='\n') strncpy(password,"anonymous",9); else strncpy(password,buf,strlen(buf)-1); echo_on(); printf("\n");}int ftp_login(){ int err; get_user(); if(ftp_send_cmd("USER ", user, sock_control) < 0) cmd_err_exit("Can not send message",1);; err = ftp_get_reply(sock_control); if(err == 331) { get_pass();// printf("Ppppppppppppppp%s\n",password); if(ftp_send_cmd("PASS ", password, sock_control) <= 0) cmd_err_exit("Can not send message",1); else err = ftp_get_reply(sock_control); if(err != 230) { printf("Password error!\n"); return 0; } return 1; } else { printf("User error!\n"); return 0; }}void ftp_bye(){ ftp_send_cmd("QUIT",NULL,sock_control); ftp_get_reply(sock_control); close(sock_control);}int ftp_usr_cmd(char * cmd){ if(strncmp(cmd,"ls",2)==0) return 1; if(strncmp(cmd,"pwd",3)==0) return 2; if(strncmp(cmd,"cd",2)==0) return 3; if(strncmp(cmd,"put",3)==0) return 4; if(strncmp(cmd,"get",3)==0) return 5; if(strncmp(cmd,"bye",3)==0) return 6; if(strncmp(cmd,"mode",4)==0) return 7; if(strncmp(cmd,"llist",5)==0) return 11; if(strncmp(cmd,"!",1)==0) return 8; if(strncmp(cmd,"lpwd",4)==0) return 12; if(strncmp(cmd,"lcd",3)==0) return 13; else return -1;}void ftp_list(){ int i=0,new_sock; int set=sizeof(local_host); int list_socket_data=xconnect_ftpdata(); if(list_socket_data<0) { ftp_get_reply(sock_control); puts("creat data sock error int ftp_list()"); return; } ftp_get_reply(sock_control); ftp_send_cmd("LIST",NULL,sock_control); ftp_get_reply(sock_control); if(mode==1)//被动模式 ftp_get_reply(list_socket_data); else { while(i<3) { new_sock=accept(list_socket_data,(struct sockaddr*)&local_host,(socklen_t *)&set); if(new_sock==-1) { printf("accept return:%s errno: %d\n",strerror(errno),errno); i++; continue; } else break; } if(new_sock==-1) { printf("Sorry you can't use PORT mode..Wrong\n"); return; } ftp_get_reply(new_sock); close(new_sock); } close(list_socket_data); ftp_get_reply(sock_control);}void ftp_pwd(){ ftp_send_cmd("PWD",NULL,sock_control); ftp_get_reply(sock_control);}void local_pwd(){ char temp[512]; int size=sizeof(temp); if(getcwd(temp,size)!=NULL) printf("%s\n",temp); else printf("Can't get local dir\n");}void local_cd(char *usr_cmd){ char *cmd =strchr(usr_cmd,' '); char dir[1024]; while(*cmd==' ') cmd++; if(cmd==NULL||*cmd=='\0') { printf("Command error\n"); } else { strncpy(dir,cmd,strlen(cmd));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -