Receive Socket Timeout

From RTEMSWiki

Jump to: navigation, search

Receive Socket Timeout

Applications sometimes need its threads to timeout on a socket that blocks when reading. The following is an example function from IanCaddy (ianc AT microsol DOT iinet DOT net DOT au):


int SetSocketTimeout(int connectSocket, int milliseconds)
{
   struct timeval tv;

    tv.tv_sec = milliseconds / 1000 ;
    tv.tv_usec = ( milliseconds % 1000) * 1000  ;

   return setsockopt (connectSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv);
}


Note that by applying the SO_RCVTIMEO option the socket mode is changed to non-blocking. You should test 'errno' for EWOULDBLOCK (or EAGAIN) if a socket function fails.

Then when you are waiting to receive a packet, use the following function:


   iRc = recv(connectSocket, pTmpRxBuffer, MessageDataLen, 0 );

   if (iRc == 0)
   {
      /* Socket has been disconnected */
      printf("\nSocket EOF\n");

      close(connectSocket);
      connectSocket = 0;
      return iRc;
   }

   if(iRc < 0)
   {
      printf("\nSocket recv returned %d, errno %d\n",iRc,errno);

      if (errno != EWOULDBLOCK)
      {
         close(connectSocket); /* Close socket if we get an error */
         connectSocket = 0;
      }
   }


If iRc is positive, it gives you the number of chars received.

Personal tools