Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TServerSocket и TService / 25 сообщений из 55, страница 1 из 3
01.10.2019, 06:15
    #39869661
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Доброго времени, уважаемые форумчане!
Прошу помощи в следующем. Имеем "отладочное" приложение, которое содержит TServerSocket, работающий в неблокирующем режиме (stNonBlocking) и принимающий данные от кучи разных устройств/локальных клиентских программ и прочее. Все отлично работает, срабатывает событие OnClientRead(), выполняю обработку и, при необходимости, отправку данных при помощи SendText(). В случае, если данные были разбиты на части во время их передачи, OnClientRead() вызывается для каждой части по порядку и проблем тоже нет.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// при создании формы (службы)
FServerSocket := TServerSocket.Create(nil);
FServerSocket.OnClientError := OnError;
FServerSocket.OnClientRead := OnRead;
FServerSocket.OnClientDisconnect := OnDisconnect;

// при разрушении формы (службы)
for Index := 0 to FServerSocket.Socket.ActiveConnections - 1 do
  FServerSocket.Socket.Connections[Index].Close;
FServerSocket.Close;


Затем, все это дело я оформил как службу - штатный TService. И появилась такая проблема - все работает примерно в течение часа, затем перестает работать. Служба запущена всегда, остановок и исключений нет. Сделал свой собственный простой и примитивный лог - вижу, что после определенного количества подключений (около 100 активных sockets) перестает срабатывать событие OnClientRead(). То есть, клиент подключается, подключение проходит, но событие уже не срабатывает. При перезапуске службы, разумеется, все начинает работать, опять-таки до поры до времени. Если кто сталкивался с чем-то подобным, пуду премного признателен.
Может быть, дело в том, что нельзя использовать stNonBlocking внутри службы? Программа была идеально отлажена именно в этом режиме работы сервера.
...
Рейтинг: 0 / 0
01.10.2019, 08:02
    #39869670
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Сомнительно что-то. Если в режиме десктопа работает, то режиме службы должно. Может в каких-то ситуациях окна открываются, ShowMessage например?
...
Рейтинг: 0 / 0
01.10.2019, 08:20
    #39869672
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
DmSer,
В том и дело, что нет никаких ShowMessage(), как будто бы есть какое-то ограничение на количество подключений (что-то типа ThreadCacheSize - но это для блокирующего режима и работы с потоками, а здесь все в главном потоке, ибо обработка очень быстрая).
Пока поставил в таймере такой "костыль" с интервалом на 1 час (3600000 мс).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
try
  for Index := 0 to FServerSocket.Socket.ActiveConnections - 1 do
    FServerSocket.Socket.Connections[Index].Close;
  FServerSocket.Close;
finally
  if not FServerSocket.Active then
    FServerSocket.Open;
end;


Пока все это работает, но это не дело совсем, конечно...
...
Рейтинг: 0 / 0
01.10.2019, 08:59
    #39869676
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
автора здесь все в главном потоке, ибо обработка очень быстрая.

Видимо у Вас где-то происходит зависание в основном потоке. Может дедлок? TService как-то взаимодейстует с TServerSocket?
...
Рейтинг: 0 / 0
01.10.2019, 09:28
    #39869683
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
DmSer,
Теоретически не должно быть зависаний, ибо действующие подключения еще некоторое время работают, потом вообще умирает все. Кстати, вышеприведенный "костыль" не помог - все равно перестает срабатывать событие, я это вижу по своему кустарному логу и по факту того, что ответ SendText() перестает приходить через некоторое время (отправляю при помощи Packet Sender - эмулирую сообщение клиента). А каким образом TService может взаимодействовать с TServerSocket? Только запуск, остановка, обработка событий от TServerSocket.
Экземпляр TServerSocket создаю динамически в RunTime, ибо убрали их давно из палитры компонентов, так удобнее.
...
Рейтинг: 0 / 0
01.10.2019, 09:32
    #39869685
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
DmSer,
Deadlock тоже не должно быть, ибо база работает на чтение, операция записи крайне редкая - и, думаю, это было бы хорошо видно еще в десктопном варианте, но там такого и близко не было
...
Рейтинг: 0 / 0
01.10.2019, 09:37
    #39869687
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalex,

имхо, либо в локе висит, тогда можно посмотреть каким-нибудь ProcessExplorer, так ли это
либо сокеты кончились, можно посмотреть тем же ProcessExplorer или netstat'ом
...
Рейтинг: 0 / 0
01.10.2019, 09:56
    #39869693
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Ставлю на исключение, которое что-то повесило.
Хотя, конечно, может быть и лок из-за какого-нибудь synchronize.
...
Рейтинг: 0 / 0
01.10.2019, 10:05
    #39869696
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
YuRockСтавлю на исключение, которое что-то повесило.


Кстати да, если в службе возникнет исключения, то, если оно не обработано в try..except, то будет открыто окно с ошибкой ShowMessage, которое в режиме службы никто не увидит.
...
Рейтинг: 0 / 0
01.10.2019, 10:11
    #39869703
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
DmSer,
try... except все на месте, но все равно сейчас пытаюсь проверить на зависание/срабатывание Exception, может, где что упустил. В десктопе, правда, никаких исключений не выпадало, все обрабатывается.
...
Рейтинг: 0 / 0
01.10.2019, 11:29
    #39869787
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
DmSer,
Зависание маловероятно, ибо поставил таймер и он работает в главном потоке, вижу по логам, да и действующие подключения еще живут какое-то время и работает обмен данными, что видно при помощи сниффера и при отправке эмуляции пакета и получением ответа программой Packet Sender. Исключений тоже нет - проверил, да и не было в десктопе - там все чисто по исключениям, расставлены все try ... except/finally.
А что значит - кончились сокеты? В декстопе же не кончались, я там тысячи подключений делал и работало идеально. Здесь же после 100 - 150 активных подключений уже все падает. Причем обнаружил такую вещь, которая совсем лишила меня понимания - иногда после "зависания" снова начинает работать, будто переполняется/высвобождается какой-то глобальный ресурс. В десктопе ничего подобного не было.
...
Рейтинг: 0 / 0
01.10.2019, 11:34
    #39869792
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalex,

