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. Oracle数据库设计小细节

    1. 如果使用PowerDesigner此类工具,注意将工具的导出的SQL语句中对于表的双引号去掉. 2. 建表和建字段的时候,不同单词之间使用下划线分隔,比如 REC_ID 3. Oracle中数值 ...

  2. VIJOS P1647 不差钱 SBT

    [描述] 同学们一起看了小品<不差钱>,LX神突发奇想,想刁难一下十八居士,他让十八居士模拟一下点菜的过程. [输入格式] 输入第一行为一个数price,表示价钱大于price的菜赵本山都 ...

  3. Ubuntu root 密码设置及远程登录

    1. 修改 root 密码 sudo passwd root 2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config : xxx@ubuntu14:~$ su ...

  4. 帝国cms文章内容tags关键词设置调用方法以及tags静态化

    说实话帝国cms用起来真的不好找一些功能,就比如说帝国cms的tag标签调用.需要注意的是帝国CMS文章的关键词和tags标签并非一码事,关键词标签是设置文章的关键词的,是用来给搜索引擎说明本篇文章的 ...

  5. Android开发实现HttpClient工具类

    在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想 ...

  6. SQL C# nvarchar类型转换为int类型 多表查询的问题,查询结果到新表,TXT数据读取到控件和数据库,生成在控件中的数据如何存到TXT文件中

    在数据库时候我设计了学生的分数为nvarchar(50),是为了在从TXT文件中读取数据插入到数据库表时候方便,但是在后期由于涉及到统计问题,比如求平均值等,需要int类型才可以,方法是:Conver ...

  7. 【floyd】 poj 2240

    #include <iostream> #include <map> #include <string> #include <memory.h> usi ...

  8. char*赋值在常量区,不可以修改

    char*赋值在常量区,不可以修改,要想修改,用数组. char* = "abc";*(pCh+1) = 'k';//编译正常,运行报错. char pCh[] = "a ...

  9. li里元素都浮动 li 在IE6 7 下方会产生4px间隙问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. 清除浮动的方法 after伪类。

    .clearfix{ *zoom:1; } .clearfix:after{ content: ""; display: block; clear: both; } 在样式中加入上 ...