Вы неправильно используете способ работы TCP Connect. Когда вы наберете client.ConnectAsync()
, операционная система займет некоторое время для фактического истечения времени ожидания. Ваша настройка tcp.SendTimeout = 1000;
не влияет на ConnectAsync()
, управляемый операционной системой, и может длиться 20 секунд.
Итак, в этом случае вы возвращаете сервер в рабочее состояние. до истечения времени ожидания соединения и соединения.
Так что, если вы не хотите ждать 20 секунд, чтобы получить предупреждение, вам нужно будет запустить другой тайм-аут, чтобы отменить ожидающий Connect () и сообщить, что вы не в сети. Например, если вы не получите ответ в течение 1 секунды, отчет будет отключен.
Кроме того, если соединение не установлено из-за его активного отказа, вам также потребуется обработать этот тестовый пример. Отказ обычно означает, что ваш сервер включен, но порт не прослушивает. Однако это также может быть брандмауэр, активно отказывающий в соединении, в этом случае вы не знаете, работает ли сервер.
Рассмотрим следующий пример кода, который обеспечивает базовый c TCP-мониторинг порта:
private async void btnTest_Click(object sender, EventArgs e)
{
int timeOut = 2000;
while (true)
{
using (TcpClient client = new TcpClient())
{
var ca = client.ConnectAsync("127.0.0.1", 9999);
await Task.WhenAny(ca, Task.Delay(timeOut));
client.Close();
if (ca.IsFaulted || !ca.IsCompleted)
listBox1.Items.Add($"{DateTime.Now.ToString()} Server offline.");
else
listBox1.Items.Add($"{DateTime.Now.ToString()} Server available.");
}
// Wait 1 second before trying the test again
await Task.Delay(1000);
}
}