посмотри SO_REUSEADDR
подключения постоянные или переподключается постоянно?
...
Рейтинг: 0 / 0
01.10.2019, 11:35
    #39869794
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalex,

похоже ошибся опцией, сорри
...
Рейтинг: 0 / 0
01.10.2019, 11:35
    #39869795
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Пальцем в небо: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableConnectionRateLimiting - должно быть 0.
...
Рейтинг: 0 / 0
01.10.2019, 11:38
    #39869802
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Пока вижу только два варианта -
1. Отказаться от службы и юзать десктопный вариант. Прям совсем не хотелось бы, ибо десктоп на сервере зло (нужен логин на сервер), а служба очень удобная вещь, сама запускается, работает в фоне, ресурсов минимум, не требует входа в систему - идеальный вариант для такого сервера.
2. Отказаться от TServerSocket и использовать что-то иное.
...
Рейтинг: 0 / 0
01.10.2019, 11:39
    #39869805
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
wadman,
Сейчас гляну...
...
Рейтинг: 0 / 0
01.10.2019, 11:42
    #39869814
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Zelius,
Подключения постоянные - живут столько, сколько позволит сеть и условия. Там, где GPRS - рвется немного чаще, так как, по моему, сотовые операторы как-то регламентируют время жизни сессии. Там, где локалка - могут и сутками висеть
...
Рейтинг: 0 / 0
01.10.2019, 11:46
    #39869818
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalex,

посмотри netstat все же, сколько там висит соединений и в каком состоянии... может залипают соединения
...
Рейтинг: 0 / 0
01.10.2019, 11:48
    #39869823
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
wadmanПальцем в небо: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableConnectionRateLimiting - должно быть 0.
Вовсе нет такого параметра в этой ветви...
...
Рейтинг: 0 / 0
01.10.2019, 11:54
    #39869827
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalexЗависание маловероятно, ибо поставил таймер и он работает в главном потоке, вижу по логамЗначит - точно MessageBox (или какое другое модальное окно) висит.
Он не мешает отрабатывать таймеру.
...
Рейтинг: 0 / 0
01.10.2019, 11:56
    #39869830
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalex,

https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

там у процесса есть вкладка TCP/IP, есть список потоков, по каждому можно стек посмотреть, хоть и без дельфи кода, может натолкноеит на мысль
...
Рейтинг: 0 / 0
01.10.2019, 11:57
    #39869832
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
Zeliusoklalex,
посмотри netstat все же, сколько там висит соединений и в каком состоянии... может залипают соединения
Соединений там всегда очень много - некоторые из тех, что по GPRS, могут находиться в TIME_WAIT, это нормально для них в целом, потом, как я понимаю, они умирают и клиент переподключается. Те, которые по локальной сети или по LTE, там у всех ESTABLISHED всегда.
...
Рейтинг: 0 / 0
01.10.2019, 11:58
    #39869833
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
oklalexDmSer,
try... except все на месте, но все равно сейчас пытаюсь проверить на зависание/срабатывание Exception, может, где что упустил. В десктопе, правда, никаких исключений не выпадало, все обрабатывается.В "десктопе" были совсем другие права.
У службы, например, нет прав на сетевые шары, которые были у твоего "десктопа". И многое еще отличается. Ты можешь не видеть каких-то окон, объектов...
Может, в этом причина.
...
Рейтинг: 0 / 0
01.10.2019, 12:03
    #39869836
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
YuRockoklalexЗависание маловероятно, ибо поставил таймер и он работает в главном потоке, вижу по логамЗначит - точно MessageBox (или какое другое модальное окно) висит.
Он не мешает отрабатывать таймеру.
Если бы все было так просто ) Я этот код уже вверх дном перевернул, в десктопе запускал по-разному... Попробую еще поискать. Может, сам TServerSocket что выдает, но я его сообщения подавляю (ErrorCode задаю 0), а в лог себе вывожу перед этим
...
Рейтинг: 0 / 0
01.10.2019, 12:08
    #39869844
oklalex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TServerSocket и TService
YuRockoklalexDmSer,
try... except все на месте, но все равно сейчас пытаюсь проверить на зависание/срабатывание Exception, может, где что упустил. В десктопе, правда, никаких исключений не выпадало, все обрабатывается.В "десктопе" были совсем другие права.
У службы, например, нет прав на сетевые шары, которые были у твоего "десктопа". И многое еще отличается. Ты можешь не видеть каких-то окон, объектов...
Может, в этом причина.
Вот про это думал тоже и не раз . Службу пробовал запускать, как от системной учетной записи, так и как сетевую службу, так и от имени администратора (задав логин и пароль в настройках службы). Ничего не помогает. Десктоп при этом запускал с обычными правами, как калькулятор. Да и служба там простая - парсит данные и сохраняет на отдельный локальный диск, никаких прав особых ей не требуется.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TServerSocket и TService / 25 сообщений из 55, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]