|
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
|
|
Утечки при использовании порта завершения и соккетов29.10.2015, 14:33. Показов 1149. Ответов 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 утечки памяти при записи в файл Избежать утечки памяти при преобразовании строки в массив символов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|