如何在OpenSSL中设置连接超时和操作超时

2023-11-26

libcurl 有超时选项像这些:

CURLOPT_CONNECTTIMEOUT - maximum time in seconds that you allow the connection to the server to take.
CURLOPT_TIMEOUT - maximum time in seconds that you allow the libcurl transfer operation to take.

我想在 OpenSSL 中实现类似的超时机制。

下面的代码需要进行哪些更改才能将超时值应用于 BIO_do_connect()、BIO_write() 和 BIO_read()?

我正在连接到服务器并使用 OpenSSL 提供的 BIO_write()/BIO_read() 向服务器发送数据/从服务器接收数据。我的代码基于以下示例代码here.

int main()
{
    BIO * bio;
    SSL * ssl;
    SSL_CTX * ctx;

    int p;

    char * request = "GET / HTTP/1.1\x0D\x0AHost: www.verisign.com\x0D\x0A\x43onnection: Close\x0D\x0A\x0D\x0A";
    char r[1024];

    /* Set up the library */

    ERR_load_BIO_strings();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();

    /* Set up the SSL context */

    ctx = SSL_CTX_new(SSLv23_client_method());

    /* Load the trust store */

    if(! SSL_CTX_load_verify_locations(ctx, "TrustStore.pem", NULL))
    {
        fprintf(stderr, "Error loading trust store\n");
        ERR_print_errors_fp(stderr);
        SSL_CTX_free(ctx);
        return 0;
    }

    /* Setup the connection */

    bio = BIO_new_ssl_connect(ctx);

    /* Set the SSL_MODE_AUTO_RETRY flag */

    BIO_get_ssl(bio, & ssl);
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);

    /* Create and setup the connection */

    BIO_set_conn_hostname(bio, "www.verisign.com:https");

    if(BIO_do_connect(bio) <= 0)
    {
        fprintf(stderr, "Error attempting to connect\n");
        ERR_print_errors_fp(stderr);
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return 0;
    }

    /* Check the certificate */

    if(SSL_get_verify_result(ssl) != X509_V_OK)
    {
        fprintf(stderr, "Certificate verification error: %i\n", SSL_get_verify_result(ssl));
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return 0;
    }

    /* Send the request */

    BIO_write(bio, request, strlen(request));

    /* Read in the response */

    for(;;)
    {
        p = BIO_read(bio, r, 1023);
        if(p <= 0) break;
        r[p] = 0;
        printf("%s", r);
    }

    /* Close the connection and free the context */

    BIO_free_all(bio);
    SSL_CTX_free(ctx);
    return 0;
}

我正在 Ubuntu 上对 ARM 进行交叉编译(带有 CodeSourcery Lite 的 Eclipse)。


我最终做了类似以下的事情(伪代码):

int nRet;
int fdSocket;
fd_set connectionfds;
struct timeval timeout;

BIO_set_nbio(pBio, 1);

nRet = BIO_do_connect(pBio);

if ((nRet <= 0) && !BIO_should_retry(pBio))
    // failed to establish connection.

if (BIO_get_fd(pBio, &fdSocket) < 0)
    // failed to get fd.

if (nRet <= 0)
{
    FD_ZERO(&connectionfds);
    FD_SET(fdSocket, &connectionfds);

    timeout.tv_usec = 0;
    timeout.tv_sec = 10;

    nRet = select(fdSocket + 1, NULL, &connectionfds, NULL, &timeout);
    if (nRet == 0)
        // timeout has occurred.
}

您也可以对 BIO_read() 使用相同的方法。

