【发布时间】:2011-05-14 10:31:30
【问题描述】:
我正在开发两个使用 TCP 相互连接的应用程序。在某一时刻,其中一个正在尝试使用 TcpClient 进行连接,但不能保证另一个应用已经开始侦听(使用 TcpListener)。
我的第一次尝试是这样的:
TcpClient c = null;
while (true)
{
try
{
c = new TcpClient();
c.NoDelay = true;
c.Connect( ip, port );
break;
}
catch (SocketException ex)
{
Console.WriteLine(string.Format("Could not connect to {0}:{1}, retrying...", ip, port));
Thread.Sleep( 500 );
}
}
但是,问题在于它依赖于异常处理,这对我来说有点麻烦,因为我设置了 VS 来捕获任何抛出的异常(“调试 -> 异常...”菜单)。所以每次它尝试连接时,它都会闯入VS,我必须按继续。
我得到的例外是:
无法建立连接,因为目标机器主动拒绝它 127.0.0.1:50000
我想有一种方法可以检查服务器是否正在侦听特定端口,而无需实际尝试连接到该端口。我知道仅仅检查是不够的 - 服务器可能会在检查和连接尝试之间发生故障,但在我开发它时它对我来说仍然会好得多。
或者是这样的:
TcpClient tcpClient = new TcpClient();
while ( !tcpClient.TryConnect(....) )
{ Thread.Sleep(1000); }
与此类似:
if (bool.TryParse( "false" ))
{ ... }
我还尝试使用异步方法(开始/结束连接)并手动设置 ManualResetEvent 的超时,但这也不起作用。我已经搜索了互联网,但我一直无法找到解决这个问题的方法,这就是我最终在这里发帖的原因:)
【问题讨论】:
标签: c# exception-handling network-programming tcpclient