Форум: "Сети";
Текущий архив: 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