Подтвердить что ты не робот

Что может привести к тому, что "Ресурс временно недоступен" в команде sock send()

Что может вызвать ошибку Resource temporarily unavailable в команде socket send()? Сокет устанавливается как AF_UNIX, SOCK_STREAM. Он работает большую часть времени, но иногда получает эту ошибку. Приемная часть разъема работает нормально.

Я знаю, что это не очень подробно, но я просто ищу общие идеи. Спасибо!

4b9b3361

Ответ 1

"Resource temporarily unavailable" - это сообщение об ошибке, соответствующее EAGAIN, что означает, что операция была бы заблокирована, но была запрошена неблокирующая операция. Для send() это может быть связано с любым из:

  • явно указывая дескриптор файла как неблокирующий fcntl(); или
  • передает флаг MSG_DONTWAIT на send(); или
  • установка тайм-аута отправки с опцией SO_SNDTIMEO.

Ответ 2

Это потому, что вы используете сокет non-blocking и выходной буфер заполнен.

На странице send() man

   When the message does not fit into  the  send  buffer  of  the  socket,
   send() normally blocks, unless the socket has been placed in non-block-
   ing I/O mode.  In non-blocking mode it  would  return  EAGAIN  in  this
   case.  

EAGAIN - это код ошибки, привязанный к "Ресурс временно недоступен"

Рассмотрите возможность использования select(), чтобы лучше контролировать это поведение