2012-06-23 33 views
0

我得到了下面的代码:的TcpClient超时ICMP端口不可达

TcpClient client = new TcpClient("server", 5555); 

服务器立即发回一个ICMP端口不可达,但程序走约30秒,直到超时了10054错误。

我关闭防火墙,wireshark也捕获数据包,所以它不是windows配置问题。

我怎样才能让TcpClient识别端口不可访问的数据包?

回答

0

开放端口立即返回由TcpClient立即处理的ICMP数据包,但带有关闭/阻塞的端口“端口不可达”响应TcpClient必须等待至30秒超时。您可以通过使异步调用如下所示更改超时方法:

TcpClient client = new TcpClient(); 
client.BeginConnect("server", 5555, new AsyncCallback(CallBack), client); 

private void CallBack(IAsyncResult result) 
{ 
bool connected = false; 
using (TcpClient client = (TcpClient)result.AsyncState) 
{ 
    try 
    { 
     client.EndConnect(result); 
     connected = client.Connected; 
    } 
    catch (SocketException) 
    { 
    } 
} 
if (connected) 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 
     // Do Something 
    }); 
} 
else 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 
     // Do Something 
    }); 
} 
} 
+0

在相同的30秒超时后不会调用“CallBack”吗? –