【发布时间】:2013-03-12 13:49:43
【问题描述】:
我正在使用 Indy 10 Http Client(最新的 SVN 版本)和 SSL 处理程序(Delphi 7)来获取 https://www.webtide.com/choose/jetty.jsp 网站的内容。
它在 Windows 7 x64(在两个系统上测试)上运行良好,但在 WindowsXP x86(在 3 个系统上测试)上,测试应用程序只是挂在 TIdHTTP.Get() 上而没有恢复的可能性(意味着即使在工作程序/线程不起作用!)。测试应用无法恢复,必须使用任务管理器关闭。
SSL 库(32 位 x86!)来自这里:http://slproweb.com/products/Win32OpenSSL.html 但我尝试了来自不同网站的 5 个其他版本,结果相同。
这是一个包含源代码、编译后的可执行文件和 SSL 库的 zip 包:
https://www.dropbox.com/s/pd5soxon0qbnnl0/IndyTest.zip
这里是源代码(表单有一个按钮和两个备忘录):
procedure TForm1.Button1Click(Sender: TObject);
var IdHTTP1: TIdHTTP;
sl : TStringList;
SSL1: TIdSSLIOHandlerSocketOpenSSL;
begin
try
try
IdHTTP1 := TIdHTTP.Create(nil);
sl := TStringList.Create;
SSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL1.SSLOptions.Method := sslvSSLv23;
with IdHTTP1 do
begin
ConnectTimeout := 10 * 1000;
ReadTimeout := 10 * 1000;
IOHandler := SSL1;
Request.UserAgent := 'Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)';
Memo2.Text := 'connecting...';
Application.ProcessMessages;
Memo1.Text := Get('https://www.webtide.com/choose/jetty.jsp');
Memo1.Lines.Add ('response: '+ResponseText);
Memo2.Text := 'connected or timeout...';
end;
except
On e: Exception do
Memo2.Text := 'Exception: '+e.Message;
end;
finally
IdHTTP1.Free;
SSL1.Free;
sl.Free;
end;
end;
为什么它在 WindowsXP 上崩溃/挂起?
【问题讨论】:
-
你有什么问题?
-
为什么它在 WindowsXP 上崩溃/挂起?
-
你就不能问问调试器为什么挂了?暂停程序,调试器会告诉你它在哪里等待。您可以使用此代码连接到任何其他站点,还是仅此特定代码使您的程序挂起?
-
调试 indy 非常困难,因为当你以慢动作连接时会发生奇怪的事情。如果我暂停代码并使用 F8 Delphi 会遍历所有消息句柄。没有显示任何 Indy 代码。
-
Indy 的
ConnectTimeout仅在建立底层 TCP/IP 连接时适用于套接字 APIconnect()函数。之后调用SSL_connect()来启动SSL 握手,这是应用程序数据,因此不受ConnectTimeout的约束。值得一提的是,Indy 确实使用其ReadTimeout属性在 OpenSSL 连接上分配套接字级读/写超时,但仅在 Vista+ 上作为 OpenSSL 错误的解决方法。在 XP 上,默认套接字读/写超时适用。
标签: delphi openssl jetty indy indy10