Delphi 2010 - Wininet не хватает ручек - PullRequest
6 голосов
/ 04 августа 2011

У меня есть приложение, которое интенсивно использует функции Wininet для получения данных из Интернета.Иногда я получаю очень странные сообщения об ошибках, связанных с дескриптором:

Internal error in ConnectToHost when trying to create a session 
ERROR_INTERNET_OUT_OF_HANDLES: No more handles could be generated at this time. Wininet error code = 12001;

Когда это произошло, я заметил, что в моем приложении создано более 5000 дескрипторов.Я запустил профиль ресурса и обнаружил, что некоторые дескрипторы, созданные wininet, не освобождаются.

Итак, я создал небольшое приложение для воспроизведения проблемы.Код прост и ничего не делает, только выделяет некоторые wininet дескрипторы и затем освобождает их.Вот код:

procedure request(const AUrl : AnsiString);
var
  sMethod     : AnsiString;
  pSession    : HINTERNET;
  pConnection : HINTERNET;
  pRequest    : HINTERNET;
  port        : Integer;
  flags       : DWord;
begin
  pSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(pSession) then
  try
    Port := INTERNET_DEFAULT_HTTP_PORT;
    pConnection := InternetConnectA(pSession, PAnsiChar(AUrl), port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    if Assigned(pConnection) then
      try
        sMethod := 'GET';
        flags := INTERNET_SERVICE_HTTP;
        pRequest := HTTPOpenRequestA(pConnection, PAnsiChar(sMethod), PAnsiChar(AUrl), nil, nil, nil, flags, 0);
        try
          if Assigned(pRequest) then
            ShowMessage('ok');
        finally
          InternetCloseHandle(pRequest);
        end;
      finally
        InternetCloseHandle(pConnection);
      end;
  finally
    InternetCloseHandle(pSession);
  end;
end;

При запуске этого примера на моем профилировщике я получаю те же проблемы, связанные с обработкой.

Я думаю, что InternetCloseHandle не освобождает дескриптор, как это должно быть, потому что мой профиль ресурса говорит мне, что у меня есть 3 живых хэндла, когда я закрываю приложение.Вот те ручки, которые не освобождаются:

pRequest
pConnection
pSession

Кто-нибудь знает, как от этого избавиться?

РЕДАКТИРОВАТЬ

ФункцияInternetCloseHandle работает нормально, возвращаемое значение true.

РЕДАКТИРОВАТЬ

Я много искал в интернете, но не смог найтиКто-нибудь жаловался на это.Но это происходит.Я хотел бы знать, воспроизводил ли кто-нибудь проблему или это только я.

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Оказалось, проблема AQtime. Я загрузил другой профилировщик, и я также взглянул на диспетчер задач, и кажется, что дескрипторы выпускаются Но я все еще иногда получаю ошибку no more handles и не знаю почему. Но я открою другой вопрос, так как этот был просто для того, чтобы увидеть, почему эти ручки не были выпущены.

Спасибо за всю помощь, которую я получил.

0 голосов
/ 04 августа 2011

Протокол Http имеет некоторые ограничения, и Wininet использует их. Проверка на WinInet ограничивает количество подключений к серверу:

WinInet ограничивает количество подключений к одному серверу HTTP 1.0 до четырех одновременных подключений. Соединения с одним сервером HTTP 1.1 ограничены двумя одновременными соединениями. Спецификация HTTP 1.1 (RFC2616) предписывает ограничение двух соединений. Ограничение на четыре соединения для HTTP 1.0 является обязательным ограничением, которое совпадает со стандартом, который используется рядом популярных веб-браузеров.

Возможно, вам следует подождать, пока соединения не будут закрыты, прежде чем пытаться установить новое соединение

...