C#通過socket判斷FTP伺服器是否通暢並判斷使用者名稱密碼是否正確

來源:互聯網
上載者:User

標籤:出錯   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伺服器是否通暢並判斷使用者名稱密碼是否正確

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.