Non blocking socket design: FreeRTOS_FD_ISSET and read/write/exception event granularity
As part of my non blocking (asynchronous) socket application, I need to know what type of event FreeRTOS_select generated for a particular socket.
FreeRTOSFDISSET simply returns true if any event flag is set. How can I find out what type of event was generated for the socket?
Non blocking socket design: FreeRTOS_FD_ISSET and read/write/exception event granularity
Willhelm, the code in
FreeRTOS_FD_ISSET()
can be read as follows:
if xSocket
is part of ( connected to ) xSocketSet
, the select event mask in xSocketBits
will be returned.
This mask has 4 bits, more or less comparable to the BSD select()
:
~~~
eSELECTREAD /* the socket has data in its RX buffer */
eSELECTWRITE /* the socket has space in its TX buffer /
eSELECT_EXCEPT / the socket has had an exception (connection closed) /
eSELECT_INTR / and API call got interrupted after FreeRTOS_SignalSocket() was called. */
~~~
eSELECT_READ
has a second use: when a socket in listening mode receives a new connection, the event is generated.
Likewise, eSELECT_WRITE
is generated as soon as connect()
leads to a TCP connection.
So for listening “server” sockets, it is important to enable eSELECT_READ
, and for a connecting “client” sockets, it is recommended to enable the eSELECT_WRITE
event.
When FreeRTOS_send()
returns less bytes than expected, or the error -pdFREERTOS_ERRNO_ENOSPC
, it is good to enable eSELECT_WRITE
for that socket, and get woken up as soon as there is space.
But eSELECT_WRITE
can be nasty: when it occurs you either send data, or disable it. If not, it will come back again and again. Nothing peculiar here: the same behaviour can be expected on a PC.
Inheritance: when a server socket receives a new connection, the new connection will automatically belong the the same select group, and it will have the eSELECT_READ
and eSELECT_EXCEPT
bits set.
Non blocking socket design: FreeRTOS_FD_ISSET and read/write/exception event granularity
Thank you for your detailed explanation Hein. I am looking at the documentation https://www.freertos.org/FreeRTOS-Plus/FreeRTOSPlusTCP/API/FD_ISSET.html and I am not sure how I missed reading the details.