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

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

Ошибка в сокетах [D5, WinXP]


Alek_1 ©   (2003-11-29 02:55:00) 

Написал чат, все работает на ура, но вот есть одна проблемка когда к серверу подключен клиент и машина клиента збойнула или просто начла перезагрузку, то сервер вылетает с ошибкой 10053 и Stack Overflow и сервер чат вырубается. Когда же клиент отключается нормально

ClientSocket1.Close;

то сервер работает дальше и никаких ошибок не выскакивает.

Как можно обработать эту ошибку? чтобы сервер не продолжал работать и дальше когда клиент отколючается "не нормально".


Alek_1   (2003-11-29 15:23:00) [1]


> у тебя не было и try..exept
>
> поэтому сервер и "вылетал"


понятно.

Digitman спасибо!!!


Digitman   (2003-11-29 15:19:00) [2]


> раньше у меня небыло этой строчки


у тебя не было и try..exept

поэтому сервер и "вылетал"


Alek_1   (2003-11-29 15:18:00) [3]


> overlay (оверлей = перекрытие) и overflow (оверфлоу = переполнение)
> - вообще-то совершенно разные сущности


сорри :)


Digitman   (2003-11-29 15:17:00) [4]


> как правильно самому обработать отключение клиента


клиент-то уже отключен ! по факту возникновения события OnClientDisconnect() !

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


Alek_1   (2003-11-29 15:16:00) [5]


> Socket.Disconnect(Socket.SocketHandle);


раньше у меня небыло этой строчки у всеравно сервер вылетал.
Было только:
ListView3.Items.Clear;
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText("#N");

Сегодня я попробовал сам так сказать закрыть сокет этой строчкой и это у меня не получилось.


Digitman   (2003-11-29 15:14:00) [6]

а-а-а ! ну ясно) ..

overlay (оверлей = перекрытие) и overflow (оверфлоу = переполнение) - вообще-то совершенно разные сущности


Alek_1   (2003-11-29 15:13:00) [7]

я вот тут заметил что если в обработчике OnClientDisconnect ничего не писать то он после ошибки в onError он сам обработоает отключение клиента как надо. Впринципе я могу так и поступить, отдать обработку при дисконекте компьютеру и все будет работать.

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


Digitman   (2003-11-29 15:11:00) [8]


> Socket.Disconnect(Socket.SocketHandle); //.Close; -тут
> происходит зацыкливание


так убери это из обработчика ! и всех делов)

закрытие соединения с последующим удалением из списка происходит как раз на строчке
ServerSocket1.Socket.Connections[i].Close

событие OnDisconnect() лишь извещает тебе о том, что соединенние уже закрыто и будет удалено из списка активных сразу же после завершения процедуры обработки этого события


> стек оверлеев


а это с чем едят ? стек - понятно, оверлеи - тоже понятно ... а вместе что это такое ?


Alek_1   (2003-11-29 14:57:00) [9]

пользуюсь ServerSOcket и ClientSocket

Stack overflow происходит из-за того что немогу правильно отключить нерабочий сокет.

Значит сначала выскакивает ошибка 10053 при ErrorEvent eeDiskonect

далее обрабатывается собитие OnClientDisconnect
И в нем неполучается правильно отключить нерабочий сокет.

Socket.Disconnect(Socket.SocketHandle); //.Close; -тут происходит зацыкливание и выпадает стек оверлеев

ListView3.Items.Clear;
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
Begin
try
ServerSocket1.Socket.Connections[i].SendText("#N")
except
ServerSocket1.Socket.Connections[i].Close;
end;
end;


Digitman   (2003-11-29 14:44:00) [10]


> Alek_1


какими компонентами пользуешься ?
приводи свой код, иначе - пустая болтовня


Alek_1   (2003-11-29 14:38:00) [11]

А как убрать соединение из списка активных?
Где про это можно прочитать более подробно?


Digitman   (2003-11-29 13:55:00) [12]


> хорошо если логика не верна то как тогда нужно поступать
> в таких ситуациях?


реализовать ВЕРНУЮ логику


> Как сервер должен обработать ошибки когда клиент подвис
> или кто-то нажал ресет ?


никак.
сервер никак не может отследить такую ситуацию до тех пор пока не вызовет один из методов приема/передачи (т.е. не инициирует процедуру приема/передачи в момент когда клиент уже "мертв").

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


Alek_1   (2003-11-29 13:51:00) [13]

хорошо если логика не верна то как тогда нужно поступать в таких ситуациях?
Как сервер должен обработать ошибки когда клиент подвис или кто-то нажал ресет ?


Digitman   (2003-11-29 13:44:00) [14]


> сразу вылетает Stack overflow и acces violation и сервер
> закрывается


значит, логика твоего серверного приложения неверна и содержит ошибки, приводящие к такому рез-ту


Alek_1   (2003-11-29 12:44:00) [15]

Когда клиент отключается "не правильно" то onDiskonect не происходит
сразу вылетает Stack overflow и acces violation и сервер закрывается


Alex21   (2003-11-29 10:41:00) [16]

Событие Ondisconnenct сервера обработай


Наверх

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