Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Нагрузка на idhttpserver приводит к ошибке   Найти похожие ветки 

 
oleg_   (2006-05-31 19:46) [0]

Если достаточно быстро сыпется множество запросов с одного лишь клиента (несколько быстрых рефрешей в браузере)
то idhttpserver  выдает ошибки eidsocketerror "Socket error # 10054"
блоки try except не спасают
Как с этим можно бороться?


 
umbra ©   (2006-05-31 20:32) [1]


> Socket error # 10054

эта ошибка означает, что когда сервер попытался ответить, то обнаружил, что соединение закрыто второй стороной (браузером). Бороться с этим надо блоками try ... except ... end и ловить исключение EIdSocketError. Затем проверить код ошибки и если он равен 10054, то закрыть соединение. Что-то вроде

try
{............................}
except
 on E: EIdSocketError do
    if E.LastError = 10054 then
       {сервер закрывает соединение}
end;


ЗЫ А какая у Вас версия Инди?


 
oleg_   (2006-05-31 20:47) [2]

Indy 8.0.25

Спасибо за справку насчет ошибки

Охват блоком защиты всего обработчика события HTTPServerCommandGet  увы ничего не дает.


 
umbra ©   (2006-06-01 11:07) [3]


> Охват блоком защиты всего обработчика события HTTPServerCommandGet
>  увы ничего не дает.

неудивительно. В HTTPServerCommandGet Вы определяете, что отвечать клиенту, но не происходит фактической отсылки данных. Не знаю, как в Инди 8, а в 10-й попытка записи происходит только в методе DoExecute, привыполнении которого и может возникнуть такая ошибка, как у Вас. В принципе, у сервера есть событие OnException, которое и предназначено для обработки ошибок, возникших при работе с сокетами. Попробуйте вставить try в обработчик этого события


 
oleg_   (2006-06-01 12:58) [4]

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


 
oleg_   (2006-06-01 13:14) [5]

ошибка появляется после выхода из HTTPServerCommandGet, а его вызов где-то в самом компоненте -(


 
umbra ©   (2006-06-01 13:35) [6]


> ошибка появляется после выхода из HTTPServerCommandGet,
> а его вызов где-то в самом компоненте -(
>

вызов его происходит в том самом DoExecute.
В общем, есть 2 варианта. первый - установить новый инди, там эта ошибка обрабатывается. Минус - возможно, ппридется править код, поскольку архитектура Инди 10 сильно отличается от Инди 9, а от 8-й, наверняка, еще сильней.
Второй - написать наследника TIdHTTPServer, в котором перекрыть метод DoExecute.


 
oleg_   (2006-06-01 17:19) [7]

Поставил Инди 9.00.10
у сервера есть события onexception onlistenexception
но они не пускаются при ошибках


 
umbra ©   (2006-06-02 11:47) [8]

вы имеете в виду, что ошибка, которую Вы описывали, осталась и когда она происходит, обработчик onexception не вызывается ?


 
oleg_   (2006-06-02 13:50) [9]

Да, именно так.

Пока копаю докуметацию по 9 инди


 
umbra ©   (2006-06-02 14:11) [10]

а можно взглянуть на код обработчика?


 
oleg_   (2006-06-02 14:22) [11]

Я поставил точки останова на первые строки обработчиков
и на них управление не переходит

код такой

procedure TfmHTTPServerMain.HTTPServerException(AThread: TIdPeerThread;
 AException: Exception);
begin
try
if AException.ClassType= EIdSocketError then
   if (AException as EIdSocketError).LastError = 10054 then
     begin
     DisplayMessage("user disconnect");
     //AThread.Terminate;
     AException.Free;
//      AThread.Terminate;// .Connection.Connected:=false;
     end;
except
DisplayMessage("HTTPServerException");
end;
end;


 
oleg_   (2006-06-02 16:32) [12]

Вот поставил 10 индю
попробую под ней найти как перехватить ошибки


 
umbra ©   (2006-06-02 19:13) [13]

у меня инди 10 и с таким OnCommandGet я могу нажимать в браузере на рефреш с любой скоростью - никаких ошибок нет.

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 AResponseInfo.ContentText := "Привет!";
end;


 
oleg_   (2006-06-02 19:34) [14]

Видимо потому что это отрабатывается очень быстро
А у меня cgi вызываются , на это уходит до секунды, за это время браузер успевает отработать refresh

А добиться такой же ошибки просто, поставив точку останова в commandget  и когда она сработает нужно нажать стоп в браузере.
Далее f9  и вот та самая ошибка отрключения удаленного пользователя

Я тоже перебрался на 10 инди и нашел в кодах что ошибка генерируется при
 LResponseInfo.WriteHeader;
в idcustomhttpserver.pas


 
oleg_   (2006-06-02 19:56) [15]

Вот нашел комментарий
   // You can add this to your exception ignore list for easier debugging.
   // However please note that sometimes it is a true error. Your program
   // will still run correctly, but the debugger will not stop on it if you
   // list it in the ignore list. But for most times its fine to put it in
   // the ignore list, it only affects your debugging.
в
TIdStackBSDBase.RaiseSocketError
Добавил туда игнрирование нужной ошибки
только вот он не перекомпилируется почемуто, видимо  потому что он же не в моем проекте, и используется dcu


 
oleg_   (2006-06-02 20:11) [16]

Да еще проблема с куками а следовательно со стандартной php-шной сессией есть
Сообщает мол
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent in ...\ttt.php on line 2

Видимо idhttpserver шлет некие свои заголовки раньше. Пробовал отловить  httpanalizer-ом момент их вывода, пока безуспешно-(


 
oleg_   (2006-06-05 11:03) [17]

Скопировал IdStackBSDBase.pas в свой проект,  вставил в нем
try
except
вокруг вызова ошибки, все вроде как заработало

теперь вопрос с куками остался



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

Форум: "Сети";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.063 c
2-1160926910
ZeroSPiRiT
2006-10-15 19:41
2006.10.29
Передача файлов по сети


6-1149207572
Валерий
2006-06-02 04:19
2006.10.29
Ошибка до перехвата исключения


2-1160628993
Serg_e
2006-10-12 08:56
2006.10.29
Как заставить работать tab MDIChild-форме?


2-1160969868
Tab
2006-10-16 07:37
2006.10.29
как перейти в следующую ячейку в StringGrid


2-1161007194
dim2001
2006-10-16 17:59
2006.10.29
stringgrid фокус ввода





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский