设置 boost socket.connect 的超时

2024-01-08

我在用boost::asio::connect on a tcp::socket。当一切顺利时,connect立即返回,但在网络较差的情况下,connect日志等待 15 秒后超时。我不能等那么久,所以想减少超时。不幸的是,到目前为止我还没有找到任何解决方案。

我看到 async_wait 与 Deadline_timer 一起使用的解决方案,但所有这些示例都是用于接收/发送操作,而不是用于连接。

谁能帮我提供示例代码boost::asio::connect(socket, endpoints);。要求是它应在 5 秒内超时,而不是 15 秒。


你有没有看一下下面的内容example https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/example/cpp03/timeouts/async_tcp_client.cpp?它包含一个示例代码async_connect有超时。

可以使用以下代码实现超时连接方法:

void connect(const std::string& host, const std::string& service,
  boost::posix_time::time_duration timeout)  {
// Resolve the host name and service to a list of endpoints.
tcp::resolver::query query(host, service);
tcp::resolver::iterator iter = tcp::resolver(io_service_).resolve(query);

// Set a deadline for the asynchronous operation. As a host name may
// resolve to multiple endpoints, this function uses the composed operation
// async_connect. The deadline applies to the entire operation, rather than
// individual connection attempts.
deadline_.expires_from_now(timeout);

// Set up the variable that receives the result of the asynchronous
// operation. The error code is set to would_block to signal that the
// operation is incomplete. Asio guarantees that its asynchronous
// operations will never fail with would_block, so any other value in
// ec indicates completion.
boost::system::error_code ec = boost::asio::error::would_block;

// Start the asynchronous operation itself. The boost::lambda function
// object is used as a callback and will update the ec variable when the
// operation completes. The blocking_udp_client.cpp example shows how you
// can use boost::bind rather than boost::lambda.
boost::asio::async_connect(socket_, iter, var(ec) = _1);

// Block until the asynchronous operation has completed.
do io_service_.run_one(); while (ec == boost::asio::error::would_block);

// Determine whether a connection was successfully established. The
// deadline actor may have had a chance to run and close our socket, even
// though the connect operation notionally succeeded. Therefore we must
// check whether the socket is still open before deciding if we succeeded
// or failed.
if (ec || !socket_.is_open())
  throw boost::system::system_error(
      ec ? ec : boost::asio::error::operation_aborted);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置 boost socket.connect 的超时 的相关文章

随机推荐

  • Overlay.draw() 调用多次

    我有一个关于draw 的方法OverlayAndroid 地图中的类 移动地图时的方法draw 接到几次电话 从 4 次到 13 次 这对我来说是个问题 因为这个方法必须用 70000 点重新绘制我的路线 这是很多资源 我找不到这个问题的描
  • .NET 垃圾收集器之谜

    在我的工作中 我们遇到了 OutOfMemoryExceptions 问题 我编写了一段简单的代码来模仿某些行为 最终得到了以下谜团 看看这段简单的代码 当内存不足时 它就会崩溃 class Program private static v
  • 高分子纸波纹

    我试图在按下按钮时更改元素的颜色 我希望当按下按钮并且颜色发生变化时在该元素中触发纸张波纹效果 我该怎么做呢 目标元素
  • 充当文件上传的div?

    我只是想上传或浏览 div 本身 就像作为文件输入并触发其功能 但我的问题是我对 java 脚本很陌生 并且为自己集思广益近一个小时并寻找互联网上同样的问题 所以我别无选择只能在这里提问 my code div style border 1
  • Android AsyncTask 与进度对话框取消

    在我的android应用程序中 我使用带有进度对话框的AsyncTask 请等待登录 来使用我的网页 异步任务内的Web服务功能 登录用户 当用户单击设备上的 后退 按钮时 我想关闭进度对话框并取消 AsynTask 我找不到用于中断 As
  • Swift - 从 JSON 响应创建数据模型

    我正在学习 Swift 语言 很高兴听到其他人输入的内容之一是 如何处理来自 JSON 响应的模型 例如 I have User swift model class User NSObject var user token String v
  • 自动分配spring的bean名称以防止名称冲突?

    在Spring应用程序中 如果两个程序员开发两个包 将 Repository注释为相同的类名 Spring将抛出 IllegalStateException 注解指定的bean名称 mybean 代表 bean 类 foobar packa
  • 如何从 URL 方案中获取参数。

    我在我的 iPhone 应用程序中使用 URL 方案 从一个页面将用户切换到 safari 然后从网页单击一个按钮 我将恢复到应用程序 此时 一些参数是由网页传递的 例如 myapp parameter 1 如何从我的应用程序中找到此参数
  • jQuery.ajax -always() 并不总是运行

    我正在使用 jQuery ajax 进行 REST 调用并检索一些 JSON 它按预期工作 但是 当我强制出现错误条件 例如无效 URL 时 always 方法不会触发 如果我设置 crossDomain false 或 dataType
  • Linux 文件 IO - 多线程性能 - 写入不同的文件

    我目前正在开发一个音频录制应用程序 该应用程序从网络获取最多 8 个音频流并将数据保存到磁盘 简化的 现在 每个流都由一个线程处理 gt 同一线程还在磁盘上执行保存工作 这意味着我有 8 个不同的线程在同一磁盘上执行写入操作 每个线程写入不
  • 有没有办法区分应用程序是在登录时由启动服务启动还是由用户启动? [复制]

    这个问题在这里已经有答案了 Cocoa 应用程序可以将自己添加到LSSharedFileList的登录项目列表 这将允许应用程序在用户登录时启动 但是 有没有办法判断用户是启动应用程序还是应用程序在登录时自动启动 这很有用 因为在一种情况下
  • MacOS Mojave 中未找到 ntpdate 命令

    我有一个 Bash 脚本可以更新我的 mac 时间 但自从 Mojave 更新后找不到该命令 ntpdate u time apple com return ntpdate command not found 我哪里出错了 这是重复的 请检
  • 在python中将文件从latin1转换为utf-8的最快方法

    我需要在 python 中将文件从 latin1 转换为 utf 8 的最快方法 文件很大 2G 我正在移动数据库数据 到目前为止我已经 import codecs infile codecs open tmpfile r encoding
  • ED A0 80 ED B0 80 是有效的 UTF-8 字节序列吗?

    java nio charset Charset forName utf8 decode http docs oracle com javase 7 docs api java nio charset Charset html decode
  • Java:方法名称/签名解析是否静态完成(编译时)?

    今天我遇到了一个有趣的问题 我认为这在 Java 中是不可能的 我针对 jgroups 2 6 版本编译了 java 代码 但在运行时使用了 2 12 版本 tomcat Web 应用程序部署 我收到以下错误 org jgroups Mes
  • 使 HTA 文件以管理员身份运行(提升)

    在 wsf vbs 和 js 文件中 您可以轻松地找出它们是否运行提升 如果没有 您可以轻松地制作它们 我为此编写的代码是这样的 EnsureElevatedPrivileges WScript Echo Running elevated
  • 反序列化以在运行时键入

    我正在尝试使用TypeAdapterFactory序列化和反序列化一些客户对象 我想在运行时将所有对象序列化为特定类型 所以给定一个String classpath and a JsonObject object我想将对象反序列化为实例Cl
  • C# - 方法的类型签名与 PInvoke 不兼容

    我正在尝试在 C 2010 中使用 VC 2003 dll 当我从 C 调用 dll 的方法时出现此错误 方法的类型签名与 PInvoke 不兼容 I am returning the structure from VC Code stru
  • longjmp 是如何工作的?

    我需要了解 longjmp 函数是如何工作的 我知道它的作用 但我需要知道它是如何做到的 我试图在 gdb 中禁用代码 但我无法理解一些步骤 代码是 0xb7ead420
  • 设置 boost socket.connect 的超时

    我在用boost asio connect on a tcp socket 当一切顺利时 connect立即返回 但在网络较差的情况下 connect日志等待 15 秒后超时 我不能等那么久 所以想减少超时 不幸的是 到目前为止我还没有找到