標籤:出錯 return message quit substr 失敗 解析 cat res
/// <summary> /// 通過socket判斷ftp是否通暢 /// </summary> /// <returns></returns> public static bool CheckFtp(string ip, string ftpuser, string ftppas,out string errmsg, int port = 21) { #region 輸入資料檢查 if (ftpuser.Trim().Length==0) { errmsg = "FTP使用者名稱不可為空,請檢查設定!"; return false; } if(ftppas.Trim().Length == 0) { errmsg = "FTP密碼不可為空,請檢查設定!"; return false; } IPAddress address; try { address = IPAddress.Parse(ip); } catch { errmsg =string.Format("FTP伺服器IP:{0}解析失敗,請檢查是否設定正確!",ip); return false; } #endregion bool ret = false; byte[] result = new byte[1024]; int pingStatus = 0, userStatus = 0, pasStatus = 0, exitStatus = 0; //串連返回,使用者名稱返回,密碼返回,退出返回 try { int receiveLength; Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.SendTimeout = 2000; socket.ReceiveTimeout = 2000;//逾時設定成2000毫秒 try { socket.Connect(new IPEndPoint(address, port)); //以21連接埠進行串連 pingStatus = 200; } catch { pingStatus = -1; } if(pingStatus==200) //狀態代碼200 - TCP串連成功 { receiveLength = socket.Receive(result); pingStatus = getFtpReturnCode(result, receiveLength); //串連狀態 if(pingStatus==220)//狀態代碼220 - FTP返回歡迎語 { socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "USER " + ftpuser, Environment.NewLine))); receiveLength = socket.Receive(result); userStatus = getFtpReturnCode(result, receiveLength); if(userStatus==331)//狀態代碼331 - 要求輸入密碼 { socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "PASS " + ftppas, Environment.NewLine))); receiveLength = socket.Receive(result); pasStatus = getFtpReturnCode(result, receiveLength); if(pasStatus== 230)//狀態代碼230 - 登入網際網路 { errmsg = string.Format("FTP:{0}@{1}登陸成功", ip, port); ret = true; socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "QUIT", Environment.NewLine))); //登出FTP receiveLength = socket.Receive(result); exitStatus = getFtpReturnCode(result, receiveLength); } else { // 狀態代碼230的錯誤 errmsg = string.Format("FTP:{0}@{1}登陸失敗,使用者名稱或密碼錯誤({2})", ip, port, pasStatus); } } else {// 狀態代碼331的錯誤 errmsg = string.Format("使用使用者名稱:‘{0}‘登陸FTP:{1}@{2}時發生錯誤({3}),請檢查FTP是否正常配置!", ftpuser, ip, port, userStatus); } } else {// 狀態代碼220的錯誤 errmsg = string.Format("FTP:{0}@{1}返回狀態錯誤({2}),請檢查FTP服務是否正常運行!", ip, port, pingStatus); } } else {// 狀態代碼200的錯誤 errmsg = string.Format("無法串連FTP伺服器:{0}@{1},請檢查FTP服務是否啟動!", ip, port); } socket.Close(); //關閉socket socket = null; } catch(Exception ex) { //串連出錯 errmsg = string.Format("FTP:{0}@{1}串連出錯:",ip,port) + ex.Message; ret = false; } return ret; } /// <summary> /// 傳遞FTP返回的byte數組和長度,返回狀態代碼(int) /// </summary> /// <param name="retByte"></param> /// <param name="retLen"></param> /// <returns></returns> private static int getFtpReturnCode(byte[] retByte,int retLen) { try { string str = Encoding.ASCII.GetString(retByte, 0, retLen).Trim(); return int.Parse(str.Substring(0, 3)); } catch { return -1; } }
小弟才疏學淺,如果不足之處請大家多多指導。
C#通過socket判斷FTP伺服器是否通暢並判斷使用者名稱密碼是否正確