![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нагрузка на idhttpserver приводит к ошибке [D6, Win2k]
oleg_ © (2006-05-31 19:46:00)Если достаточно быстро сыпется множество запросов с одного лишь клиента (несколько быстрых рефрешей в браузере)
то idhttpserver выдает ошибки eidsocketerror "Socket error # 10054"
блоки try except не спасают
Как с этим можно бороться?
oleg_ (2006-06-05 11:03:00) [1]Скопировал IdStackBSDBase.pas в свой проект, вставил в нем
try
except
вокруг вызова ошибки, все вроде как заработало
теперь вопрос с куками остался
oleg_ (2006-06-02 20:11:00) [2]Да еще проблема с куками а следовательно со стандартной 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-02 19:56:00) [3]Вот нашел комментарий
// 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 19:34:00) [4]Видимо потому что это отрабатывается очень быстро
А у меня cgi вызываются , на это уходит до секунды, за это время браузер успевает отработать refresh
А добиться такой же ошибки просто, поставив точку останова в commandget и когда она сработает нужно нажать стоп в браузере.
Далее f9 и вот та самая ошибка отрключения удаленного пользователя
Я тоже перебрался на 10 инди и нашел в кодах что ошибка генерируется при
LResponseInfo.WriteHeader;
в idcustomhttpserver.pas
umbra (2006-06-02 19:13:00) [5]у меня инди 10 и с таким
OnCommandGetя могу нажимать в браузере на рефреш с любой скоростью - никаких ошибок нет.
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
AResponseInfo.ContentText := 'Привет!';
end;
oleg_ (2006-06-02 16:32:00) [6]Вот поставил 10 индю
попробую под ней найти как перехватить ошибки
oleg_ (2006-06-02 14:22:00) [7]Я поставил точки останова на первые строки обработчиков
и на них управление не переходит
код такой
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;
umbra (2006-06-02 14:11:00) [8]а можно взглянуть на код обработчика?
oleg_ (2006-06-02 13:50:00) [9]Да, именно так.
Пока копаю докуметацию по 9 инди
umbra (2006-06-02 11:47:00) [10]вы имеете в виду, что ошибка, которую Вы описывали, осталась и когда она происходит, обработчик
onexceptionне вызывается ?
oleg_ (2006-06-01 17:19:00) [11]Поставил Инди 9.00.10
у сервера есть события onexception onlistenexception
но они не пускаются при ошибках
umbra (2006-06-01 13:35:00) [12]
> ошибка появляется после выхода из HTTPServerCommandGet,
> а его вызов где-то в самом компоненте -(
>
вызов его происходит в том самомDoExecute.
В общем, есть 2 варианта. первый - установить новый инди, там эта ошибка обрабатывается. Минус - возможно, ппридется править код, поскольку архитектура Инди 10 сильно отличается от Инди 9, а от 8-й, наверняка, еще сильней.
Второй - написать наследникаTIdHTTPServer, в котором перекрыть методDoExecute.
oleg_ (2006-06-01 13:14:00) [13]ошибка появляется после выхода из HTTPServerCommandGet, а его вызов где-то в самом компоненте -(
oleg_ (2006-06-01 12:58:00) [14]OnException у моего сервера нету, а есть только у потока AThread
OnException у AThread и у application не отлавливают эту ошибку
А DoExecute нигде мной и не вызывается, он же вызывается автоматически при поступлении нового запроса.
umbra (2006-06-01 11:07:00) [15]
> Охват блоком защиты всего обработчика события HTTPServerCommandGet
> увы ничего не дает.
неудивительно. ВHTTPServerCommandGetВы определяете, что отвечать клиенту, но не происходит фактической отсылки данных. Не знаю, как в Инди 8, а в 10-й попытка записи происходит только в методеDoExecute, привыполнении которого и может возникнуть такая ошибка, как у Вас. В принципе, у сервера есть событиеOnException, которое и предназначено для обработки ошибок, возникших при работе с сокетами. Попробуйте вставитьtryв обработчик этого события
oleg_ (2006-05-31 20:47:00) [16]Indy 8.0.25
Спасибо за справку насчет ошибки
Охват блоком защиты всего обработчика события HTTPServerCommandGet увы ничего не дает.
umbra (2006-05-31 20:32:00) [17]
> Socket error # 10054
эта ошибка означает, что когда сервер попытался ответить, то обнаружил, что соединение закрыто второй стороной (браузером). Бороться с этим надо блокамиtry ... except ... endи ловить исключениеEIdSocketError. Затем проверить код ошибки и если он равен 10054, то закрыть соединение. Что-то вроде
try
{............................}
except
on E: EIdSocketError do
if E.LastError = 10054 then
{сервер закрывает соединение}
end;
ЗЫ А какая у Вас версия Инди?