Пишу TCP листенер наткнулся на такие вот свойства в TCPClient ReceiveTimeout
и SendTimeout
.
Есть несколько вопросов
ReceiveTimeout
ждет подключения указанное количество времени, но не совсем понятно, например если он ждет подключения 5 мин, но происходит подключение и отправляется ответ в течении 10 сек - этот клиент и дальше будет висеть 4:50 сек ? Из-за блокировки Read
Роли 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 мин. Мне показалось, что подключенный клиент просто отваливается недождавшись
ReceiveTimeout
позволяет задать время, которое ваш сокет будет ждать входящих данных. Если за указанное время данные так и не поступили, считается, что удалённый клиент не ответил. Если вы хотите ожидать данные неограниченный временной промежуток, установите ReceiveTimeout
в -1 (аналогично работает и для SendTimeout
).
SendTimeout
позволяет задать время, за которое данные, переданные на сокет, должны быть отправлены удалённому клиенту. Если данные так и не были отправлены за это время, они уже никогда не будут отправлены.
Суть кода в том, что при поступлении запроса на листенер идет очень долгая работа в БД, иногда 3 мин. Мне показалось, что подключенный клиент просто отваливается недождавшись
Скорее всего так и есть. Сокет удалённого клиента не хочет ждать ответа 3 минуты и закрывает соединение. Нужно исправить код клиента, добавив в него установку свойства TcpClient.ReceiveTimeout
в -1, ну или там на 5*60*1000 мс (по крайней мере перед чтением ответа вашего сервера).
Ну так же могу порекомендовать использовать ThreadPool.QueueUserWorkItem()
вместо Thread.Start()
:)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть моделька генераторСоздал Префаб, вышло так что в префабе 10 дочерних элементов
Как удалить определенный файл из Кэша в Юнити? Ситуация такая: у меня есть AssetBundle, который мне нужно постоянно удалять и загружать на его место...
У меня есть List в котором хранятся все клетки на игровом поле, у каждой клетки есть два состояния - проходима или нет (стена)Так как для генерации...
Есть две программы Server и ClientClient знает о функциях сервера и хочет их вызвать