我正在尝试查找所有在给定 IP 组上接受匿名连接的 ftp 服务器。
基本上,我获取要检查的 IP,然后在每个 IP 上尝试 ListDirectory。如果我没有异常(exception),ftp 存在并且可以访问。
我使用异步方法来验证 IP,这使得事情变得更快。但是,我需要等待所有异步调用返回。为此,我对异步调用的数量保留了一个计数器,问题是该计数器永远不会达到 0。
我的代码如下所示:
迭代 IP:
static int waitingOn;
public static IEnumerable<Uri> GetFtps()
{
var result = new LinkedList<Uri>();
waitingOn = 0;
IPNetwork ipn = IPNetwork.Parse("192.168.72.0/21");
IPAddressCollection ips = IPNetwork.ListIPAddress(ipn);
foreach( var ip in ips )
{
VerifyFtpAsync(ip, result);
}
while (waitingOn > 0)
{
Console.WriteLine(waitingOn);
System.Threading.Thread.Sleep(1000);
}
return result;
}
并验证每个 IP:
public async static void VerifyFtpAsync( IPAddress ip, LinkedList<Uri> ftps )
{
++waitingOn;
try
{
Uri serverUri = new Uri("ftp://" + ip);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
request.Timeout = 10000;
request.Credentials = new NetworkCredential("anonymous", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="087a676165487b6d697a6b60266b6765" rel="noreferrer noopener nofollow">[email protected]</a>");
FtpWebResponse response = (FtpWebResponse) await request.GetResponseAsync();
// If we got this far, YAY!
ftps.AddLast(serverUri);
}
catch (WebException)
{
}
--waitingOn;
}
最佳答案
替换
FtpWebResponse response = (FtpWebResponse) await request.GetResponseAsync();
带有同步代码
FtpWebResponse response = (FtpWebResponse) request.GetResponse();
FtpWebRequest.GetResponseAsync
不会针对特定于 FTP 进行重写,并且来自基本 WebRequest
类,该类似乎无法正确处理此问题。
关于c# - 异步 FTP 调用永远不会结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456771/