【发布时间】:2018-10-09 08:59:26
【问题描述】:
我有一个类似下面的函数来连接一个端口不断变化的 FTP
private int FindWorkingPort(int from, int to)
{
for (int port = from; port <= to; port++)
{
try
{
new FtpClient(_host, port).Connect(); // Instant on correct port, very slow on wrong port
return port;
}
catch { }
}
throw new Exception("None of the port is working");
}
当第一次尝试正确时,它是即时的。否则,每次尝试可能需要 10 秒。你可以想象如果正确的是最后一个。
有没有办法让它同时尝试所有可能的端口? (我是多线程的菜鸟)
编辑:
我正在使用FluentFTP,它确实有.ConnectAsync()
【问题讨论】:
-
1) 什么是
FtpClient? 2)通常可以减少超时值,但这会产生错误的结果,如果确实存在超时问题 3)如果FtpClient有异步API,您可以尝试并行连接请求,但这可能会受到您的网络基础设施的限制,以及主机网络基础设施。换句话说,不可能有 100% 有效且稳健的解决方案。你想达到什么目的? -
谢谢丹尼斯。 1)FluentFTP 2)你说得对,谢谢,所以如果它可以同时检查几个端口会更好 3)它确实支持异步。如果这就是您所说的,我不确定主机将如何处理多个连接。我想要实现的是更快地找到工作端口
-
@Aximili 您可以尝试 telnet 到端口而不是建立连接。
-
请永远不要
try { ... } catch { }- 这是一个糟糕的反模式。您应该只捕获您可以有意义地处理的特定异常。另外,当没有异常发生时不要抛出异常。 -
这可能(或者应该)触发目标网络上的端口扫描警报。
标签: c# multithreading parallel-processing