int get_transfer_fd(session_t* sess) { //check have received port or pasv command before if(!port_active(sess) && !pasv_active(sess)) { ftp_reply(sess, FTP_BADSENDCONN, "Use PORT or PASV first."); return 0; } int ret = 1; if(port_active(sess)) { if(get_port_fd(sess) == 0) ret = 0; } if(pasv_active(sess)) { if(get_pasv_fd(sess) == 0) ret = 0; } if(sess->port_addr) { free(sess->port_addr); sess->port_addr = NULL; } if(ret) start_data_alarm(); return ret; }
/** *get_transfer_fd - 创建数据连接,主动用connect,被动用accept *@sess:会话结构体 *成功返回0,失败返回1 */ int ftpproto::get_transfer_fd(session_t* sess) { //检测是否收到PORT或者PASV命令 //激活过是1 if (!port_active(sess) && !pasv_active(sess))//没有被激活过 {//两个都没有被激活过,要给个应答,若直接返回会使客户端阻塞 ftp_reply(sess,FTP_BADSENDCONN,"Use PORT or PASV first."); return 1;//失败 } int ret = 0; if (port_active(sess))//主动模式,服务器创建数据套接字(bind 20端口) { //调用connect连接客户端IP与端口,建立数据连接 if (get_port_fd(sess))//获取主动模式的套接字 {//失败 ret = 1; } } if (pasv_active(sess))//被动模式,使用accept { if (get_pasv_fd(sess))//获取被动模式的套接字 {//失败 ret = 1; } } if (sess->port_addr) {//之前调用过do_port了,数据连接用完就free free(sess->port_addr); sess->port_addr = NULL; } // if (ret) // { // //成功创建数据通道后就开启闹钟信号 // start_data_alarm();//重新安装SIGALRM信号,并启动闹钟 // } return ret;//成功是0,失败是1 }