2016-08-19 4 views
0

スレッドにループがあります。各ループサイクルの始めに、ソケットセットを定義してから、selectを使用して、ソケットセット内のいずれかのソケット上のアクティビティを待機します。タイムアウト値を2秒と500ミリ秒に設定しました。何らかの理由で、 'select'関数が直ちに(1ms後のように)戻り、私が定義したタイムアウト値を尊重していないようです。だから私は何が間違っているの?Android C++ - ソケットセレクトがナットを運転しています!私が指定したタイムアウト値を尊重しないのはなぜですか?

は、ここでは、コードスニペットです:

/* 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); 

UPDATE:

私はAndroidのメーカーを憎みます。それは増分的な変更を拾いませんので、私はそれがネイティブライブラリの変更を拾わなかったことに気づかずに何度も同じアプリケーションを何度も起動していました。

EJPの示唆された変更は、EJPの提案された変更でapkをきれいに再構築すると、問題がなくなったために助けになったはずです。

答えて

2

ループのたびにソケットのタイムアウト構造体をリセットする必要があります。 男から(Linux)を選択します。

(選択)残されたどのくらいの時間を示すために、timeout引数を更新することができます。

関連する問題