📄 ftp_client_source_unix.txt
字号:
bzero(&local, sizeof(struct sockaddr)); #define UC(b) (((int)b)&0xff) if( getsockname(ftpinfo->sockfd,(struct sockaddr*)&local,\ (socklen_t *)&addr_len) < 0 ) return -1; a = (char *)&(local.sin_addr); sprintf(local_ip, "%d.%d.%d.%d", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3])); if( getsockname(get_sock,(struct sockaddr*)&local,\ (socklen_t *)&addr_len) < 0 ) return -1; p = (char *)&(local.sin_port); local_port = UC(p[0]) * 256 + UC(p[1]); } if ( ftp_port(ftpinfo, local_ip, local_port) < 0 ) { close(get_sock); return -1; } } ftpinfo->reply = 0; ftpinfo->datasd = get_sock; return(0); } int ftp_login(FTPINFO *ftpinfo,const char *remhost,const char *user,const char *passwd,const char *account) { if ( ftp_prconnect(ftpinfo, remhost) < 0 ) return -1; if ( ftp_user(ftpinfo, user) < 0 ) return -1; if ( ftp_passwd(ftpinfo, passwd) < 0 ) return -1; if ( ftp_settype(ftpinfo, BINARY) < 0 ) return -1; if ( ftp_setmode(ftpinfo, PASV) < 0 ) return -1; return(0); } int ftp_setmode(FTPINFO *ftpinfo, const int mode) { ftpinfo->transf_mode = mode; } int ftp_settype(FTPINFO *ftpinfo, const int type) { ftpinfo->transf_type = type; if ( type == BINARY ) { if ( ftp_command(ftpinfo, "I", "TYPE") < 0 ) return -1; } else { if ( ftp_command(ftpinfo, "A", "TYPE") < 0 ) return -1; } if ( ftpinfo->reply != 200 ) return -1; return 0; } int ftp_recvdata(FTPINFO *ftpinfo, const char *localfile) { char rcv_buf[512]; int i, sock_data, new_sock, count; int set = sizeof(local_host); sprintf(ftpinfo->ftp_msg, ""); sock_data = ftpinfo->datasd; if( ftpinfo->transf_mode == PASV) { new_sock = sock_data; } else { i = 0; while(i < 3) { new_sock = accept(sock_data, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { i++; continue; } else break; } if(new_sock == -1) { _closesock(ftpinfo, 'C'); return( _retuerr(ftpinfo, 'D', "dataconn.accept error\r\n") ); } } if ( ftpinfo->filedes == NULL ) { if ( (ftpinfo->filedes = fopen(localfile, "wb")) == NULL ) { return( _retuerr(ftpinfo, 'D', "ftp_recvdata.open localfile error\r\n") ); } } while(1) { signal( SIGALRM, _alarmproc ); alarm( TIMEOUT ); toflag = 0; count = read(new_sock, rcv_buf, sizeof(rcv_buf)); alarm( 0 ); if ( toflag ) { return( _retuerr(ftpinfo, 'D', "ftp_recvdata.read error\r\n") ); } if(count <= 0) break; else { fwrite(rcv_buf, count, 1, ftpinfo->filedes); } } close(new_sock); _closesock(ftpinfo, 'D'); if ( _getreply(ftpinfo) < 0 ) return -1; if ( ftpinfo->reply != 226 ) return -1; return 0; } int ftp_senddata(FTPINFO *ftpinfo, const char *localfile) { char send_buf[512]; int i, sock_data, new_sock, count; int set = sizeof(local_host); sprintf(ftpinfo->ftp_msg, ""); sock_data = ftpinfo->datasd; if( ftpinfo->transf_mode == PASV) { new_sock = sock_data; } else { i = 0; while(i < 3) { new_sock = accept(sock_data, (struct sockaddr *)&local_host, \ (socklen_t *)&set); if(new_sock == -1) { i++; continue; } else break; } if(new_sock == -1) { _closesock(ftpinfo, 'C'); return( _retuerr(ftpinfo, 'D', "dataconn.accept error\r\n") ); } } if ( ftpinfo->filedes == NULL ) { if ( (ftpinfo->filedes = fopen(localfile, "rb")) == NULL ) { return( _retuerr(ftpinfo, 'D', "ftp_senddata.open localfile error\r\n") ); } } while(1) { count = fread(send_buf, sizeof(send_buf), 1, ftpinfo->filedes); if(count <= 0) break; else { signal( SIGALRM, _alarmproc ); alarm( TIMEOUT ); toflag = 0; write(new_sock, send_buf, sizeof(send_buf)); alarm( 0 ); if ( toflag ) { return( _retuerr(ftpinfo, 'D', "ftp_senddata.write error\r\n") ); } } } close(new_sock); _close(ftpinfo, 'D'); if ( _getreply(ftpinfo) < 0 ) return -1; if ( ftpinfo->reply != 226 ) return -1; return 0; } int ftp_dir(FTPINFO *ftpinfo, const char *rempath, const char *localpath) { if ( ftp_dataconn(ftpinfo) < 0 ) return -1; if ( ftp_command(ftpinfo, rempath, "LIST") < 0 ) { _retuerr(ftpinfo, 'D', NULL); } if ( ftpinfo->reply != 150 ) { return( _retuerr(ftpinfo, 'D', "ftp_command.LIST.reply <> 150\r\n") ); } if ( ftp_recvdata(ftpinfo, localpath) < 0 ) { _retuerr(ftpinfo, 'D', NULL); } return 0; } int ftp_nlist(FTPINFO *ftpinfo, const char *rempath, const char *localpath) { if ( ftp_dataconn(ftpinfo) < 0 ) return -1; if ( ftp_command(ftpinfo, rempath, "NLST") < 0 ) { _retuerr(ftpinfo, 'D', NULL); } if ( ftpinfo->reply == 550 ) { _closesock(ftpinfo, 'D'); return 0; } if ( ftpinfo->reply != 150 ) { return( _retuerr(ftpinfo, 'D', "ftp_command.LIST.reply <> 150\r\n") ); } if ( ftp_recvdata(ftpinfo, localpath) < 0 ) { _retuerr(ftpinfo, 'D', NULL); } return 0; } int ftp_getfile(FTPINFO *ftpinfo, const char *rempath, const char *localpath) { if ( ftp_dataconn(ftpinfo) < 0 ) return -1; if ( ftp_command(ftpinfo, rempath, "RETR") < 0 ) { _retuerr(ftpinfo, 'D', NULL); } if ( ftpinfo->reply != 150 ) { return( _retuerr(ftpinfo, 'D', "ftp_command.RETR.reply <> 150\r\n") ); } if ( ftp_recvdata(ftpinfo, localpath) < 0 ) { _retuerr(ftpinfo, 'D', NULL); } return 0; } int ftp_putfile(FTPINFO *ftpinfo, const char *rempath, const char *localpath) { if ( ftp_dataconn(ftpinfo) < 0 ) return -1; if ( ftp_command(ftpinfo, rempath, "STOR") < 0 ) { _retuerr(ftpinfo, 'D', NULL); } if ( ftpinfo->reply != 150 ) { return( _retuerr(ftpinfo, 'D', "ftp_command.STOR.reply <> 150\r\n") ); } if ( ftp_senddata(ftpinfo, localpath) < 0 ) { _retuerr(ftpinfo, 'D', NULL); } return 0; } int ftp_pwd(FTPINFO *ftpinfo) { if ( ftp_command(ftpinfo, NULL, "PWD") < 0 ) return -1; if ( ftpinfo->reply != 257 ) return -1; return 0; } int ftp_chdir(FTPINFO *ftpinfo, const char *rempath) { if ( ftp_command(ftpinfo, rempath, "CWD") < 0 ) return -1; if ( ftpinfo->reply != 250 ) return -1; return 0; } int ftp_del(FTPINFO *ftpinfo, const char *file) { if ( ftp_command(ftpinfo, file, "DELE") < 0 ) return -1; if ( ftpinfo->reply != 250 ) return -1; return 0; } int ftp_rena(FTPINFO *ftpinfo, const char *remsrcfile, const char *remdstfile) { if ( ftp_command(ftpinfo, remsrcfile, "RNFR") < 0 ) return -1; if ( ftpinfo->reply != 350 ) return -1; if ( ftp_command(ftpinfo, remdstfile, "RNTO") < 0 ) return -1; if ( ftpinfo->reply != 250 ) return -1; return 0; } int ftp_mkdir(FTPINFO *ftpinfo, const char *remdir) { if ( ftp_command(ftpinfo, remdir, "MKD") < 0 ) return -1; if ( ftpinfo->reply != 257 ) return(-1); return 0; } int ftp_bye(FTPINFO *ftpinfo) { if ( ftp_command(ftpinfo, NULL, "QUIT") < 0 ) return -1; if ( ftpinfo->reply != 221 ) return(-1); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -