TcpClient Timeout
Имеется код:
Task ServerStart()
{
TcpListener server = new TcpListener(IPAddress.Parse(ipserver), port);
try
{
server.Start();
Dispatcher.Invoke(() => lbConsole.Items.Add("Сервер запущен. Ожидание подключений..."));
while (true)
{
TcpClient client = server.AcceptTcpClient();
client.ReceiveTimeout = 1000;
if (client.SendTimeout == 1000)
{
Dispatcher.Invoke(() => lbConsole.Items.Add("Wait connection..."));
if (cts.IsCancellationRequested)
{
server.Stop();
break;
}
break;
}
NetworkStream ns = client.GetStream();
byte[] msg = new byte[64];
//Чтение и запись данных...
ns.Close();
client.Close();
}
}
catch (Exception ex)
{
Dispatcher.Invoke(() =>
{
lbConsole.Items.Add("Сервер остановлен по причине");
lbConsole.Items.Add(" ---> Ошибка: " + ex.Message.ToString());
});
server.Stop();
}
return Task.CompletedTask;
}
Вопрос заключается в том, что если нет соединения с клиентом больше 1 сек, должен выводить сообщение в ListBox "Wait connection...", но в отладке процесс ожидает TcpClient client = server.AcceptTcpClient();
Ответы (1 шт):
Все правильно.
Вы вызываете синхронный метод server.AcceptTcpClient();
accept - это штука, которая в синхронных сокетах передаёт управление OS и возвращает управление в одном из двух случаев:
- в сокет пришли данные
- истек таймаут ожидания accept'а
Если Вы хотите минимально модифицировать решение - я бы запустил две параллельные task'и, одна из которых занималась бы connect'ом, а вторая - ждала секунду и выводила надпись о том, что "Wait connection..."
А дальше - что произойдёт первее :-) - то есть, наступление connect'а долджно отменять первую task'у.
Сейчас попробую набросать пример кода...