"Socket Error # 2" 在 Indy 组件中意味着什么?
What "Socket Error # 2" means in Indy components?
我创建了一个使用 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;
现在它工作正常(使用 Proxy for Fiddler),但是当然,这不是解决方案,因为用户将没有 Fiddler。
我不知道这是否重要,但 https 服务器不使用正常的 https 端口。它使用 4001,但我在 url:
中传递了这个值
IdHTTP1->Post("https://myweb.com:4001/api/certificate", json);
这是怎么回事?我很困惑。
似乎问题发生在 Indy + SSL + Windows 8.1
解决办法就是简单的加上:
IdHTTP1->ReadTimeout = 30000;
问题已解决!
尝试将以下行添加到该部分:
ssl->SSLOptions->Method = TIdSSLVersion::sslvSSLv23;
我创建了一个使用 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;
现在它工作正常(使用 Proxy for Fiddler),但是当然,这不是解决方案,因为用户将没有 Fiddler。 我不知道这是否重要,但 https 服务器不使用正常的 https 端口。它使用 4001,但我在 url:
中传递了这个值IdHTTP1->Post("https://myweb.com:4001/api/certificate", json);
这是怎么回事?我很困惑。
似乎问题发生在 Indy + SSL + Windows 8.1
解决办法就是简单的加上:
IdHTTP1->ReadTimeout = 30000;
问题已解决!
尝试将以下行添加到该部分:
ssl->SSLOptions->Method = TIdSSLVersion::sslvSSLv23;