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

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

Проблема с разрывом socket соединения [D5, D6, D7, Win2k]


Страницы:   1 2 3

Furyous ©   (2004-06-23 08:10:00) 

Такая проблема: если в чате(ClientSocket) у клиента завершить процесс, то сервак выдаёт ошибку сокета и падает. Нужно как-то закрывать соединение с таким клиентом, но ничего не получается.


McZim   (2004-06-28 11:18:00) [1]

А что ваще у тебя сервак делает и как выглядет клиент


False_Delirium   (2004-06-28 11:15:00) [2]

Rouse_ То, что написал я вообще никак не относится к грамотному программированию, а было сориентировано на " мне нужно к завтра"
Что же ты постишь, когда тема уже не актуальна и молчал со своими советами когда человек спрашивал в чём дело?

Verg :) ты прав, написал какую-то чушь.:)

2Digitman Палочка тяжеловата.:)


Rouse_   (2004-06-26 19:21:00) [3]

К слову "Гонево"...

> Чтобы ты себе не усложнял задачу по надлежащей обработке
> поведения сервера при падении клиента, установи в "OnSocketError"
> то, что написано выше. И переодически посылай 1 контрольный
> символ
, который никак не обрабатывается клиентом.


Это мы называем грамотный подход? Нет уж.. увольте...


Verg   (2004-06-25 23:14:00) [4]


> [44] False_Delirium ©   (25.06.04 15:18)


Есть и у тебя "гонево"....


> Обязательно введи контрольный буфер размера ожидаемых сообщений.
>
> После того, как покажешь свой чат - удали его безвозвратно
> и начни с начала. Например - устройство протокола, далее
> исходные коды тех компонентов, которыми ты польуешься.


Ты это вообще, что ты хотел сказать-то?

Пробовал это вслух произнести? :)))
Я лично за водкой решил пойти после таких "откровений" :))


Digitman   (2004-06-25 17:04:00) [5]


> False_Delirium ©   (25.06.04 15:18) [44]



> отдохнуть


с удовольствием

держи эстафетную палочку ?


> позволяешь себе небрежности в общении


не спорю ... когда тема скатывается до понимания того , что LMD, выдержки порой, увы, не хватает


False_Delirium   (2004-06-25 15:18:00) [6]

Люди грамотные в данной области с тобой разговаривают, а ты не пользуешься моментом.:)

 При "OnSocketError" и "OnClientDisconnect" ты в первую очередь должен прекратить все операции с "клиентами", для которых был вызван обработчик.

 В "OnSocketError" вставь как минимум
errorcode = 0 ; Socket.Close ;
это позволит тебе избавится от пугающих окошек с уведомлениями.

Одна из составляющий "педалей" находится в спецификации TCP/IP.

Блин, всё-равно Socket Error и вылетевший юзер остаётся в юзер листе на серваке. Исключения воткнул везде, где надо, а не выходит =(

Если клиент завершил работу аварийно или в ином роде некорректно, то следовательно он не смог передать серверной части запрос на завершений и обменяться подтверждающими сегментами. Поэтому твой сервер не определяет, что клиент "мёртв" до следующей попытки отправить данные клиенту.

Чтобы ты себе не усложнял задачу по надлежащей обработке поведения сервера при падении клиента, установи в "OnSocketError" то, что написано выше. И переодически посылай 1 контрольный символ, который никак не обрабатывается клиентом.

Обязательно введи контрольный буфер размера ожидаемых сообщений.

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

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


Digitman   (2004-06-25 08:29:00) [7]


> Verg ©   (24.06.04 17:40) [39]


про "педали" - благодарю за поддержку


> Владимир   (24.06.04 17:43) [40]
> Надо выставить errorcode = 0 иначе ексепт.


чушь

никакого "ексепта" без errorcode = 0 - просто будет выведено окно с диагностикой отказа


> APXi   (24.06.04 19:36) [41]


> запускайте его НЕ из делфи, а клиента запустите из дельфи


при чем здесь "из делфи" или "НЕ из делфи" ?


Ne0z   (2004-06-24 20:37:00) [8]

APXiну Verg же все написал: нельзя закрывать сервак до выхода из обработчика OnClientDisconnect, так что посылаешь в этом обработчике свое сообщение  PostMessage(Handle, WM_DISCONNECT, 0, 0); в обработчике котрого и закрывай сервак...


APXi   (2004-06-24 19:36:00) [9]

У меня тоже такая проблема была и есть.
Кто хочет попробовать сделайте простейший сервер и клиента, откомпильте сервер и запускайте его НЕ из делфи, а клиента запустите из дельфи, соеденитесь, а потом просто прервите работу клиента (Run/Program Reset) ошибочка вылетит на сервере.


Владимир   (2004-06-24 17:43:00) [10]

Надо выставить errorcode = 0 иначе ексепт.

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
errorcode := 0;
end;


Verg   (2004-06-24 17:40:00) [11]


> 25] Furyous ©   (24.06.04 14:46)
> Я ваще не знаю как юзать postmessage. Там какие-то страные
> параметры, хз чё писать там.


Странный ты, однако ващще....
Эта, программирование, говоришь? А может лутчче чё-нить другое, пока не поздно? ;)

const
 WM_DISCONNECT = WM_USER + 1;

type
 TForm1 = class(TForm)
 .............
 procedure OnDisconnect(var Msg : TMessage); message WM_DISCONNECT;
 .....
 end;

...............

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
(*хз - не хз, а где педали-то находятся надо бы знать прежде, чем за руль
* садиться
*)
  PostMessage(Handle, WM_DISCONNECT, 0, 0);
end;

procedure TForm1.OnDisconnect(var Msg : TMessage);
var i: Integer;
begin
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
    ServerSocket1.Socket.Connections[i].SendText('Хз кто, но кто-то отключился вапче. ');
end;


Furyous   (2004-06-24 16:07:00) [12]

ок


Digitman   (2004-06-24 15:56:00) [13]


> Furyous ©   (24.06.04 15:52) [36]


разговор окончен


Furyous   (2004-06-24 15:52:00) [14]

А тебя сюда никто не тянет. И если у меня не получается - это не значит что я лентяй.


Digitman   (2004-06-24 15:49:00) [15]


> Furyous ©   (24.06.04 15:43) [34]


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


Furyous   (2004-06-24 15:43:00) [16]

Во во, а лучше б помог =)


Digitman   (2004-06-24 15:33:00) [17]


> времени в обрез, завтра надо готовый чат с передачей файла
> сдать


это твои проблемы, насчет "завтра"

я тоже не имею кучу времени разглагольствовать с тобой о превратностях жизни


Furyous   (2004-06-24 15:30:00) [18]

я понимаю что надо было сразу смотреть, но я не знал что там это есть.


Furyous   (2004-06-24 15:26:00) [19]

Да ладно, у меня MSDN 2001(на 3сд) и Visual Studio + MSDN 2003(на 5сд), а вот времени в обрез, завтра надо готовый чат с передачей файла сдать, но тут уже не до передачи файла, а хотя бы баг с дисконнектом убрать... блин


Digitman   (2004-06-24 15:12:00) [20]


> Furyous ©   (24.06.04 15:08) [29]


не беда
на то есть оригинал - msdn.microsoft.com


Страницы:   1 2 3

Наверх

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