如何在超时时间内等待一个值

3

我有一个用C++编写的客户端/服务器程序,我想通过服务器发送的命令检查客户端响应(C++对象的属性),如果没有响应,则设置超时时间。

在某些秒钟内等待期望值。如果没有观察到期望值,我需要返回超时。我考虑使用线程和轮询来检查特定时间间隔内的期望值。

我想知道C++11/14中的功能 - std::promise, std::future, std::condition_variable或其他什么 - 是否可以更轻松地处理此案例。我看到的不方便之处是,我必须通过通知来注意每个变化的值。

好的,我需要一些建议。


1
你正在使用哪个网络库?它应该已经内置了这个功能,无需手动实现。 - Konrad Rudolph
请展示你的代码。 - rustyx
5个回答

2

你提到的所有C++语言特性都无法帮助你解决问题,因为它们旨在用于单个正在运行的程序内的交互 - 这个程序可能是多线程的,但不会分成两个完全独立的进程。

然而,你正在使用的网络库(在服务器端)可能具有方便的功能来解决这个问题。

我知道这是一个笼统而模糊的答案,但是你的问题也不是非常具体。


例如,我必须通过请求(我的测试服务器中的简单int成员)或客户端响应中的值来检查交换消息的数量。测试必须验证响应(正确的值)或不验证(错误的值或超时)。我认为与我发现的这些功能相比,个人轮询有点繁重。 - YopAndMail
@YopAndMail:在使用非专门编写多个独立程序的编程语言时,不同程序之间的通信可能会更加复杂,尤其是在不同的机器上。但请注意,在许多情况下,您无需反复轮询,而是可以休眠直到客户端发送消息或经过一段时间后再唤醒。 - einpoklum
事实上,与你们所有人交谈让我退后了一步。我认为我在寻找过于复杂的解决方案(我的问题将架构和实现混合在了一起)。超时将显然由我的测试服务器实现,并且我的调用者测试将(无法)验证服务器收到的响应。嗯,这很简单,我现在有点羞愧。 - YopAndMail
@YopAndMail:没有什么好羞耻的。你提出了一个合理的问题,虽然有些不够具体,但你得到了答案。一切都没问题。 - einpoklum

0
如何在超时时间内等待一个值
在进程中,通常会使用条件变量。
我想通过服务器发送的命令来检查客户端响应...
在C++中,没有标准的进程间通信方式(除非你考虑与文件系统的交互)。因此,在这种通信中强制执行超时也没有标准的方法。
在你知道如何实现超时之前,你必须先确定你将如何在客户端和服务器之间进行通信。这个选择将受到你所针对的系统的影响,所以你应该首先弄清楚这一点。

0

如果您使用的是Linux环境,可以尝试使用rpcgen并玩转.x文件,但需要稍微学习一下。不确定Windows环境是否适用。此外,您还可以使用更直观的Dbus

[编辑] Dbus或者对您来说可能更适合的是libdbus,它是一个跨平台的IPC工具包或库,可以满足您的需求。RPCGEN是一个旧工具,可以完成相同的任务,但更加复杂。很抱歉我没有代码片段,但您可以搜索“qt dbus example”。


请提供比仅仅提及名称更多的信息...rpcgen是什么?.x文件是什么?D-Bus是什么?也许我们中有些人知道答案,但并非所有人都知道。您还可以添加进一步信息的链接。 - einpoklum
Dbus或者对你来说可能是libdbus,它是一个可以满足你需求的跨平台IPC工具库。RPCGEN是一个旧的工具,实现同样的功能但更为复杂。非常抱歉我没有示例代码,但你可以搜索“qt dbus example”。 - Ilian Zapryanov
我的意思是,请把那个放在答案里... :-P - einpoklum

0
关于第一个要求,服务器等待响应并设置超时时间。
您尝试过 select()poll() 吗?它们可以帮助我们在一段时间内监视服务器和客户端之间的套接字连接。
或者我们可以使用 signal()alarm(),在几秒钟后检查响应。
在伯克利 API 中,将 setsockopt()SO_RCVTIMEOSO_SNDTIMEO 相结合,也可以为请求设置超时时间。
我不确定您正在实现哪个库,但我希望它有类似的功能。
第二个要求是,您需要在一段时间内等待预期值。
我认为条件变量是一个很好的解决方案。

0

为什么不使用带有 timed_joinboost::thread

   boost::thread server_thread(::server_checker_method, arg1, arg2, arg3);
   if (server_thread.timed_join(boost::posix_time::milliseconds(1000))) // wait for 1s
   {
      // Expected value found in the server in less than 1s
   }
   else
   {
      // Checking expected value took more than 1s, timeout !!!
   }

您可以将检查机制放在server_checker_method中,并在预期值正常时返回。否则,请在循环中迭代,直到超时时间到达。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接