TTCPBlockSocket CanRead постоянно true

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
and_rivne
новенький
Сообщения: 20
Зарегистрирован: 09.12.2011 13:40:42

TTCPBlockSocket CanRead постоянно true

Сообщение and_rivne »

Держу открытый сокет для подключений:

Код: Выделить всё

Socket.Bind('0.0.0.0','57777');
Socket.setLinger(true,10000);

проверяю есть ли новый клиент:

Код: Выделить всё

repeat
if Socket.CanRead(100) then
       begin
       ......
       end;
until Terminated;

Но в при наступлении какого-то момента Socket.CanRead(100) всегда стает true и цикл "зацыкливает". Видимо срабатывают ограничения ОС. Но ошибок никаких нет в Socket.LastError.
На линухе это достигается примерно на 460 коннекте.
На винде такого дождаться не могу. Но не факт, видимо и тут есть ограничение, просто, число побольше.

Как отловить такой момент?

Добавлено спустя 1 час 46 минут 22 секунды:
Нашел как изменить лимиты в системе.
Просмотр текущих лимитов:

Код: Выделить всё

ulimit -n

Изменять нужно файл

Код: Выделить всё

vi /etc/security/limits.conf

Но это не решает саму проблему. Нужно понимать, что программа уперлась в лимит.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Скорее данные потекли.. Указатели не на то ссылаются.. Работаете с мусором или мертвым объектом как с живым..
Даже TList может "переполнится" Insert/Delete одного элемента
и все производные... если его вовремя не Pack();

Добавлено спустя 3 минуты 15 секунд:
Вариантов много..
Если код написан правильно и нормально работает с одним/двумя экземплярами.. а во множестве начинает глючить - скорее работа с созданием/удалением не совсем правильная.. созданием удалением переменых в объектах тоже нужно проследить.. Это первый признак протечки..

Добавлено спустя 4 минуты 49 секунд:
Параметры проекта -> параметры компилятора -> отладка : включить Heaptrc
and_rivne
новенький
Сообщения: 20
Зарегистрирован: 09.12.2011 13:40:42

Сообщение and_rivne »

olegy123
Параметры проекта -> параметры компилятора -> отладка : включить Heaptrc

Не нахожу такого.
http://joxi.ru/YmEGNz8u0WLQbA
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Это здесь:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
MysticCoder
постоялец
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Сообщение MysticCoder »

and_rivne писал(а):Но в при наступлении какого-то момента Socket.CanRead(100) всегда стает true и цикл "зацыкливает". Видимо срабатывают ограничения ОС. Но ошибок никаких нет в Socket.LastError.
На линухе это достигается примерно на 460 коннекте.


что то не пойму, становится true, значит клиент есть. зачем интерпретировать как то иначе? если клиента на самом деле нету, то почему бы об этом не сказать мол после CanRead = True Accept не срабатывает или что то типа того?
А вообще залезь пошагово в этот CanRead когда он неправильно себя ведет и посмотри где он сворачивает не туда. Я там как то ошибку нашел иль неправильное поведение связанное с SSL коннектами...
Ответить