Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

Вопрос об OnDisconnect в Tclient/serversocket   Найти похожие ветки 

 
SergP ©   (2003-08-20 01:31) [0]

Когда происходят события OnDisconnect и OnclientDisconnect в TClientSocket и TServerSocket? Имеется ввиду после их дисконекта или до?


 
Hyboid ©   (2003-08-20 05:12) [1]

В хелпе пишут так:

OnDisconnect occurs after the value of the Active property is set to False, but before the actual connection is closed.

Т.е. после того как свойство Action установлено в False, но перед тем как действительное соединение закрыто (Это дословно)


 
SergP ©   (2003-08-20 09:34) [2]


> Т.е. после того как свойство Action установлено в False,
> но перед тем как действительное соединение закрыто (Это
> дословно)


Значит все-таки если уже работает процедура Ondisconnect, и в этот момент производится повторная попытка закрыть соединение, то событие OnDisconnect может многократно вызываться сокетом перед тем как соединение закроется ?

Вопрос задаю из-за того что подозреваю что у меня от этого зацикливается прога. Т.е. имеется 2 сокета. В OnDisconnect (клиентсокет) одного я закрываю соединение в другом. И в OnClientDisconnect (серверсокет) я закрываю соединение в первом.


 
Polevi ©   (2003-08-20 09:44) [3]

почитай вот это, затем глянь scktcomp.pas и многие вопросы отпадут

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winso ck/winsock/wsaasyncselect_2.asp


 
Polevi ©   (2003-08-20 09:45) [4]

ЗЫ
пробел в ссылке удали


 
Digitman ©   (2003-08-20 10:05) [5]


> подозреваю что у меня от этого зацикливается прога. Т.е.
> имеется 2 сокета. В OnDisconnect (клиентсокет) одного я
> закрываю соединение в другом.


разумеется, ты входишь в бесконечную рекурсию.


 
SergP ©   (2003-08-20 13:25) [6]

А кто-нибудь может подсказать ссылки на рускоязычные ресурсы с описанием работы с сокетами на Дельфи? Например статьи и пр.
Я находил несколько статей на эту тему, в частности и на этом сайте, но они оказались несколько поверхностными. А хотелось бы чего-то более глубокого и детального...


 
Digitman ©   (2003-08-20 14:05) [7]


> хотелось бы чего-то более глубокого и детального...


детальней исх.текста этих компонентов в модуле scktcomp.pas вряд ли сыщешь) ... Изучай их ! И да откроются тебе "таинства" ...


 
nikkie ©   (2003-08-20 14:16) [8]

>SergP
>В OnDisconnect (клиентсокет) одного я закрываю соединение в другом. И в OnClientDisconnect (серверсокет) я закрываю соединение в первом.


тебе вроде недавно приводили код TCustomWinSocket.Destroy. по нему видно, что если ты сделаешь Free клиентскому сокету, то Disconnect вызовется автоматически, причем OnDisconnect вызван не будет. и рекурсии ты избежишь.


 
SergP ©   (2003-08-20 14:54) [9]


> тебе вроде недавно приводили код TCustomWinSocket.Destroy.
> по нему видно, что если ты сделаешь Free клиентскому сокету,
> то Disconnect вызовется автоматически, причем OnDisconnect
> вызван не будет. и рекурсии ты избежишь


Приводили. Но признаться честно я тогда не понял как мне уничтожить объект. Поэтому сейчас я в проге не уничтожаю дисконекченый клиентсокеты, а использую их снова при необходимости, чтобы не создавать новых если есть свободные...


 
SergP ©   (2003-08-20 14:59) [10]

А насчет того чтобы избежать этой бесконечной реккурсии, решил применить переменную (вернее масив) выполняющий роль типа флагов, где я сохраняю информацию о том вызывал ли я метод close у данного сокета или нет. Если вызывал - то второй раз уже этого не делаю. Пока зработает. Но код от этого выглядит по-ламерски...


 
Digitman ©   (2003-08-20 15:09) [11]

зачем все это ?
перед тем как вызвать Socket.Close, сбрось на время его обработчик OnSocketEvent в nil, сохранив в лок.переменной предыд.значение, а следом за Socket.Close восстанови !
Всех делов)


 
nikkie ©   (2003-08-20 15:31) [12]

имхо, расходы на создание/уничтожение объекта класса минимальны, если количество сокетов будет такое, что это будет ощутимым по времени, то твой прокси завалится по другим причинам. так что особого смысла не делать Free я не вижу.

но если хочешь так делать, то Digitman дело говорит - можно скинуть обработчик, а потом восстановить. локальная переменная может и не нужна, ведь у тебя наверняка обработчик OnDisconnect у всех один и тот же.


 
Digitman ©   (2003-08-20 15:44) [13]


> nikkie


то что один обработчик - это навряд ли.
минимум - один OnClientDisconnect и один OnDisconnect

к тому же я веду речь не о On[Client]Disconnect, а о OnSocketEvent. Ведь в обработчике On[Client]Disconnect вторым параметром идет как раз TCustomWinSocket, OnSocketEvent-обработчик события которого компоненты ServerSocket и ClientSocket автоматически устанавливают при инициализации на свой внутр.диспетчер.

