Android C++套接字选择让我疯狂!为什么不考虑我指定的超时值?

Android C++套接字选择让我疯狂!为什么不考虑我指定的超时值?,android,sockets,android-ndk,Android,Sockets,Android Ndk,我在线程中有一个循环。在每个循环周期的开始,我定义一个套接字集,然后使用select等待套接字集中任何套接字的活动。我已将超时值设置为2秒500毫秒。出于某种原因,“select”函数在1ms后立即返回,它似乎不符合我定义的超时值。那么我做错了什么 下面是代码片段: /* Define a time-out value of 2 seconds and 500ms */ struct timeval sock_timeout; sock_timeout.tv_sec = 2; sock_time

我在线程中有一个循环。在每个循环周期的开始,我定义一个套接字集,然后使用select等待套接字集中任何套接字的活动。我已将超时值设置为2秒500毫秒。出于某种原因,“select”函数在1ms后立即返回,它似乎不符合我定义的超时值。那么我做错了什么

下面是代码片段:

/* Define a time-out value of 2 seconds and 500ms */
struct timeval sock_timeout;
sock_timeout.tv_sec = 2;
sock_timeout.tv_usec = 500 * 1000;

while (m_keepRunning)
{
  fd_set UdpSocketSet;
  SOCKET maxfd = INVALID_SOCKET;
  std::map<uint16_t, UdpChannel*>::iterator k;

  /* Define socket set */
  pthread_mutex_lock(&m_udpChannelsMutex);
  FD_ZERO(&UdpSocketSet);
  for (k = m_udpChannels.begin(); k != m_udpChannels.end(); ++k)
  {
     UdpChannel* thisUdpChannel = k->second;
     FD_SET(thisUdpChannel->m_udpRxSocket, &UdpSocketSet);
     if (maxfd == INVALID_SOCKET)
     {
        maxfd = thisUdpChannel->m_udpRxSocket;
     }
     else
     {
        if (thisUdpChannel->m_udpRxSocket > maxfd) maxfd = thisUdpChannel->m_udpRxSocket;
     }
  }
  pthread_mutex_unlock(&thisAudioStreamer->m_udpChannelsMutex);

  /* TIMES OUT LITERALLY EVERY MILLISECOND!!! WHY????? */
  int retval = pal_select(maxfd + 1, &UdpSocketSet, NULL, NULL, (timeval*)&sock_timeout);
更新:

我讨厌安卓工作室。它不接收增量更改,所以我一次又一次地启动同一个应用程序,却没有注意到它没有接收本机库中的更改


EJP的建议一定有帮助,因为一旦我用EJP建议的更改对apk进行了干净的重建,问题就消失了。

每次循环时都必须重置套接字超时结构。从man select Linux:

select可能会更新超时参数以指示剩余时间


每次在循环中都必须重置套接字超时结构。从man select Linux:

select可能会更新超时参数以指示剩余时间