功能工作计时器

时间:2012-05-30 13:00:48

标签: c++ sockets function timer

我有一个从socket接收数据的函数,我需要在5秒钟后停止函数而不创建额外的线程。我的代码:

void TestReceive()
{
 //how to stop code below when 5 second passed&
 size_t received = 0;
 while (received < 4)
 {
  ssize_t r = read(fd, buffer, 4);
  if (r <= 0) break;
  received += r;
 }
}

4 个答案:

答案 0 :(得分:2)

使用select(),这将阻塞,直到某些内容可供阅读,或者至少在timeval中指定的时间内,如下所示。

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select()不读取或写入,它对一组描述符(readfds,writefds和/或exceptfds)的作用是什么,它将等待/阻塞,直到发生以下情况之一:

  • 有一个准备好从
  • 读取的描述符
  • 有一个准备写入的描述符
  • 其中一个描述符存在异常,例如已关闭
  • 如果指定了超时,则配置的时间到期

如果您只是需要“等待”(休眠)5秒钟,然后阅读,您可以在Linux上睡眠(usleep())5秒钟,然后通过设置套接字进行非阻塞读取选项,或使用最小超时调用select()并检查是否有任何要读取的内容。

这是一个相关的问题。 How C++ select() function works in Unix OSs?

答案 1 :(得分:1)

正如@Brady建议的那样,select()将起作用

您还可以设置套接字选项 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO ...

答案 2 :(得分:0)

记录循环开始前的当前时间。 在每次迭代时 - 检查是否已经过了5秒 - 如果是 - 中断;

答案 3 :(得分:0)

我建议采用以下方法:

  • 将当前时间测量为var say startTime;
  • LOOP
  • 使用超时(select)从套接字读取。让超时为 startTime + 5秒 - 现在
  • 迭代直到超时匹配(或超时很少应用)

此方法使用超时而不是单独的线程