Обновление:
Виноват. Я получаю сообщение об ошибке ECONNREFUSED, а не EINPROGRESS. После проверки переменной error
я обнаружил, что она больше 0, и напечатал errno
вместо error
. Конечно, errno
это EINPROGRESS
, потому что его значение не изменилось с момента вызова connect()
.
Ответ на вопрос. Спасибо, ребята.
Я использую тот же фрагмент кода, что и в примере Stevens Network Programming UNIX, не блокирующего соединение():
- Настройка сокета на неблокирующий
- Инициировать неблокирующее соединение ()
- Проверка на немедленное завершение
- Вызовите select() с тайм-аутом и дождитесь готовности чтения или записи
- Когда select() возвращает значение больше 0, выполните getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, &len).
Я получаю сообщение об ошибке EINPROGRESS. Код выполняется на сервере rhel5.
Любые идеи, почему я получаю эту ошибку?
Фрагмент кода:
flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
if ((retVal = connect(sockfd, saptr, salen)) < 0)
if (errno != EINPROGRESS)
return (-1);
if (retVal == 0)
{
// restore file status flags
fcntl(sockfd, F_SETFL, flags);
return 0;
}
FD_ZERO(&rset);
FD_SET(sockfd, &rset);
wset = rset;
tval.tv_sec = nsec;
tval.tv_usec = 0;
if ((retVal = select(sockfd + 1, &rset, &wset, NULL, &tval)) == 0)
{
// timeout
close(sockfd);
errno = ETIMEDOUT;
return (-1);
}
if (retVal < 0)
{
// select() failed
return (-1);
}
if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset))
{
len = sizeof(error);
error = 0;
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return (-1);
if (error > 0) //<<<<< error == EINPROGRESS >>>
{
close(sockfd);
errno = error;
return (-1);
}
}
else
{
return (-1);
}
// restore file status flags
fcntl(sockfd, F_SETFL, flags);
connect
будет продолжать сообщатьEINPROGRESS
, пока соединение не будет установлено. Это задокументировано на справочной странице дляconnect
. - person ephemient   schedule 08.07.2009