Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Открытые порты! Трабл!!! [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо