handle non-blocking recv()