你可能会发现这个链接 useful.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在OpenSSL中设置连接超时和操作超时 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 在 Flutter 中使用 Firebase 身份验证检查用户是否是新用户

    根据底部这一页 AdditionalUserInfo提供了一个方法叫做isNewUser 例如 检查社交登录 Facebook Google 等 是否是登录或注册 给出了一个例子这个答案 Flutter 的问题是我找不到任何名为Additi
  • 并行运行一组 TaskEithers,但如果 1 个或多个任务失败则继续

    我必须并行进行一组 IO 调用 如果成功则合并调用的内 容 如果其中一个失败 其他的将按正常方式处理 但会出现一条错误消息 我对如何实现这一点的思考过程 Array
  • For-In 循环多个条件

    随着 Xcode 7 3 的新更新 出现了很多与新版本 Swift 3 相关的问题 其中一个问题是 C 风格的 for 语句已被弃用 将在未来版本的 Swift 中删除 这出现在传统的 Swift 版本中 for声明 其中一个循环有多个条件
  • 更改导航后退按钮的目的地

    如何更改默认导航后退按钮将我带到的视图控制器 后退按钮通常会将您带回到上一个视图控制器 但是如果我想让它通过两个视图控制器返回怎么办 我的意思是我想更改后退按钮将我带到的视图控制器 我不喜欢创建自定义后退按钮 那么还有其他办法吗 可能是与后
  • 不同方法名的接口实现

    我有这个界面 public interface INameScope void Register string name object scopedElement object Find string name void Unregiste
  • 对于不使用 Emacs 的 Windows 用户是否值得交换 Ctrl 和 Caps Lock

    我已经了解 Steve Yegge 的建议交换 Ctrl 和 Caps Lock虽然我不使用 Emacs 但已经有一段时间了 我刚刚尝试将它们交换作为实验 但发现很难调整 现在有几个快捷键对我来说已经是第二天性了 但我还没有意识到它们在我使
  • 使用正则表达式进行 LDAP 搜索

    有没有办法可以使用字段的正则表达式在 LDAP 上进行搜索 我在用LDAP搜索或 Sun Java System Directory Server 控制中心 进行搜索 答案是否定的 你不能 为什么 因为 LDAP 标准将 LDAP SEAR
  • Python。 Matplotlib 倒置图像

    我不知道这里出了什么问题 import matplotlib pyplot as plt im plt imshow plt imread tas png plt show 并且Y轴反转了 所以我写了一篇论证origin lower im
  • 将数学表达式中的^(幂)符号替换为C的pow语法

    我有一个数学表达式 例如 2 x 3 2 x 5 7 10 0 5 我需要更换 符号到powC语言的函数 我认为正则表达式是我所需要的 但我不知道像专业人士那样的正则表达式 所以我最终得到了这个正则表达式 s s 我不知道如何改进这一点 你
  • 在父级 Shiny 服务器中调用反应式数据集的 Shiny 模块

    我正在寻求移植一些较旧的闪亮应用程序以使用闪亮模块 但在尝试移植我的反应式表达式时遇到了麻烦 根据文档 目标不是阻止模块与其交互 包含应用程序 而是使这些交互变得明确 如果一个 模块需要使用反应式表达式 取反应式 表达式作为函数参数 我有现
  • Monotouch和XCode 4,风口去哪儿了?

    今天我用最新版本的 MonoDevelop MonoTouch 和 Mono Framework 更新了我的 mac 我还下载了最新版本的 XCode 版本 4 一个漂亮的 4 5 gig 下载 起初我没有注意到它 因为我正忙着将代码复制到
  • Clojure 中的多态模式验证

    我想使用架构来验证请求对象 映射中的值之一决定哪些其他字段有效 例如 这些都是有效的 name jane type dog barking true name alan type bird cheeping true name bert t
  • 失败,因为:de.measite.minidns.hla.ResolutionUnsuccessfulException:请求 xxxx。 IN AAAA 产生错误响应 NX_DOMAIN

    在我升级 smack 到 4 2 0 后 我遇到了连接问题 The following addresses failed xxxx 5222 failed because de measite minidns hla ResolutionU
  • 无需数据绑定即可渲染值

    在 AngularJS 中 如何在没有 2 路数据绑定的情况下渲染值 出于性能原因 或者甚至在给定时间点渲染一个值 人们可能想要这样做 以下示例均使用数据绑定 div value div div div 我如何渲染value 没有任何数据绑
  • Hibernate:将基类的实例更改为子类

    我想将一个具体的超类更改为其子类之一 我在下面提供了一个示例 Entity Table name employees Inheritance strategy InheritanceType JOINED public class Empl
  • 如何将“YYYY-MM-DD hh:mm:ss”格式的日期转换为 UNIX 时间戳

    如何转换格式为 YYYY MM DD hh mm ss 的时间 例如 2011 07 15 13 18 52 到 UNIX 时间戳 我尝试了这段Javascript代码 date new Date 2011 07 15 getTime 10
  • 为什么 Composer 在 300 秒后设置超时?

    我有一个用 symfony2 制作的小项目 当我尝试在我的服务器上构建它时 解压缩 symfony 时总是失败 构建正常 突然作曲家无法解压 symfony 我没有更改任何内容 我尝试使用 Jenkins 构建 也尝试从 bash 手动构建
  • 可变参数方法覆盖/重载混乱

    方案1 class B public void m1 int x System out println Super class class A extends B public void m1 int x System out printl
  • 为什么字符串不比较引用?

    我知道这是特殊情况 但为什么字符串之间的 在它们的值相等时返回 而不是在它们的引用相等时返回 这与重载运算符有关系吗 The 运算符重载于String事实上 执行值相等而不是引用相等 这个想法是让字符串对程序员更加友好 并避免使用引用相等来
  • 如何在OpenSSL中设置连接超时和操作超时

    libcurl 有超时选项像这些 CURLOPT CONNECTTIMEOUT maximum time in seconds that you allow the connection to the server to take CURL