Що може спричинити появу тимчасово недоступного ресурсу в команді sock send ()


85

Що може спричинити Resource temporarily unavailableпомилку в send()команді socket ? Розетка налаштована як AF_UNIX, SOCK_STREAM. Це працює більшу частину часу, але іноді отримує цю помилку. Здається, приймальний кінець розетки працює належним чином.

Я знаю, що це не дуже детально, але я просто шукаю загальні ідеї. Дякую!



4
Ви встановлюєте сокет на O_NONBLOCK?
Deepankar Bajpeyi

Я не думаю, що це пов’язано з цим постом. Мої сокети - це SOCK_STREAM, який, на мою думку, блокує, що я хочу.
giroy

3
Чи блокує потік, чи не блокує, не залежить від того, SOCK_STREAM чи SOCK_DGRAM. Відповідь там відповідна.
Barmar

Відповіді:


96

"Resource temporarily unavailable"це повідомлення про помилку, що відповідає EAGAIN, що означає, що операція була б заблокована, але була запрошена операція неблокування. Адже send()це може бути пов’язано з будь-яким із:

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

Причиною моєї проблеми було встановлення тайм-ауту надсилання. Дякуємо за допомогу!
giroy

@caf, У моєму випадку різна конфігурація розміру MTU з двох сторін спричиняла переповнення асоціації TXqueue sctp, коли відбувалася висока швидкість обміну пакетами. Якщо зробити MTU однаковим в обох системах, проблема зникла. Але хто-небудь може пояснити, в чому причина проблеми?
Codename_DJ

46

Це тому, що ви використовуєте non-blockingсокет, а вихідний буфер заповнений.

Зі send()сторінки користувача

EAGAIN - це код помилки, прив'язаний до "Ресурс тимчасово недоступний"

Подумайте про використання, select()щоб краще контролювати цю поведінку


@giroy: але насправді не правильно ... насправді блокуючий сокет, зSO_SNDTIMEO
EML

Класно, але як ми можемо використовувати інше з'єднання для управління одночасним зчитуванням в БД?
MUY Бельгія,

10

Дозвольте навести приклад:

  1. клієнт підключається до сервера і відправляє 1 Мб даних на сервер кожні 1 секунду.

  2. серверна сторона приймає підключення, а потім перебуває в режимі сну 20 секунд, не відчиняючи повідомлення від клієнта, тож на tcp send bufferстороні клієнта буде повно.

Код на стороні клієнта:

Код на стороні сервера:

Запустіть сторону сервера, а потім запустите сторону клієнта.

серверна сторона може вивести:

введіть тут опис зображення

клієнтська сторона може вивести:

введіть тут опис зображення

Ви можете бачити, як сторона сервера не відновлює дані від клієнта, тому, коли сторона клієнта заповнюється tcp buffer, але ви все одно надсилаєте дані, тож може з’явитися Resource temporarily unavailableпомилка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.