![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Открытые порты! Трабл!!! [D7, Win95/98, WinME, NT4, Win2k, WinXP]
csr © (2004-02-19 15:52:00)Есть многопоточная программа, работает на TidHTTP. После вызова TerminateThread винапи, сетевая активность прекращается, потоки умирают, но файервол показывает что несколько портов (HTTP) остаются открытыми. И были открыты они моей прогой. Вопрос: как закрыть открытые порты? Очень важно! Спсибо!!!
Rouse_ (2004-02-20 19:39:00) [1]Ну тебе ж дали совет. Делай closesocket а затем прибивай поток.
csr (2004-02-20 19:31:00) [2]В док-ции это явно не написано... Дак что ж делать-то... Юзать Terminate метод класса потока - не могу, т.к. долго потоки убиваются, если их больше 100 ... А этой АПИ ф-цией - все быстро и без ошибок...
Verg (2004-02-20 16:18:00) [3]Да, кроме того, сокеты (любые, включая list-отвые), как "собственность" процессаа вовсе не потока, остаются жить как ни в чем не бывало. Отсюда и "незакрытые" порты.
Digitman (2004-02-20 16:07:00) [4]ты станд.хэлп к этой ф-ции вообще-то читал ?
Digitman (2004-02-20 16:05:00) [5]
> Дак ведь насколько я знаю, при вызове TerminateThread WinApi,
> я принудительно вызываю OnTerminate событие для текущего
> потока
ох как ошибаешься !!
никакие ни OnTerminate ни прочие ф-ции/методы не вызываются - поток просто скоропостижно и покорно умирает по твоей же команде
csr (2004-02-20 15:57:00) [6]Дак ведь насколько я знаю, при вызове TerminateThread WinApi, я принудительно вызываю OnTerminate событие для текущего потока.... А вот это событие я ловлю и все занятые ресурсы освобождаю... Типа убиваю экземпляр TidHTTP и проч... ДАк в чем же дело?
Digitman (2004-02-20 15:50:00) [7]
> Verg © (19.02.04 19:05) [4]
согласен.
но это надо заранее предусмотреть ... в виде каких-то глобальных для всех заинтересованных потоков структур данных, хранящих инф-цию об открытых гнездах и пр.
Verg (2004-02-19 19:05:00) [8]
> [2] Digitman © (19.02.04 17:16)
> рискну "потелепатить")
>
> автор стартует поток и пытается в его контексте запросить
> гипертекст упомянутыми (блокирующими !) ср-вами ..
>
> не дождавшись по каким-то причинам исполнения запроса (мало
> ли оных м.б.), автор ничтоже сумняшеся "лупит" потоку "по
> мозгам" вызовом TerminateThread, ибо при блокир.вызове иных
> способов "укротить" трэд явно нет...
Строго говоря - есть способ. И "Индейцы" им пользуются.
Давай так, один поток вошел в нирвану по поводу, например, connect(s,...
Зато другой в это время может сделать closesocket(s).
На что тот, который не этот (записки кота плинтуса :))) немедля очнется от connect-а с причиной WSAENOTSOCK.
Digitman (2004-02-19 17:18:00) [9]
> несколько портов (HTTP) остаются открытыми. И были открыты
> они моей прогой
и в этом никакого нонсенса нет - ты, "долбанув" по потоку TerminateThread'ом (хоть и грубо, но иначе не назовешь), потерял занятые им ресурсы !
"Уж сколько раз твердили миру .." (С)
Digitman (2004-02-19 17:16:00) [10]рискну "потелепатить")
автор стартует поток и пытается в его контексте запросить гипертекст упомянутыми (блокирующими !) ср-вами ..
не дождавшись по каким-то причинам исполнения запроса (мало ли оных м.б.), автор ничтоже сумняшеся "лупит" потоку "по мозгам" вызовом TerminateThread, ибо при блокир.вызове иных способов "укротить" трэд явно нет ...
так ?
Verg (2004-02-19 16:28:00) [11]
> Вопрос: как закрыть открытые порты?
1. Не открывать их
2. Не использовать TerminateThread
А дополнительные мои соображения по этому вопросу можно почитат здесь:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1077183962&n=4