Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.014 c
14-51462
gn
2003-09-30 10:10
2003.10.16
предложение к админам а почему бы irc не поднять


14-51469
Knight
2003-09-27 22:21
2003.10.16
Безопастность в PHP...


3-51106
highlander
2003-09-23 11:17
2003.10.16
Использование ADO в Delphi 5.0


1-51299
wHammer
2003-10-06 14:35
2003.10.16
Масштабирование в TImage


14-51501
Омлет
2003-09-28 00:33
2003.10.16
Именинники 28 сентября!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский