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 OPENCV 连通域, Imgproc.findContours 例子,参数说明
http://stackoverflow.com/questions/29491669/real-time-paper-sheet-detection-using-opencv-in-android/ ...
- 【项目笔记】【bug】数组空指针异常
package com.example.googleplay.ui.holder; import java.util.ArrayList; import android.view.View; impo ...
- 用telnet命令,SMTP发送邮件
邮件的发送是基于smtp协议的.邮件客户端软件给smtp服务器传送邮件和smtp服务器之间传送邮件也都是基于smtp协议的.邮件客户端软件接受邮件是主要基于pop3协议的. 下面介绍利用windows ...
- 无法加载shockwave flash
热心网友 360浏览器的话,浏览器——工具——选项(非Internet选项)——高级设置——FLASH, 默认使用PPAPI Flash(需要重启浏览器) 默认使用NPAPI Flash(需要重启浏览 ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- Eclipse/MyEclipse 最最常用的快捷键
F 键类 F2 显示详细信息 F3 跳到声明或定义的地方 Ctrl + 键类 Ctrl+1 快速修复 ( 最经典的快捷键 , 就不用多说了 ) Ctrl+D 删除当前行 Ctrl+E 快速显示当前 E ...
- CentOS 修改Mysql的root密码
1.知道密码 第一次登陆(无密码) mysqladmin -u root password NEWPASSWORD 修改过密码 mysqladmin -u root -p 'oldpassword' ...
- ANSI X9.8标准 PIN xor PAN获取PIN BlOCK
ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下: (1) AN ...
- VMware NAT端口映射外网访问虚拟机linux
本文目的: 一. SSH连接 二. 访问HTTP VMware Workstation提供了两种虚拟机上网方式,一种bridge,一种NAT,bridge可以获得公网地址,而NAT只能是内网地址了. ...
- FZU Problem 2028 时空门问题(DFS+优化)
一开始是MLE,后来想到了用vector,化二维为一维,做了这一步优化后,这就是很基础的一个广搜了 #include<iostream> #include<cstdio> #i ...