Как указано в accept()
человек страницы в RETURN VALUE
разделе:ERRNO после принимать в программировании сокетов Linux
обработки
Linuxaccept()
(иaccept4()
) Ошибка проходит уже ожидающие сетевые ошибки на новый сокет, как код ошибки отaccept()
. Это поведение отличается от других реализаций сокетов BSD. Для надежной работы приложение должно обнаруживать сетевые ошибки, определенные для протокола послеaccept()
, и обрабатывать их какEAGAIN
путем повторной попытки. В случае TCP/IP, этоENETDOWN
,EPROTO
,ENOPROTOOPT
,EHOSTDOWN
,ENONET
,EHOSTUNREACH
,EOPNOTSUPP
иENETUNREACH
.
Означает ли это, нужно проверить значение errno
сразу после возвращения accept()
и перед проверкой возвращаемого значения accept()
? если да, и если установлено errno
, какие шаги необходимо предпринять?
вот фрагмент кода обработки мой код accept()
:
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if((errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN ||
errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH))
return;
if (newsockfd < 0)
{
// error
}
else if(newsockfd > 0)
{
// accepted a new connection
}
else
{
// blah blah blah
}
я пришел к выводу, что в данном случае можно было бы попробовать еще раз через некоторое время. Верно ли мое заключение?
поэтому, если 'errno' не равно ни одному из отмеченных значений, нам нужно закрыть дескриптор файла' sockfd' и открыть новый? как насчет 'cli_addr'? – Barracuda
Никогда не видеть, что кто-то снова открывает 'sockfd' после того, как accept не удалось. 'sockfd' - это слуховой сокет, возвращаемый из' bind'. Что может случиться с ним после его создания? Никогда этого не видеть. cli_addr is – alexander
Также вы должны проверить для 'EAGAIN' и' EWOULDBLOCK' для сокетов сокетов, открытых с помощью 'O_NONBLOCK', и снова принять вызов. – alexander