C#通过socket判断FTP服务器是否通畅并判断用户名密码是否正确

        /// <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;
            }
        }

小弟才疏学浅,如果不足之处请大家多多指导。

时间: 2024-08-05 08:23:42

C#通过socket判断FTP服务器是否通畅并判断用户名密码是否正确的相关文章

java实现读取ftp服务器上的csv文件

定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPClient; /** * FTP服务器操作*/ public interface iFtpServU { public FTPClient ftp(String ip, String user, String password); public List<String[]> csv(InputStr

Windows7本地搭建FTP服务器

在公司局域网内,可以通过访问ftp服务器实时进行文件共享,下面就介绍下,如何进行ftp服务器搭建. 步骤: 一.首先新建用户,用来访问ftp服务器的用户. a).右键单击我的电脑>管理>本地用户或组>用户.右键单击新建用户,输入用户名.设置密码,点击创建用户,此时,用户创建完毕,如下图所示: b).在硬盘中新建FTP服务器文件建,我这里建在f盘. c).对此服务器文件夹进行用户操作权限配置选择此服务器文件夹,鼠标右键单击选择属性>安全>编辑 在这里需要注意,由于,用户访问ft

Ubunton下搭建ftp服务器 实现虚拟用户、本地用户、匿名用户的登陆及权限

#在ubunton系统下安装和配置ftp可以说是比较简单的 本篇教程是为了解决一下问题 需要搭建ftp服务器实现三种用户的登陆及权限管理 其中 anon可以自由的到特定的目录里下载东东: stu则可以到特定的目录里上传东东; 而tearcher,则可以对特定的目录里上传.下载东东; admin则可以对stu.teacher的数据进行统一的管理. 另外,做为系统上已经有的本地用户则可以登录自己的home目录. 针对上面的需求,ftp需要开通对匿名用户.本地用户.及虚拟用户的支持.并且特别对虚拟用户

在自己的电脑上建立FTP服务器

<1> 添加新用户: “计算机”点击右键 “管理”得到: 点击“本地用户和组”,点击“用户”: 右键 “新用户”: 设定用户名与密码,这是以后连FTP服务器时用的登录用户名与密码. <2> 建立FTP服务器: 点击“控制面板”,点击“管理工具”,点击“Internet信息管理服务器”: 网站右键“添加FTP站点”: 物理路径就是你服务器存放文件的路径地址. IP地址一般分配好的,SSL一般自己测试用的就点“无”就可以了,这是安全设置,详细的可以自己去查一下什么是SSL. 身份验证,

根据URL,用户名,密码将文件上传到FTP文件服务器

1.根据URL,用户名,密码进行初始化 public class FtpTools { public static String hostname=null; public static Integer port=null; public static String username=null; public static String password=null; public static void init(String hostname1,Integer port1,String use

设置通过数字证书方式登录远程连接Linux服务器,禁止root账户远程密码方式远程连接服务器

//前几步是做过实验的,会的盆友可以直接跳过看后面部分 一.首先开启SSH数字证书方式登录的策略 修改配置文件/etc/ssh/sshd_config,下列三项为图中的样子,去掉注释启用配置,开启数字证书登录方式 RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 二.设置公私钥 过程比较简单,之前是做过实验写过博客的(https://www.cnblogs.com/hai-

使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端

参考资料1点击打开链接 参考资料2点击打开链接 code // Client.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <fstream> #include <WinSock2.h> #pragma comment(lib,"WS2_32.lib") using namespace std; #define PORT 21 //

socket实现两台FTP服务器指定目录下的文件转移(不依赖第三方jar包)

通过socket实现两台FTP服务器指定目录下的文件转移,其中包含了基础了ftp文件列表显示.上传和下载.这里仅供学习用,需掌握的点有socket.ftp命令.文件流读取转换等 完整代码如下: FtpFileTransfer.java package com.xxx.ftp.client; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io

socket&socket实现ftp的get方法、socketserver

首先了解socket工作原理,client-server模式 1.socket客户端: 2.socket类型 3.socket数据流 4.实验 (1)写一个client 服务端启动监听ip和端口 admindeMacBook-Air-62:~ admin$ nc -l 1234 客户端连接服务端,发数据,关闭socket pycharm中添加一个socket_client.py并之行: import socket HOST = '127.0.0.1' PORT = 1234 s = socket