msp*_*err 4 c++ boost openssl boost-asio
我在我的应用程序中使用同步 boost::asio SSL 套接字。我初始化所有参数,然后连接到一些主机(一个接一个)并为每个主机执行 GET 请求。
一切正常,直到我收到其中一个主机的“404 - Not Found”错误。出现此错误后,所有新连接都会失败,并显示一些未指定的 SSL 错误。
我是否必须以某种方式重置 ssl::stream?是否可以在每次连接后重新初始化 ssl::stream?
在下面的代码片段中,我删除了错误处理和所有非 asio 相关的东西。
主要的:
asio::io_service ioservice;
asio::ssl::context ctx(ioservice, asio::ssl::context::sslv23);
ctx.set_verify_mode(asio::ssl::context::verify_none);
Connector *con = new Connector(ioservice, ctx);
while (!iplist.empty())
{
...
con->ssl_connect(ipaddress, port);
...
}
Run Code Online (Sandbox Code Playgroud)
连接器:
Connector::Connector(asio::io_service& io_service, asio::ssl::context &ctx)
: sslSock(io_service, ctx)
{
}
Connector::ssl_connect(std::string ipAdr, std::string port)
{
...
tcp::resolver resolver(ioserv);
tcp::resolver::query query(ipAdr, port);
endpoint_iterator = resolver.resolve(query);
...
asio::error_code errorcode = asio::error::host_not_found;
tcp::resolver::iterator end;
// Establish connection
while (errorcode && endpoint_iterator != end)
{
sslSock.lowest_layer().close();
sslSock.lowest_layer().connect(*endpoint_iterator++, errorcode);
}
sslSock.handshake(asio::ssl::stream_base::client, errorcode);
...
asio::write(...);
...
asio::read(...);
...
sslSock.lowest_layer().close();
...
return;
}
Run Code Online (Sandbox Code Playgroud)
我从 asio 邮件列表中得到了答案(非常感谢 Marsh Ray)。Sam Miller 是正确的,因为每次都必须创建 asio::ssl::context。为了实现这一点,std::auto_ptr使用。
连接器.h:
std::auto_ptr<asio::ssl::stream<tcp::socket>> sslSock;
Run Code Online (Sandbox Code Playgroud)
连接器.cpp:
asio::ssl::context ctx(ioserv, asio::ssl::context::sslv23);
ctx.set_verify_mode(asio::ssl::context::verify_none);
sslSock.reset(new asio::ssl::stream<tcp::socket>(ioserv, ctx));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3758 次 |
| 最近记录: |