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

Вниз

Нагрузка на 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.051 c
15-1159955099
IMHO
2006-10-04 13:44
2006.10.29
3gp


15-1160137869
oldman
2006-10-06 16:31
2006.10.29
Нехватка виртуальной памяти...


6-1149835557
novill
2006-06-09 10:45
2006.10.29
Распознать имя отправителя письма ?


3-1157462650
_Le_
2006-09-05 17:24
2006.10.29
BDS 2006, QReport


2-1160864503
z1bob
2006-10-15 02:21
2006.10.29
Вопрос от новичка. Про алгоритм и большой массив.