Для асинхронного подключения вы должны использовать следующие шаги:
socket(..., SOCK_NONBLOCK, ...)
connect(fd, ...)
0
, ни EINPROGRESS
, а затем прервать с ошибкой fd
не будет считаться готовым к выходу getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
Нет циклов - если вы не хотите обрабатывать EINTR
.
Если клиент запускается первым, вы должны увидеть ошибку ECONNREFUSED
на последнем шаге. Если это произойдет, закройте сокет и начните с начала.
Трудно сказать, что не так с вашим кодом, не видя больше деталей. Я полагаю, что вы не прерываете ошибки в своей check_socket
операции.