Получив в On[Client]Disconnect 2-й параметр, берем его св-во Data (у автора в случае прокси оно кажет - в зависимости от компонента - либо на соотв.сервеное соединение либо на кл.часть), приводим его к TCustomWinSocket и дальше - как описано выше


 
nikkie ©   (2003-08-20 16:23) [14]

>то что один обработчик - это навряд ли.
имел я в виду, что вероятно динамически создаются клиентские сокеты и им прописываются одни и те же обработчики. таким образом, OnDisconnect один и тот же.

>к тому же я веду речь не о On[Client]Disconnect, а о OnSocketEvent
виноват, был невнимателен :)
хорошо, значит мое предложение - альтернативное. сбрасывать OnDisconnect.


 
SergP ©   (2003-08-20 23:24) [15]

Воспользовался советом Digitman"a.

Но есть еще вопросы по сокетам:
1.Если в сокете вызывает обработчик OnError, происходит ли при этом его дисконект и вызов OnDiconnect? Если да - что вызывается вначале?

2.Можно ли Tclientsocket в уничтожать (free) в обработчике его собственного события?


 
Digitman ©   (2003-08-21 09:55) [16]

1. Нет, не происходит.
2. Нельзя


 
SergP ©   (2003-08-21 14:32) [17]


> nikkie © (20.08.03 15:31) [12]
> так что особого смысла не делать Free я не вижу.


В таком случае подскажи как сделать Tclientsocket"у Free если он захотел дисконектиться.
Digitman сказал что нельзя уничтожать TClientsocket в обработчике его же события... Неужели придется делать процедуру, которая бы срабатывала по таймеру и время от времени уничтожала бы ненужные Tclientsocket"ы?


 
Polevi ©   (2003-08-21 14:57) [18]

>SergP © (21.08.03 14:32) [17]
асинхронная развязка, например через PostMessage


 
Digitman ©   (2003-08-21 15:21) [19]


> нельзя уничтожать TClientsocket в обработчике его же события


когда возникло событие TClientsocket.OnDisconnect(), это значит, что в обработчике TServerSocket.OnClientDisconnect был вызван TCustomWinSocket(Socket.Data).Close

а зачем, собственно ?
можно же сразу

TCustomWinSocket(Socket.Data).Free
Socket.Data := nil

это значит, что клиент, выходящий в сеть через прокси, отключился по своей инициативе
тогда и событие TClientsocket.OnDisconnect() не возникнет, ибо инициатива дисконнекта исходит от клиента прокси

возникать же оно должно (и будет) , когда инициатива дисконнекта исходит от удаленного узла, с которым клиент прокси установил соединение через цепочку ServerSocket.Socket.Connections[..] + ClientSocket.Socket ...

как только удаленный узел разорвал соединение, у соответствующего ClientSocket возникнет событие OnDisconnect(),
в обработчике которого следует выполнить

TCustomWinSocket(Socket.Data).Close,

где

Socket.Data - это соотв-щий ServerSocket.Socket.Connections[..]


 
SergP ©   (2003-08-21 19:22) [20]

Если как Вы говорите инициатива дисконекта происходит от клиента то с этим у меня проблем нет. Уничтожаю TClientSocket в обработчике событий TServerSocket"а

Но в случае инициативы дисконекта со стороны сервера, к которому конектится TClientSocket - у меня проблемы...

> возникать же оно должно (и будет) , когда инициатива дисконнекта
> исходит от удаленного узла, с которым клиент прокси установил
> соединение через цепочку ServerSocket.Socket.Connections[..]
> + ClientSocket.Socket ...
>
> как только удаленный узел разорвал соединение, у соответствующего
> ClientSocket возникнет событие OnDisconnect(),
> в обработчике которого следует выполнить
>
> TCustomWinSocket(Socket.Data).Close,
>
> где
>
> Socket.Data - это соотв-щий ServerSocket.Socket.Connections[..]


Если TserverSocket вызовет OnDisconnect
а в нем я буду закрывать соединение TServersocket"a, который в свою очередь при этом вызовет свой OnclientDisconnect
в котором я буду уничтожать TClientSocket
то я в таком случае получится что обработчик второго запуститься в то время пока еще не отработал обработчик первого. и free для TClientSocket я буду делать в то время пока не отработал его же обработчик событий.


> Polevi © (21.08.03 14:57) [18]
> >SergP © (21.08.03 14:32) [17]
> асинхронная развязка, например через PostMessage


А пример можете привести?



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
1-51264
COSINUS
2003-10-07 00:21
2003.10.16
StringGrid.ColWidth


3-51074
AlexA
2003-09-24 16:37
2003.10.16
таблица DBF. Ошибка - Invalid index descriptor.


14-51412
Nikolay M.
2003-09-26 12:53
2003.10.16
Простая арифметика :)


1-51207
leonidus
2003-10-03 09:51
2003.10.16
Компоненты в стиле XP


1-51331
Chlavik
2003-09-30 17:06
2003.10.16
TextFile и Tstrings.LoadFromFile