Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/**
 *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
}