In any case, the Timeout parameter on Check_Selector does what it sounds like you want. You invoke Check_Selector(), and when it returns look at the status. If the Status is Complete, you've gotten "activity" such as data (assuming you're reading) or the other end of a socket closed, if Expired the selector timed out, and if Aborted then the selector was commanded to prematurely terminate via Abort_Selector().
I typically put the socket reading, including the Check_Selector() invocation, in a task so as not to block the rest of the app, and allow for an externally initiated Abort_Selector. In fact, I rarely use a timeout, I just loop the Check/Read on the socket, and when I no longer need to read the socket, like when shutting down, just call Abort_Selector() to finish it off.