![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в сокетах [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 сервера обработай