private static ManualResetEvent timeoutObject;
private static Socket socket = null;
private static bool isConn = false;
/// <summary>
/// 通过socket判断ftp是否通畅(异步socket连接,同步发送接收数据)
/// </summary>
/// <returns></returns>
public static bool CheckFtp(string ip, string ftpuser, string ftppas,out string errmsg, int port = ,int timeout=)
{
#region 输入数据检查
if (ftpuser.Trim().Length==)
{
errmsg = "FTP用户名不能为空,请检查设置!";
return false;
}
if(ftppas.Trim().Length == )
{
errmsg = "FTP密码不能为空,请检查设置!";
return false;
}
IPAddress address;
try
{
address = IPAddress.Parse(ip);
}
catch
{
errmsg =string.Format("FTP服务器IP:{0}解析失败,请检查是否设置正确!",ip);
return false;
}
#endregion
isConn = false; bool ret = false;
byte[] result = new byte[];
int pingStatus = , userStatus = , pasStatus = , exitStatus = ; //连接返回,用户名返回,密码返回,退出返回
timeoutObject = new ManualResetEvent(false);
try
{
int receiveLength; socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.SendTimeout = timeout;
socket.ReceiveTimeout = timeout;//超时设置成2000毫秒 try
{
socket.BeginConnect(new IPEndPoint(address, port),new AsyncCallback(callBackMethod),socket); //开始异步连接请求
if(!timeoutObject.WaitOne(timeout,false))
{
socket.Close();
socket = null;
pingStatus = -;
}
if (isConn)
{
pingStatus = ;
}
else
{
pingStatus = -;
}
}
catch(Exception ex)
{
pingStatus = -;
} if(pingStatus==) //状态码200 - TCP连接成功
{
receiveLength = socket.Receive(result);
pingStatus = getFtpReturnCode(result, receiveLength); //连接状态
if(pingStatus==)//状态码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 - 要求输入密码
{
socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "PASS " + ftppas, Environment.NewLine)));
receiveLength = socket.Receive(result);
pasStatus = getFtpReturnCode(result, receiveLength);
if(pasStatus== )//状态码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);
}
}
catch(Exception ex)
{ //连接出错
errmsg = string.Format("FTP:{0}@{1}连接出错:",ip,port) + ex.Message;
Common.Logger(errmsg);
ret = false;
}
finally
{
if (socket != null)
{
socket.Close(); //关闭socket
socket = null;
}
}
return ret;
}
private static void callBackMethod(IAsyncResult asyncResult)
{
try
{
socket = asyncResult.AsyncState as Socket;
if(socket!=null)
{
socket.EndConnect(asyncResult);
isConn = true;
}
}
catch(Exception ex)
{
isConn = false;
}
finally
{
timeoutObject.Set();
}
}
/// <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, , retLen).Trim();
return int.Parse(str.Substring(, ));
}
catch
{
return -;
}
}

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

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

  1. python【项目】:基于socket的FTP服务器

    功能要求 1. 用户加密认证 2. 服务端采用 SocketServer实现,支持多客户端连接 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. ...

  2. 自学linux——18.FTP服务器的搭建

    Centos7下FTP服务器的搭建 一.FTP的作用 文件传输协议(File Transfer Protocol,FTP),是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20. ...

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

    定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPCl ...

  4. Android 上传文件到 FTP 服务器

    实现背景 近期接触到一个需求,就是将文件从Android系统上传到FTP服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的.但是基本的流程还是 ...

  5. 【FTP】在自己的电脑上建立FTP服务器

    <1> 添加新用户: “计算机”点击右键 “管理”得到: 点击“本地用户和组”,点击“用户”: 右键 “新用户”: 设定用户名与密码,这是以后连FTP服务器时用的登录用户名与密码. < ...

  6. centos FTP服务器的架设和配置

    yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [root@localhost ftp]# /sbin/service vsftpd restart Shutting d ...

  7. FTP服务器搭建与访问的相关问题

    近期想搭建在云服务器上搭建一个项目,每次远程登陆服务器实在比较繁琐,故而想到使用FTP上传下载方式来进行相应的操作:在网络上搭建FTP服务器的文档还是很丰富的,按照操作一步步来还算方便,楼主就不在这边 ...

  8. 转:【专题十二】实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  9. Windows下ftp服务器搭建及配置

    Win系统使用ser-u软件进行FTP服务器的搭建下载地址:https://www.serv-u.com/操作步骤如下:1. 点击执行程序进行按照SU-FTP-Server-Windows-v15.1 ...

随机推荐

  1. 使用命令将logcat中的内容输出到文本文件中

    网上搜集的方法,自己只是试了一下第一种,很好用,如果是/mylogcat.txt 直接保存在了d盘,我猜是直接保存在了sdk所在的盘的根目录下,希望对大家有帮助 使用如下命令可以将logcat中的内容 ...

  2. MyEclipse报错 Building workspace has encountered a problem Errors occurred during the build 的2种解决方法

    1: Building workspace has encountered a problem Errors occurred during the build 如果报错这个 那么有可能是jar包,报 ...

  3. jquery has deprecated synchronous XMLHTTPRequest

    Like many others, my website is using jquery. When I open the developer tools, I see a warning that ...

  4. docker入门实战笔记

    1.什么是docker: docker翻译为搬运工,在这里应该可以理解为搬运应用的工具,也就是云.先了解其运用场景之后更容易对他形成深刻理解. Docker提供了一种可移植的配置标准化机制,允许你一致 ...

  5. hihocoder网络流一·Ford-Fulkerson算法

    网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇 ...

  6. tabBar自定义

    有时系统的tabBar并不能满足我们的开发需求: 这时,我们需要自定义一个tabBar.直接上代码: // 在tabBarController中用KVC更换掉系统tabBar [self setVal ...

  7. Hadoop webHDFS设置和使用说明

    1.配置 namenode的hdfs-site.xml是必须将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS.LISTFILESTATUS ...

  8. 转:创建编码的WebTest

    创建编码的WebTest•通常,通过将现有的已记录Web测试转换为编码的Web测试来创建编码的Web测试.记录的Web测试以“Web测试编辑器”中可见的请求树开头.编码的Web测试是一个生成一系列We ...

  9. 改变nova-compute默认位置的方法

    # cat /etc/nova/nova.conf |grep -n state_path|grep -v '#'314:state_path=/var/lib/nova

  10. dom操作js

    1.getElementById()//ie8下不区分大小写 getElementsByName()//name属性相比于Id可以不唯一,且其只在表单.表单元素.img .iframe中有用,返回一个 ...