C#通过socket判断FTP服务器是否通畅并判断用户名密码是否正确
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服务器是否通畅并判断用户名密码是否正确的更多相关文章
- python【项目】:基于socket的FTP服务器
功能要求 1. 用户加密认证 2. 服务端采用 SocketServer实现,支持多客户端连接 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. ...
- 自学linux——18.FTP服务器的搭建
Centos7下FTP服务器的搭建 一.FTP的作用 文件传输协议(File Transfer Protocol,FTP),是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20. ...
- java实现读取ftp服务器上的csv文件
定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPCl ...
- Android 上传文件到 FTP 服务器
实现背景 近期接触到一个需求,就是将文件从Android系统上传到FTP服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的.但是基本的流程还是 ...
- 【FTP】在自己的电脑上建立FTP服务器
<1> 添加新用户: “计算机”点击右键 “管理”得到: 点击“本地用户和组”,点击“用户”: 右键 “新用户”: 设定用户名与密码,这是以后连FTP服务器时用的登录用户名与密码. < ...
- centos FTP服务器的架设和配置
yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [root@localhost ftp]# /sbin/service vsftpd restart Shutting d ...
- FTP服务器搭建与访问的相关问题
近期想搭建在云服务器上搭建一个项目,每次远程登陆服务器实在比较繁琐,故而想到使用FTP上传下载方式来进行相应的操作:在网络上搭建FTP服务器的文档还是很丰富的,按照操作一步步来还算方便,楼主就不在这边 ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- Windows下ftp服务器搭建及配置
Win系统使用ser-u软件进行FTP服务器的搭建下载地址:https://www.serv-u.com/操作步骤如下:1. 点击执行程序进行按照SU-FTP-Server-Windows-v15.1 ...
随机推荐
- 求交集,差集,并集,善用java的set
当有题目有求这些结果时,使用集合数据结构还是很快的.需要考虑的是,注意map和set的区别. public static void main(String[] args) { Set<Integ ...
- Codeforces Round #366 (Div. 2) C. Thor (模拟)
C. Thor time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- qemu -hda /dev/sdc -m 1024 -vga std
同事拿了个烂u盘让我给他做个启动盘,用cp *.iso /dev/sdc怎么也启动不了. 改用dd if=copied/20140923/debian-7.6.0-amd64-DVD-1.iso of ...
- javascript 中 apply(或call)方法的用途----对象的继承
一直以来,我的理解就是 js中的Function.apply(或者是Function.call)方法是来改变Function 这个函数的执行上下文(excute Context),说白了,就是改变执 ...
- Android在一个APP中通过包名或类名启动另一个APP
开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用.一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通 ...
- JAVA字符串编码转换常用类
无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312.一.关键技术点: ...
- Flocker 做为后端存储代理 docker volume-driver 支持
docker Flocker https://github.com/ClusterHQ/flocker/ 文档: https://docs.clusterhq.com/en/latest/docker ...
- LCD12864 液晶显示-汉字及自定义显示(并口)
LCD12864带字库,型号:CM12864-12.其相关数据手册可以在百度中搜索“ST7920 系列中文图形液晶模块使用说明书”,里面有详细的介绍.这里就不在多描述. 其原理简图:(我们只需关心接口 ...
- nginx的内页跳转总结
刚进公司的时候老大一直在要求php做内页跳转,当时也不太了解细节所以一直没有说话.后来php问我你会不会做内页跳转,我说会一点就做了几个,从此搞内页跳转搞了两个星期.至于为什么做内页跳转哪就暂时不 ...
- CodeForces 606B Testing Robots
模拟,题意看了一小时 /* *********************************************** Author :Zhou Zhentao Email :774388357@ ...