⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc959.cpp

📁 这个是LINUX下的HFTP测试版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    *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 + -