poll / epoll / select должно все работать. Man-страница для
connect (2) говорит о том, что вы получаете EINPROGRESS, и что вы можете определить завершение, используя select или poll, чтобы проверить его на доступность для записи. Затем используйте getsockopt, чтобы проверить состояние SOL_SOCKET, SO_ERROR, чтобы увидеть, было ли соединение успешным или неудачным.
Если вы повторите попытку подключения, пока она все еще пытается, вы получите EALREADY.
Так что это документированный способ сделать это, и звучит как раз для меня.