Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
6-2266
UPR
2003-11-27 02:50
2004.02.02
Как в своем WebBrowser e отключить показ рисунков


1-2080
Андрей Сенченко
2004-01-18 13:51
2004.02.02
Файл открыт приложением DOS


4-2408
Вадим
2003-11-25 17:33
2004.02.02
Щелчек правой кнопкой по кнопкам в заголовке окна


4-2429
Ascan
2003-11-24 14:48
2004.02.02
Perform(EM_CANPASTE, 0, 0) в TMemo


1-2136
msgipss
2004-01-18 17:48
2004.02.02
Добавить архив в ресурсы программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский