我有一个从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;
}
}
答案 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)
我建议采用以下方法:
此方法使用超时而不是单独的线程