>> Изменение: теперь ошибка EAGAIN при вызове connect() не считается временной.
>
> На неблокируемых сокетах - это стандартная ошибка,
> возвращаемая при вызове connect(), потом нужно проверять
> готовнось сокета на запись, а по достижению таймаута отрубать.
>
> В общем как это они так?в POSIX при вызове connect() на неблокируемых
сокетах возвращается EINPROGRESS, а не EAGAIN.
EAGAIN вместо EINPROGRESS возвращает только Windows.
POSIX connect: http://www.opengroup.org/onlinepubs/000095399/functions/conn...
WINSOCK connect: http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx
nginx-0.7.7\src\event\ngx_event_connect.c:
if (err != NGX_EINPROGRESS
#if (NGX_WIN32)
/* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
&& err != NGX_EAGAIN
#endif
)
{
if (err == NGX_ECONNREFUSED
#if (NGX_LINUX)
/*
* Linux returns EAGAIN instead of ECONNREFUSED
* for unix sockets if listen queue is full
*/
|| err == NGX_EAGAIN
#endif
в случае если Linux возвращает EAGAIN - это действительно ошибка,
соединение не было установлено. для пользовательского приложения
это означает примерно то же самое, что и код ошибки ECONNREFUSED.
http://lxr.linux.no/linux/net/unix/af_unix.c#L1070
1070 if (skb_queue_len(&other->sk_receive_queue) >
1071 other->sk_max_ack_backlog) {
1072 err = -EAGAIN;
1073 if (!timeo)
1074 goto out_unlock;
более подробная информация на эту тему:
http://www.google.com/search?q=non-blocking+connect+and+EAGAIN