Android C++套接字选择让我疯狂!为什么不考虑我指定的超时值?
我在线程中有一个循环。在每个循环周期的开始,我定义一个套接字集,然后使用select等待套接字集中任何套接字的活动。我已将超时值设置为2秒500毫秒。出于某种原因,“select”函数在1ms后立即返回,它似乎不符合我定义的超时值。那么我做错了什么 下面是代码片段: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
/* 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可能会更新超时参数以指示剩余时间