開いているポートはすぐに TcpClient によってすぐに処理される ICMP パケットを返しますが、閉じられた/ブロックされたポートの "Port Unreachable" 応答では、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
});
}
}