我试图找到所有的FTP服务器接受一个给定的ips集上的匿名连接。异步FTP调用永不结束
基本上,我得到我想检查的IP,然后在它们每个上尝试一个ListDirectory。如果我没有例外,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", "[email protected]");
FtpWebResponse response = (FtpWebResponse) await request.GetResponseAsync();
// If we got this far, YAY!
ftps.AddLast(serverUri);
}
catch (WebException)
{
}
--waitingOn;
}
您的代码似乎缺少您设置hsip的部分。此外,您在致电VerifyFtpAsync时缺少此项功能。也许有一个VerifyFtpAsync包装函数。 – 2013-03-17 01:58:30
忘记改变这些,我试图将Uri添加到HashSet(hsip)来查看哪些调用没有返回,但是最后我的HashSet有4个空元素(而不是waitingOn == 4)。 – roim 2013-03-17 02:01:20
我会首先评论你有没有等待的那一行,看看它是否完成。对不起,我对这个没什么帮助。 – 2013-03-17 02:08:25