什么"套接字错误#2"在Indy组件中意味着什么?

时间:2015-01-19 10:03:06

标签: delphi c++builder indy10

我创建了一个在C ++ / Delphi中使用POST方法调用Web服务的应用程序。它在http下的localhost中工作正常,但是当我在生产服务器中尝试https协议时,我得到了#34; Socket Error#2"。我不知道这意味着什么。 Web服务器正在向其他应用程序(而不是Rad Studio)提供https服务而不会出现问题。我使用的代码是从网站上提取的:

std::auto_ptr<TIdHTTP> httpPtr( new TIdHTTP(NULL) );
TIdHTTP *Http = httpPtr.get();
try
{
  TIdSSLIOHandlerSocketOpenSSL *SSL = new TIdSSLIOHandlerSocketOpenSSL( Http );
  // configure SSL settings as needed...
  Http->IOHandler = SSL;

  Http->HandleRedirects = true;
  Http->AllowCookies = false;
  Http->ConnectTimeout = 10000;
  Http->ReadTimeout = 10000;

  Http->Request->BasicAuthentication = true;
  Http->Request->Password = username;
  Http->Request->Username = password;

  Memo1->Text = Http->Post( "http://logs.domain.dk", json);
}
catch( const Exception &e )
{
  Memo1->Lines->Add(e.ClassName());
  Memo1->Lines->Add(e.Message);
  return;
}

更新

我添加了以下代码以查看来自Fiddler的消息。

IdHTTP1->ProxyParams->ProxyServer = "127.0.0.1"; 
IdHTTP1->ProxyParams->ProxyPort = 8888;

现在它工作正常(使用Code for Fiddler),但当然,它不是解决方案,因为用户不会有Fiddler。 我不知道它是否重要,但https服务器不使用普通的https端口。它使用4001,但我在url中传递了这个值:

IdHTTP1->Post("https://myweb.com:4001/api/certificate", json);

发生了什么事?我很困惑。

2 个答案:

答案 0 :(得分:0)

似乎问题出现在Indy + SSL + Windows 8.1

解决方案只是添加:

IdHTTP1->ReadTimeout = 30000;

问题解决了!

答案 1 :(得分:0)

尝试将以下行添加到该部分:
ssl->SSLOptions->Method = TIdSSLVersion::sslvSSLv23;