如果提供了绑定并使用OpenSSL,则终止时,IDE中的Delphi Indy 10 TIdHTTPServer访问冲突

时间:2014-04-12 08:23:47

标签: delphi openssl indy10

使用Indy 10(rev.5128),如果我提供绑定到TIdHTTPServer和使用OpenSSL,我在终止时会在IDE中出现访问冲突。

错误消息如下: 项目Project1.exe引发异常类EAccessViolation,并在模块'ssleay32.dll'中显示“在地址1200DBB9处访问冲突”消息。写下地址FEEEFFDA'。

下面是一个简单的测试用例。只需创建一个表单,添加用途,然后将下面的代码放在表单create中。在IDE中运行该应用程序并访问浏览器中的[https:// localhost](您将得不到任何答复),然后关闭该应用程序。 IDE中引发了访问冲突(但正常运行时不会出现异常)。当然,你需要在运行时使用openssl dll(我使用的是indy.fulgan.com网站上最新的1.0.1g)以及你自己的ssl证书文件。

uses IdHTTPServer, IdSSLOpenSSL;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  HTTPServer:TIdHTTPServer;
begin
  HTTPServer := TIdHTTPServer.Create(Self);
  with HTTPServer do
  begin
    DefaultPort := 443;

    Bindings.Clear;
    with Bindings.Add do
    begin
      IP := '127.0.0.1';
    end;

    IOHandler := TIdServerIOHandlerSSLOpenSSL.Create(nil);
    with TIdServerIOHandlerSSLOpenSSL(IOHandler) do
    begin
      SSLOptions.RootCertFile := 'localhost.cer';
      SSLOptions.CertFile := 'localhost.cer';
      SSLOptions.KeyFile := 'localhost.key';
      SSLOptions.Method := sslvTLSv1;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 0;
    end;

    Active := True;
  end;
end;

如果未提供绑定,则不会显示IDE异常。在IDE中运行时不断收到错误是非常麻烦的。我只需要绑定到localhost并且不想绑定到所有地址。

更新

我已经跟踪并添加了OnException和OnListenerException事件处理程序。我终止时在OnException事件中收到EAccessViolation异常,并在我的帖子中显示相同的错误消息。在到达OnException事件处理程序的第一个行断点之前,IDE中出现异常。在断点期间,调用堆栈如下:

TForm1.HTTPServerOnException($1892CA0,$18921FC) 
:0046fa45 TIdCustomTCPServer.DoException + $19 
:0041b6bf ThreadProc + $37 
:0040400e ThreadWrapper + $2A 
:74743daa KERNEL32.BaseThreadInitThunk + 0xe 
:76ef11c1 ntdll.RtlDispatchAPC + 0xcf 
:76ef1197 ntdll.RtlDispatchAPC + 0xa5

我尝试使用较旧的1.0.1f,0.9.8y和0.9.8x OpenSSL DLL,但我仍然有相同的例外。

2 个答案:

答案 0 :(得分:0)

如果您不创建任何绑定,则TIdHTTPServer在内部创建自己的绑定,一个用于IPv4,一个用于IPv6。

由于在调试器外部运行时没有看到异常,因此很可能在运行时被OpenSSL内部或TIdHTTPServer或甚至RTL捕获。将事件处理程序分配给TIdHTTPServer.OnExceptionTIdHTTPServer.OnListenExceptionTApplication(Events).OnException事件,并查看是否在其中任何事件中报告了异常。

如果您仍然遇到异常,请使用调试器中的调用堆栈更新您的问题,显示导致异常的各种函数调用。

最后,如果您使用任何其他版本的OpenSSL,您是否有相同的例外?

答案 1 :(得分:0)

我在使用中添加了IdGlobal,并修改了绑定以使IPv6 localhost地址也不再出现。

Bindings.Clear;
with Bindings.Add do
begin
  IP := '127.0.0.1';
  IPVersion := Id_IPv4;
end;
with Bindings.Add do
begin
  IP := '::1';
  IPVersion := Id_IPv6;
end;

虽然仍然很奇怪。