www.beck-ipc.comwww.beck-ipc.com  | ImprintImprint
FAQFAQ  | SearchSearch  |
RegisterRegister   |LoginLogin

Probleme mit select() bei der Socketprogrammierung

Questions and discussions about the operating system RTOS-PPC and the corresponding C-LIB.

ich möchte bei der Verwendung von Sockets die select()-funktion nutzen. Hierzu gebe ich z.B. einen Socket-Descriptor und count = 1 als zu überwachendes Set für read-Operationen an. Laut Dokumentaion soll die Funktion die Anzahl der Sockets zurückgeben, für die ein Ereignis eingetreten ist ( z. B. Daten Verfügbar ).
Bei mir gibt die Funktion aber teilweise Werte, die deutlich größer als die Anzahl der zu überwachenden Sockets ist. Bei einem zu überwachenden Socket wird z. B. 11 zurückgegeben ( auch wenn auf den zu überwachenden Sockets kein Ereignis eingetreten ist -> in diesem Fall kehrt die Funktion auch ohne Timeout sofort zurück ).

Code: Select all
      fdRead->fd_array[0] = sd;
      fdRead->count = 1;
      iWidth  = 5;


      FD_ZERO( &FdsRead );    /* Clear up set */
      uiSockTmp = min( iWidth ,  fdRead->fd_count );
      for (ui = 0; ui < uiSockTmp; ui++)
         if( fdRead->fd_array[ui] > 0 )
              FD_SET( fdRead->fd_array[ui], &FdsRead );
              iSockMax = max(iSockMax, (int)fdRead->fd_array[ui]);

      iSelectRes = select( iSockMax+1, &FdsRead, NULL, NULL, NULL );

Wo liegt hier der Fehler?

Ein weiteres Problem ist das Zurücksetzen bei fehlerhafter select()-Funktion. Hat sich die Funktion einmal mit einem Fehler -1 zurückgemeldet, führt jeder weitere Aufruf der Funktion zum Fehler, obwohl send- und receive-Funktionen weiterhin fehlerfrei funktionieren. Ein closesocket reicht dafür nicht.
Es bedarf eines harten Resets ( power off ), um die Funktion wieder fehlerfrei ausführen zu können.
Gibt es eine Möglichkeit den Fehler bei der select-Funktion zurückzusetzen, damit der nächste Aufruf wieder funktioniert?

W. Albert
Wolfgang Albert
Noris Automation Rostock
( SC243, RTOS 1.40 )

I don't know why the select() would return -1 in your case.

Here are the possible reasons why the select() API would return a -1:

1) The FdsRead object pointer passed as the readfds argument to select() references an area that the calling program does not have write permission. (I do not see the declaration of this fd_set object in your code clip, but I cannot imagine that this could be the source of the problem.) No socket error is reported for this case.

2) System resources were too low and a required semaphore creation failed. In this case socket error reported is 212 "no memory" and the select() return value is -1.

3) Some other thread was waiting on one of the sockets that this select() call was to wait on. Sockets waits are only supported for a single thread per socket. In this case socket error reported is 237 "Error Already" and the select() return value is -1.

The get_socketerror(-1) API can be used to report which of the above failures triggered the select() to return a -1, provided that the problem was not the 1), invalid output parameter. Note that the sd argument here is set to -1 to read out the non-socket specific error from the select().

Jack Gatrost
Software Development
Beck IPC GmbH

Return to RTOS-PPC

Who is online

Users browsing this forum: No registered users and 1 guest