/// <summary> /// PASV Command - RFC 959 - Section 4.1.2 /// <para>进入被动模式(请求服务器等待数据连接)</para> /// </summary> /// <returns></returns> private Response Passive() { _dataConnectionType = DataConnectionType.Passive; IPAddress localIp = ((IPEndPoint)ControlClient.Client.LocalEndPoint).Address; _passiveListener = PassiveListenerPool.GetListener(localIp); try { _passiveListener.Start(); } catch { _log.Error("No more ports available"); return(GetResponse(FtpResponses.UNABLE_TO_OPEN_DATA_CONNECTION)); } IPEndPoint passiveListenerEndpoint = (IPEndPoint)_passiveListener.LocalEndpoint; byte[] address = passiveListenerEndpoint.Address.GetAddressBytes(); ushort port = (ushort)passiveListenerEndpoint.Port; byte[] portArray = BitConverter.GetBytes(port); if (BitConverter.IsLittleEndian) { Array.Reverse(portArray); } return(GetResponse(FtpResponses.ENTERING_PASSIVE_MODE.SetData(address[0], address[1], address[2], address[3], portArray[0], portArray[1]))); }
/// <summary> /// EPSV Command - RFC 2428 /// <para>扩展被动模式(IPv6)</para> /// </summary> /// <returns></returns> private Response EPassive() { _dataConnectionType = DataConnectionType.Passive; IPAddress localIp = ((IPEndPoint)ControlClient.Client.LocalEndPoint).Address; _passiveListener = PassiveListenerPool.GetListener(localIp); try { _passiveListener.Start(); } catch { _log.Error("No more ports available"); return(GetResponse(FtpResponses.UNABLE_TO_OPEN_DATA_CONNECTION)); } IPEndPoint passiveListenerEndpoint = (IPEndPoint)_passiveListener.LocalEndpoint; return(GetResponse(FtpResponses.ENTERING_EXTENDED_PASSIVE_MODE.SetData(passiveListenerEndpoint.Port))); }