我有一个从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;
}
}发布于 2012-05-30 21:03:12
使用select(),它将被阻塞,直到有东西可读,或者最多在timeval中指定的时间内,如下所示。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);select()不读也不写,它所做的是针对一组描述符(readfds、writefds和/或exceptfds),它将等待/阻塞,直到发生以下情况之一:
中读取
>F210
如果您只需要“等待”(休眠)5秒,然后读取,那么您可以休眠5秒(linux上的usleep()),然后通过设置套接字选项或使用最小超时调用select()进行非阻塞读取,并检查是否有要读取的内容。
这里有一个相关的问题。How C++ select() function works in Unix OSs?
发布于 2012-05-30 21:08:57
正如@Brady所建议的,select()将会起作用
还可以设置套接字选项setsockopt(s, SOL_SOCKET, SO_RCVTIMEO ...
发布于 2012-05-30 21:06:07
记录循环开始前的当前时间。在每次迭代时-检查是否已过5秒-如果是-中断;
https://stackoverflow.com/questions/10816830
复制相似问题