2

所以这过去可以顺利工作,但现在我收到“Socket Error #10054 Connection reset by peer”。

我认为一旦我更新了我的 Indy 包,它就开始发生了。今天是我从那以后第一次运行代码。

谁能解释更新可能如何改变了这段代码的行为以及如何解决它?

谢谢你

function PostData(url : string; param: TStringList) : string;
var
  text: string;
  sHttpSocket: TIdHTTP;
  sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL;
  resStream: TStringStream;
begin
  sHttpSocket := TIdHTTP.create;
  sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.create;
  sHttpSocket.IOHandler := sshSocketHandler;
  sHttpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
  sHttpSocket.Request.Method := 'POST';
  resStream := TStringStream.create; 
  sHttpSocket.Post(url, param, resStream);
  resStream.Seek(0, soFromBeginning);
  text := resStream.DataString;
  result := text;
end;
4

1 回答 1

6

如果您要发布到 HTTPS 网址,请确保已TIdSSLIOHandlerSocketOpenSSL为您尝试连接的服务器正确配置了该网址。很有可能,默认值可能与服务器实际期望的不匹配。特别是TIdSSLIOHandlerSocketOpenSSL.MethodTIdSSLIOHandlerSocketOpenSSL.SSLVersions属性默认为 TLSv1,但可能服务器不支持 TLSv1。

附带说明一下,TStringStream在 D2009+ 中的操作与在早期版本中的操作不同,所以我建议您避免使用它,让 Indy 为您解码文本:

function PostData(const url : string; params: TStrings) : string; 
var 
  sHttpSocket: TIdHTTP; 
  sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
  sHttpSocket := TIdHTTP.Create; 
  try
    sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create(sHttpSocket); 
    // configure sshSocketHandler as needed...
    // perhaps try this at a minimum:
    // sshSocketHandler.SSLOptions.Method := sslvSSLv23;
    sHttpSocket.IOHandler := sshSocketHandler; 
    Result := sHttpSocket.Post(url, params); 
  finally
    sHttpSocket.Free;
  end;
end; 
于 2012-06-12T00:53:24.167 回答