【问题标题】:What "Socket Error # 2" means in Indy components?Indy 组件中的“Socket Error #2”是什么意思?
【发布时间】:2015-01-19 10:03:05
【问题描述】:

我创建了一个使用 C++/Delphi 中的 POST 方法调用 Web 服务的应用程序。它在 http 下的 localhost 中运行良好,但是当我在生产服务器中尝试 https 协议时,我得到“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;

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

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

发生了什么?我很困惑。

【问题讨论】:

  • 能否请您发布确切的套接字错误编号。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 调用 iHTTP1->Post() 后,引发异常。我唯一能得到的信息是 CLASSNAME: EIdSocketError, MESSAGE:Socket Error # 2. 怎样才能得到 Socket 错误号?
  • 捕获EIdSocketError 而不是Exception 并打印出异常的LastError。那是套接字错误代码。
  • 完成。 LastError 值为 2。它与一般异常“Socket Error #2”的数量相同。遗憾的是 Windows Sockets Error Codes 文档没有提到 #2 代码。
  • 2 在 Windows 上不是有效的套接字错误代码。您不应该看到 2 报告。这让我认为您使用的是旧版本的 Indy,在启用 SSL 时,该版本的套接字错误报告存在问题。这是很久以前修好的。你实际使用的是什么版本的 C++Builder 和 Indy?

标签: delphi c++builder indy10


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题似乎发生在 Indy + SSL + Windows 8.1

    解决方法就是添加:

    IdHTTP1->ReadTimeout = 30000;
    

    问题解决了!

    【讨论】:

    • 您尚未回答所提出的问题。提出的问题涉及错误 #2 的含义以及“正在发生的事情”。您的回答没有解决这些问题。
    • 对不起,我不知道#2 是什么意思。这似乎是我的 XE 版本的错误。在任何情况下,问题的目的是能够无错误地运行应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2020-05-03
    • 2015-09-25
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多