Форум: "Сети";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
ВнизВопрос об 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c