2014-12-03 57 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