【发布时间】:2017-08-15 15:27:42
【问题描述】:
我正在编写一个服务(CentOS 的 C 语言),它必须通过 SSL 与第三方 REST API 建立大量出站 SSL 连接。
OpenSSL 用于创建与远程服务器的安全连接。初始化 ssl_connection 后,我将返回的文件描述符注册到我们的 epoll 队列中。
我可以连接并执行 API 事务了。之后,远程服务器终止连接,我们在 fd 上获得 EPOLLRDHUP 并调用我们的清理例程。
signal(SIGPIPE,SIG_IGN);
if(PS(endpoint)->ssl != NULL)
{
if(SSL_shutdown(PS(endpoint)->ssl)==0)
{
SSL_shutdown(PS(endpoint)->ssl);
}
}
if(PS(endpoint)->web != NULL)
{
BIO_free(PS(endpoint)->web); // This can cause a SIGPIPE, especialy when debugging!
PS(endpoint)->web = NULL;
}
通过此关闭过程,一切似乎都正常,没有抛出任何错误。
但是 - 每个后续连接都需要下一个系统 fd,最终所有文件描述符都被耗尽,达到 1028 的操作系统软限制。
所以问题是 fd 没有被关闭并释放回内核?
这是通过
确认的ls /proc/$PID/fd/ | wc -l
谁能帮忙解决正确的 OpenSSL 会话关闭过程?
【问题讨论】:
标签: c linux ssl service openssl