|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
|
Утечки при использовании порта завершения и соккетов29.10.2015, 14:33. Показов 1152. Ответов 12
Метки нет (Все метки)
Здравствуйте, уважаемые Гуру! Реализовываю сервер с использованием порта завершения. Всё работает, всё прекрасно. Одно меня смущает - невозможно удалить хэндл из порта, пока не произойдёт завершение считывания-записи. Т.е. если клиент просто отключается, то порт продолжит хранить данные об этом хендле. По крайней мере я так понял из сети. Есть 2 идеи. 1 - фиктивные сообщения по таймауту с типом операции "удалить", 2 - идея двойной буфферизации. Т.е. имеем 2 порта завершения, в один момент активен только один из них. Как только количество хендлов превышает некоторый предел, порты переключаются. Это я основываю на предположении, что CloseHandle сама очистит устаревшие элементы. Собственно вопрос - что посоветуете? Читал много разного, но не нашёл конкретного решения по утечкам. А в остальном должен признать, что порт завершения - реально крутая вещи ИМХО.
0
|
|
| 29.10.2015, 14:33 | |
|
Ответы с готовыми решениями:
12
Утечки памяти при использовании ExpandableListView
Определение и принцип работы порта завершения ввода и вывода |
|
Ушел с форума
|
||||
| 29.10.2015, 14:53 | ||||
|
порт приходит сообщение. Далее его может обработать один из потоков пула. сокета должен быть закрыт. Начиная с этого момента порт больше не использует данный хэндл. Все.
1
|
||||
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
|||
| 29.10.2015, 15:46 [ТС] | |||
|
Добавлено через 2 минуты Простите, не прочитал...
0
|
|||
|
Ушел с форума
|
|
| 29.10.2015, 15:47 | |
|
Я вижу здесь две совершенно разные проблемы:
1. отключение клиента (возможно, аварийное). 2. отсоединение сокетного хэндла от порта завершения. Какую вы пытаетесь решить ?
0
|
|
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
|||
| 29.10.2015, 15:53 [ТС] | |||
|
И могу ли я быть уверен, что операция завершения произойдёт всегда?
Добавлено через 1 минуту Добавлено через 3 минуты Веб-соккетные подключения - необходимо KEEPALIVED - нужно всё держать. Но важно, чтобы при любом варианте отключения клиента сервер освобождал ресурсы. Текущая задача - 1 из Ваших предположенных - Есть конечно вариант вытесняющего пула памяти для данных завершения, но если есть возможность решить вопрос иначе...
0
|
|||
|
Ушел с форума
|
||
| 29.10.2015, 15:55 | ||
|
1. Клиент-сервер, соединение установлено по TCP. Если одна из сторон закрывает
соединение, другая сторона при попытке чтения или записи получает соответствующий код ошибки (0 для graceful shutdown, -1 в остальных случаях). Если хэндл сокета ассоциирован с портом завершения, порт выдает сигнал завершения и его сможет обработать любой свободный поток из пула. Если связь между клиентом и сервером была разорвана (например, упала сеть), то такой сигнал может и не прийти, или прийти, но с большой задержкой. Здесь возможет вариант с установкой опции keepalive для сокета. Я несколько раз писал такие серверы на I/O completion ports, мне эта опция keepalive ни разу не была полезной. Это так, к слову. 2. Когда хэндл, связанный с портом завершения, закрывается (CloseHandle, например), ассоциация между ним и портом завершения тоже разрывается, а все внутренние ресурсы, на которые указывал хэндл, очищаются.
0
|
||
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
||||||
| 29.10.2015, 16:00 [ТС] | ||||||
Только что в строку 17 добавил вывод на экран текста, чтобы понимать, что возникло завершение чего-либо. При закрытии вкладки сообщение не выводится - порт завершения не запускает пул почему-то. Закрытие вкладки в браузере - наверное не аварийная ситуация? И всё же что-то не работает обработчик. Подскажите пожалуйста, уже мозг кипит. Вроде всё правильно, а не работает.
0
|
||||||
|
Ушел с форума
|
|
| 29.10.2015, 16:20 | |
|
Вставьте printf сразу после вызова (не важно, успешного или нет) GetQueuedCompletionStatus.
И еще мне по коду непонятно, зачем здесь вызывается break: ведь после закрытия соединения рабочие потоки должны продолжать работу...
0
|
|
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
||||
| 29.10.2015, 16:44 [ТС] | ||||
|
Добавлено через 1 минуту Сейчас ещё попробую вставить на не успешный вызов. Добавлено через 4 минуты Не помогло. Добавила в конец цикла вывод текста - ничего не пишет при закрытии вкладки. Добавлено через 2 минуты А должно выводиться каждый раз при вообще любом событии завершения. Чтение-запись - работает как надо и всё прекрасно, но закрытие вкладки браузера не вызывает события завершения чтения, хотя я так понял должно?
0
|
||||
|
Ушел с форума
|
||
| 29.10.2015, 16:59 | ||
|
Просто через "голые" сокеты обращаться к серверу, писать-читать, а затем делать shutdown/closesocket.
0
|
||
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
||
| 29.10.2015, 17:03 [ТС] | ||
|
0
|
||
|
Ушел с форума
|
|
| 29.10.2015, 17:06 | |
|
Да я понимаю. Но все-таки начинать нужно с главного: голый клиент + голый сервер.
И отлаживаться сперва на такой схеме, а уже потом подключать сложности в виде браузеров, прокси, разрывов сети и т.п.
1
|
|
|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
||
| 29.10.2015, 17:10 [ТС] | ||
|
0
|
||
| 29.10.2015, 17:10 | |
|
Помогаю со студенческими работами здесь
13
Чтение из COM порта, При чтении из порта зависает read() Утечки при работе с динамической памятью
ClientDataSet, Blob утечки памяти при записи в файл Избежать утечки памяти при преобразовании строки в массив символов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|