Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.02;
Скачать: CL | DM;

Вниз

Ошибка в сокетах   Найти похожие ветки 

 
Alek_1   (2003-11-29 02:55) [0]

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

ClientSocket1.Close;

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

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


 
Alex21 ©   (2003-11-29 10:41) [1]

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


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

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


 
Digitman ©   (2003-11-29 13:44) [3]


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


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


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

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


 
Digitman ©   (2003-11-29 13:55) [5]


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


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


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


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

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


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

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


 
Digitman ©   (2003-11-29 14:44) [7]


> Alek_1


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


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

пользуюсь 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 15:11) [9]


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


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

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

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


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


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


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

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

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


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

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

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


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


> 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:17) [13]


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


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

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


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


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


сорри :)


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


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


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

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


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


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


понятно.

Digitman спасибо!!!



Страницы: 1 вся ветка

Текущий архив: 2004.02.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
3-2046
dalamar
2004-01-04 00:29
2004.02.02
Как получить количество таблиц в БД Access через ADO подключение?


1-2208
DmitryA
2004-01-20 17:12
2004.02.02
ScrollBar в ComboBox


3-1962
NAD_ST
2004-01-09 14:42
2004.02.02
Хранение баз данных


1-2088
iosafat
2004-01-20 10:03
2004.02.02
Поиск слов в режиме WholeWord


6-2262
crazycyborg
2003-11-24 11:41
2004.02.02
Получение имени пользователя по имени компьютера