/// <summary> /// Disconnect from the FTP server /// </summary> public void Disconnect() { if (m_cmdsocket != null) { FTPResponse response = SendCommand("QUIT"); m_cmdsocket.Close(); m_cmdsocket = null; } m_server = FTPServerType.Unknown; m_connected = false; }
private FTPResponse ReadResponse() { lock (m_cmdsocket) { FTPResponse response = new FTPResponse(); string responsetext = ""; int bytesrecvd = 0; // make sure any command sent has enough time to respond Thread.Sleep(750); for (; m_cmdsocket.Available > 0;) { bytesrecvd = m_cmdsocket.Receive(m_buffer, m_buffer.Length, 0); responsetext += Encoding.ASCII.GetString(m_buffer, 0, bytesrecvd); } if (responsetext.Length == 0) { response.ID = 0; response.Text = ""; return(response); } string[] message = responsetext.Replace("\r", "").Split('\n'); // we may have multiple responses, // particularly if retriving small amounts of data like directory listings // such as the command sent and transfer complete together // a response may also have multiple lines for (int m = 0; m < message.Length; m++) { try { // is the first line a response? If so, the first 3 characters // are the response ID number FTPResponse resp = new FTPResponse(); if (message[m].Length > 0) { try { resp.ID = int.Parse(message[m].Substring(0, 3)); } catch (Exception) { resp.ID = 0; } resp.Text = message[m].Substring(4); if (ResponseReceived != null) { foreach (FTPResponseHandler rh in ResponseReceived.GetInvocationList()) { try { rh(this, resp); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(string.Format("FTPResponseHandler threw {0}\r\n{1}", ex.GetType().Name, ex.Message)); // if any event handler fails, we ignore it } } } if (m == 0) { response = resp; } } } catch (Exception) { continue; } return(response); } // return the first response received return(response); } }