2014-12-03 59 views
0

當某些數據包按預期到達UDP端口時,select函數返回+ ve值。但是這隻發生一次。從第二次在UDP端口接收到數據包時,該功能沒有響應。但是,如果我在同一個套接字上執行sendto(),那麼在第一次接收到UDP數據包後,select函數會響應。這種行爲的原因是什麼?select()僅返回正值

的代碼:

while (true) 
{ 
    IP_FD_ZERO (&readFD); 
    IP_FD_SET (ipSock, &readFD); 

    if (select(&readFD, NULL, NULL, 2000) > 0) 
    { 
     if (IP_FD_ISSET(ipSock, &readFD))  //activity on UDP socket 
     { 
     addrlen = sizeof(SocketAddrIn_t); 
     noOfbytes = recvfrom(ipSock, 
           (char*)ipRxBuffer, 
           sizeof(ipRxBuffer), 
           0, 
           (SocketAddr_t *)&from, 
           (int*)&addrlen); 
     } 
    } 
} 
+1

你爲什麼編碼平臺????我不熟悉IP_FD_ISSET或只有4個參數的select()... – TonyB 2014-12-03 09:27:47

+0

EMBOS操作系統和使用EMBOS-IP堆棧 – 2014-12-03 09:29:04

回答

1
select(&readFD, NULL, NULL, 2000) 

Bzzt。 select()的第四個參數是struct timeval *,而不是整數。請參閱man page

+0

很抱歉,我沒有指定環境。我使用的API選擇來自堆棧供應商。它期望整數超時。對我來說,我認爲真正的問題是有些端口刷新不會發生,因爲如果我在select()函數成功後發送了一些數據包,那麼select在每次收到UDP數據包時都會給出+ ve值 – 2014-12-03 09:28:27

+0

EMBOS select()例子來自下面的URI不會表現出這種行爲...即它在選擇之間沒有發送。 https://www.segger.com/admin/uploads/productDocs/UM07001_embOSIP.pdf – TonyB 2014-12-03 10:01:50