TcpClient ReceiveTimeout и SendTimeout в C#

92
10 сентября 2019, 08:00

Пишу TCP листенер наткнулся на такие вот свойства в TCPClient ReceiveTimeout и SendTimeout.

Есть несколько вопросов

  1. ReceiveTimeout ждет подключения указанное количество времени, но не совсем понятно, например если он ждет подключения 5 мин, но происходит подключение и отправляется ответ в течении 10 сек - этот клиент и дальше будет висеть 4:50 сек ? Из-за блокировки Read

  2. Роли SendTimeOut не понял вообще в контексте листенера, можно ли ссылки, или как-то объяснить его роль ?

Вот мой код:

TcpListener listener = new TcpListener(IPAddress.Parse(_listeningUrl), _liteningPort);
                listener.Start();
                while (true)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    client.ReceiveTimeout = 540000;
                    client.SendTimeout = 540000;
                    client.NoDelay = true;
                    new Thread(()=>
                    {
                        ThreadProc(client);
                        client.Close();
                    }).Start();
                }

Суть кода в том, что при поступлении запроса на листенер идет очень долгая работа в БД, иногда 3 мин. Мне показалось, что подключенный клиент просто отваливается недождавшись

Answer 1

ReceiveTimeout позволяет задать время, которое ваш сокет будет ждать входящих данных. Если за указанное время данные так и не поступили, считается, что удалённый клиент не ответил. Если вы хотите ожидать данные неограниченный временной промежуток, установите ReceiveTimeout в -1 (аналогично работает и для SendTimeout).

SendTimeout позволяет задать время, за которое данные, переданные на сокет, должны быть отправлены удалённому клиенту. Если данные так и не были отправлены за это время, они уже никогда не будут отправлены.

Суть кода в том, что при поступлении запроса на листенер идет очень долгая работа в БД, иногда 3 мин. Мне показалось, что подключенный клиент просто отваливается недождавшись

Скорее всего так и есть. Сокет удалённого клиента не хочет ждать ответа 3 минуты и закрывает соединение. Нужно исправить код клиента, добавив в него установку свойства TcpClient.ReceiveTimeout в -1, ну или там на 5*60*1000 мс (по крайней мере перед чтением ответа вашего сервера).

Ну так же могу порекомендовать использовать ThreadPool.QueueUserWorkItem() вместо Thread.Start() :)

READ ALSO
Дочерние элементы в префабе обьекта

Дочерние элементы в префабе обьекта

Есть моделька генераторСоздал Префаб, вышло так что в префабе 10 дочерних элементов

111
Unity Cache Delete File (Delete AssetBundle)

Unity Cache Delete File (Delete AssetBundle)

Как удалить определенный файл из Кэша в Юнити? Ситуация такая: у меня есть AssetBundle, который мне нужно постоянно удалять и загружать на его место...

85
Как реализовать работу с коллекцией для алгоритма поиска

Как реализовать работу с коллекцией для алгоритма поиска

У меня есть List в котором хранятся все клетки на игровом поле, у каждой клетки есть два состояния - проходима или нет (стена)Так как для генерации...

92
Вызвать функцию другой программы

Вызвать функцию другой программы

Есть две программы Server и ClientClient знает о функциях сервера и хочет их вызвать

92