我使用Indy 10 Http Client(最新的SVN版本)和SSL Handler(Delphi 7)来获取https://www.webtide.com/choose/jetty.jsp网站的内容。Indy 10 + SSL =适用于Windows 7,不适用于XP
它可以在Windows 7 x64(在两个系统上测试)上正常工作,但在WindowsXP x86上(在3个系统上测试),测试应用程序只是挂在TIdHTTP.Get()上,没有恢复的可能性一个worker-procedure/thread不起作用!)。测试应用程序无法恢复,必须使用任务管理器关闭。
SSL库(32位x86!)来自这里:http://slproweb.com/products/Win32OpenSSL.html 但我试过5个来自不同站点的其他版本,结果相同。
这里是一个压缩包与源代码,编译的可执行文件,和SSL库:
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上崩溃/挂起?
你的问题是:如果你想做到这一点,你可以通过调用建立TCP/IP连接之后,但在开始SSL握手,例如前
TIdSocketHandle.SetSockOpt()
方法做手工? – 2013-03-12 14:06:39为什么它在WindowsXP上崩溃/挂起? – Casady 2013-03-12 14:09:54
难道你不问调试器为什么会挂起?暂停程序,调试器会告诉你它在哪里等待。你可以使用这个代码连接到任何其他网站,或者它只是这个特定的一个,让你的程序挂起? – 2013-03-12 14:17:46