Форум: "Сети";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];
ВнизОшибка в сокетах Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c