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

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

Socket+WinXP+Закрыть группу=Error+глюк+переполнение [D6, WinXP]


cyborg ©   (2002-04-29 21:50:00) 

Вот какая штука, в винХР есть такая замечательная весчь, как распределение запущенных программ в группы, на которую нажав правой кнопкой мышки можно все прорграммы этой группы закрыть.
И вот, у меня делается чат. Серверная часть и клиентская, если запустить несколько клиентов они помещаются в панели задачь в группу, а глюк именно в том, что если закрыть эти программы вышеизложенным способом, клиенты естественно подключены к серверу, то, серевер первого клента определяет, что он отключился, у следующих получается ошибка eeDisconnect, но всё бы было чики пуки, да при этой ошибке при выключении серверного сокета, он как и положено, своими силами и одному ему ведомыми способами, видимо пытается там что то послать клиенту, наверное что его хотят по хорошему вырубить :-), вызывает ClientDisconnect и возникает следующая ошибка eeSend, и он опять пытается отключить его опять вызвав ClientDisconnect и получается замкнутый круг и как следствие переполнение стека.

А если закрывать клиенты по одному, то такой фигни не случается! Может кто знает как обойти такой глюкавый круговорот?


BAHO   (2002-05-04 05:25:00) [1]

Советую использовать компонент UDP в самый раз для чата...
А эти Client/Server Socket-ы я лично не очень понимаю...
слишком уж много в них всяких заморочек...
В UDP вооще подключатся не надо послал массив символов и усё...
но есть один косяк, мониторить остальных собеседников придется отдельно...


cyborg   (2002-04-30 14:56:00) [2]

Проблема оказалась вот в чём, при отключении клиента, в событии ClientDisconnect всем клиентам посылается сообщение что кто-то выключился:

For I:=0 to MainForm.ServerSocket1.Socket.ActiveConnections-1 do
Begin {Разослать всем имя отключившегося}
MainForm.ServerSocket1.Socket.Connections[I].SendText(_ChatToAll+_Data.Name+": "+MessageText);
End;

Зацикливание заключается видимо в том, что несколько клиентов отключаются одновременно и инфо о них в Connections[I] не успевает обновится и сокет считается подключённым.

Как обойти вот это дело? Помогите пожалуйста!


Наверх

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