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 шт):

Автор решения: S.H.

Все правильно.

Вы вызываете синхронный метод server.AcceptTcpClient();

accept - это штука, которая в синхронных сокетах передаёт управление OS и возвращает управление в одном из двух случаев:

  1. в сокет пришли данные
  2. истек таймаут ожидания accept'а

Если Вы хотите минимально модифицировать решение - я бы запустил две параллельные task'и, одна из которых занималась бы connect'ом, а вторая - ждала секунду и выводила надпись о том, что "Wait connection..."

А дальше - что произойдёт первее :-) - то есть, наступление connect'а долджно отменять первую task'у.

Сейчас попробую набросать пример кода...

→ Ссылка