我正在开发两个使用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以捕获任何抛出的异常(“Debug - > Exceptions ...”菜单) 。因此,每次尝试连接时,它都会进入VS,我必须按下继续。
我得到的例外是:
无法建立连接,因为目标计算机主动拒绝了它127.0.0.1:50000
我认为有一种方法可以检查服务器是否正在侦听特定端口而不实际尝试连接它。我知道只是检查是不够的 - 服务器可能会在检查和连接尝试之间发生故障,但在我开发它的时候对我来说仍然会好得多。
或类似的东西:
TcpClient tcpClient = new TcpClient();
while ( !tcpClient.TryConnect(....) )
{ Thread.Sleep(1000); }
类似于:
if (bool.TryParse( "false" ))
{ ... }
我也尝试使用异步方法(开始/结束连接)并手动设置ManualResetEvent的超时,但这也不起作用。我已经浏览了互联网,但我找不到解决这个问题的方法,这就是为什么我最终在这里发帖:)
答案 0 :(得分:4)
问题是VS在异常中打破?您可以随时让VS忽略特定的异常系列。
在VS中,在Debug菜单中,选择“Exceptions ...”,然后在出现的对话框中,您可以控制它。
答案 1 :(得分:1)
我打算建议不要捕获异常,所以在我建议我自己测试它之前,如果你将它设置为抛出所有异常,即使你没有抛出异常,它仍然会抛出所有异常。我必须同意Shiv Kumar,要么在调试应用程序时调整设置,要么接受你正在做的事情的限制。
bool.TryParse的工作原理是验证每个字符,类似于Int32.TryParse如何确保字符串中的每个字符都是0-9或任何其他有效的数字符号。
您当然可以编写自己的网络类,但在连接失败时不会抛出异常。
TryParse不会抛出异常,如果你通过try {} catch {}使用bool.Parse,你必须捕获任何抛出的异常,否则如果你试图解析一个不是布尔值的东西,它将抛出一个未处理的异常。 TryParse后来在.NET的历史中添加,Parse是更经典的方法,允许程序员处理所有意外的输入并在尝试解析数据之前验证输入。
我应该补充一点,如果TryParse无法解析该方法的结果为false且out变量我认为是假的,那么TryParse将返回false。这至少是Int32的情况
http://msdn.microsoft.com/en-us/library/system.boolean.tryparse.aspx
我想指出TryParse和Parse的工作原理是它们与TcpClient相比是完全不同的野兽。我想我应该澄清一下,基本的验证过程是相似的,除了一个抛出异常而另一个抛出异常,当然一个返回实际解析的内容。