我有一个从套接字接收数据的函数,我需要在 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;
}
}
使用 select(),这将阻塞,直到可以读取某些内容或最多在 timeval 中指定的时间,如下所示。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select() 不会读取或写入,它的作用是针对一组描述符(readfds、writefds 和/或exceptfds),它将等待/阻塞,直到发生以下情况之一:
如果您只需要“等待”(睡眠)5 秒钟,然后读取,您可以睡眠(usleep()
在 linux 上)5 秒钟,然后通过设置套接字选项或调用 select() 进行非阻塞读取最小超时并检查是否有要读取的内容。
这是一个相关的问题。C++ select() 函数如何在 Unix 操作系统中工作?
正如@Brady 建议的那样, select() 将起作用
您还可以设置套接字选项
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO ...
记录循环开始前的当前时间。在每次迭代中 - 检查是否已经过了 5 秒 - 如果是 -中断;
我会推荐以下方法:
这种方法使用超时而不是单独的线程