📄 rfc959.cpp
字号:
*code = '\0'; struct timeval tv; if(NULL==Connect_data->sockfd_read){ Remote_Filelist->hftp_AddStringToList("链接已经被关闭,请重新建立!"); return(-2);} fd_set fset; FD_ZERO(&fset); FD_SET(fileno(Connect_data->sockfd_read),&fset); tv.tv_sec=5; tv.tv_usec=0; if(select(fileno(Connect_data->sockfd_read)+1,&fset,NULL,NULL,&tv)<=0){ return (-2); } do{ fgets(response,sizeof(response),Connect_data->sockfd_read); if(!response) return -2; strcpy(tempres,response); response[strlen (response) - 3] = '\0'; if(isdigit((int)*response) && isdigit((int)*(response + 1)) && isdigit((int)*(response+2))){ strncpy(code, response, 3); code[3] = ' ';} else if(0==passwdtag && !isdigit((int)*response) && !isdigit((int)*(response + 1))){ //当前不是客户发出密码,且回复指令中不以数字 Remote_Filelist->hftp_AddStringToList("服务器被关闭,或有其他异常情况发生!"); rfc959_disconnect(); //开始,说明有异常. return -2;} if(1==passwdtag && 0!=strncmp(response,"230 ",4) && *response!='5'){ //登录时的欢迎信息. if(strlen(response)>=4){ if(NULL==login_dialog) login_dialog=new Chftp_login_dialog; login_dialog->hftp_AddStringToList(response);} } else if(0==strncmp(response,"257",3)){ //257回馈目的地指令中带有工作目录,将其取出. int i=0; while(*(response+5+i)!='\"') {*(Connect_data->directory+i)=*(response+5+i);i++;} *(Connect_data->directory+i)='\0'; gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(Remote_Filelist->hftp_GetCombo())->entry), Connect_data->directory); } if(strlen(response)>=4){ Remote_Filelist->hftp_AddStringToList(response); printf("%s\n",response); fflush(stdout); } }while(0!=strncmp(response,code,4)); strcpy(Connect_data->last_ftp_response,tempres); if(0==strncmp(response,"215",3)){ if(0==strncmp(response,"215 UNIX",8)){ Connect_data->data_type=HFTP_BINARY; rfc959_send_command("TYPE I\r\n");} else{ Connect_data->data_type=HFTP_ASCII; rfc959_send_command("TYPE A\r\n"); } if(0!=strncmp(Connect_data->last_ftp_response,"200 Type",8)) rfc959_read_response(); } return (*Connect_data->last_ftp_response); } catch(...){ return -2;}}gint CRFC959::write_to_socket(const gchar *command){ if(NULL==Connect_data->sockfd_write){ Remote_Filelist->hftp_AddStringToList("链接已经被关闭,请重新建立!"); return(-2);} fwrite(command, strlen(command),1,Connect_data->sockfd_write); fflush(Connect_data->sockfd_write); return(0);}gint CRFC959::rfc959_list_files(){ gchar command[50], parms[3]; gint ret,flags,i=0; if(NULL==Connect_data->sockfd_read){ Remote_Filelist->hftp_AddStringToList("链接已经被关闭,请重新建立!"); return(-2);} if((ret=rfc959_data_connection_new())<0) return (ret); //建立数据连接. strcpy(command,g_strconcat("LIST"," -aL","\r\n", NULL));//发送要求文件列表的命令. ret=rfc959_send_command(command); while(ret<0 && i++<4) ret=rfc959_read_response(); i=0; while(ret=='4' && i++<100) ret=rfc959_send_command(command); if(i>=100){ fclose(Connect_data->datafd); Connect_data->datafd=NULL; return -2; } if(0!=strncmp(Connect_data->last_ftp_response,"125",3) && 0!=strncmp(Connect_data->last_ftp_response,"150",3)) ret=rfc959_read_response(); if (Connect_data->transfer_type==hftp_transfer_active) ret=rfc959_accept_active_connection(); return (ret);}gint CRFC959::rfc959_data_connection_new(){ gchar *pos, *pos1, resp, *command; struct sockaddr_in data_addr; unsigned int temp[6]; unsigned char ad[6]; gint i, sock; socklen_t data_addr_len; data_addr_len=sizeof(data_addr); sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); memset (&data_addr, 0, sizeof (data_addr)); data_addr.sin_family=AF_INET; if (Connect_data->transfer_type==hftp_transfer_passive){ resp=rfc959_send_command("PASV\r\n"); if(0!=strncmp(Connect_data->last_ftp_response,"227",3)) resp=rfc959_read_response(); if(resp!='2'){ if (Connect_data->sockfd_read==NULL) return (-2); Connect_data->transfer_type=hftp_transfer_active; return (rfc959_data_connection_new());} pos = Connect_data->last_ftp_response + 4; while (!isdigit ((int) *pos) && *pos != '\0') pos++; if (*pos == '\0'){ rfc959_disconnect(); close (sock); return (-2);} if (sscanf (pos, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5]) != 6){ rfc959_disconnect(); close(sock); return(-2);} for (i=0;i<6;i++) ad[i]=(unsigned char)(temp[i]&0xff); memcpy(&data_addr.sin_addr, &ad[0], 4); memcpy(&data_addr.sin_port, &ad[4], 2); connect(sock,(struct sockaddr *)&data_addr,sizeof(data_addr)); } else{ getsockname (fileno(Connect_data->sockfd_read),(struct sockaddr *) &data_addr, &data_addr_len); data_addr.sin_port = 0; bind(sock,(struct sockaddr *)&data_addr,sizeof(data_addr)); getsockname(sock, (struct sockaddr *) &data_addr, &data_addr_len); listen(sock, 1); pos=(char *)&data_addr.sin_addr; pos1=(char *)&data_addr.sin_port; command=g_strdup_printf ("PORT %u,%u,%u,%u,%u,%u\r\n", pos[0] & 0xff, pos[1] & 0xff, pos[2] & 0xff, pos[3] & 0xff, pos1[0] & 0xff, pos1[1] & 0xff); resp =rfc959_send_command(command); if (resp != '2'){ rfc959_disconnect (); close(sock); return(-2);} } if(!(Connect_data->datafd=fdopen(sock, "rb+"))) return -2; return (0);}gint CRFC959::rfc959_accept_active_connection(){ struct sockaddr_in cli_addr; size_t cli_addr_len; gint infd; cli_addr_len=sizeof(cli_addr); if(NULL==Connect_data->datafd){ Remote_Filelist->hftp_AddStringToList("数据链接已经被关闭!"); return(-2);} infd=accept(fileno(Connect_data->datafd),(struct sockaddr *)&cli_addr, &cli_addr_len); fclose(Connect_data->datafd); Connect_data->datafd=fdopen (infd, "rb+"); return(0);} gint CRFC959::rfc959_get_file_size(const gchar *filename){ gchar *command; gint ret,i=0; command=g_strconcat ("SIZE ", filename, "\r\n", NULL); ret=rfc959_send_command(command); while(0!=strncmp(Connect_data->last_ftp_response,"213",3) && i++<3){ rfc959_read_response();} if(3==i) return 0; g_free(command); if (ret<0) return -2; if(*Connect_data->last_ftp_response != '2') return -2; return(strtol(Connect_data->last_ftp_response+4,NULL,10));}gint CRFC959::rfc959_mkdir(const char *directory){ char *command, ret; command=g_strconcat("MKD ", directory, "\r\n", NULL); ret=rfc959_send_command(command); if(0!=strncmp(Connect_data->last_ftp_response,"257",3)) rfc959_read_response(); g_free (command); return (ret == '2' ? 0 : -2);}gint CRFC959::rfc959_rename(const char *oldname,const char *newname){ char *command, ret; command=g_strconcat("RNFR ",oldname,"\r\n",NULL); ret=rfc959_send_command(command); g_free(command); if(ret!='3') return (-2); command=g_strconcat("RNTO ",newname,"\r\n",NULL); ret=rfc959_send_command(command); g_free(command); return(ret=='2' ? 0 : -2);}gint CRFC959::rfc959_rmdir(const char *directory){ char *command, ret; command=g_strconcat("RMD ",directory,"\r\n",NULL); ret=rfc959_send_command(command); g_free(command); return (ret == '2' ? 0 : -2);}gint CRFC959::rfc959_rmfile(const char *file){ char *command,ret; command=g_strconcat("DELE ",file,"\r\n",NULL); ret=rfc959_send_command(command); g_free(command); return (ret == '2' ? 0 : -2);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -