Пишу 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() :)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости