2010-10-21 2 views
1

Иногда, когда я пытаюсь отправлять некоторые пакеты непрерывно (я использую API send()), я получаю эту ошибку. Теперь я не уверен, что делать, чем делать. У меня есть следующие вопросы: 1) Можно ли повторно отправить еще раз? Если да, то после того, сколько времени я должен попробовать снова. Существует ли какая-либо конкретная стратегия, которая должна соблюдатьсяОшибка EAGAIN: использование API-интерфейса Berkeley Socket API

2) Является ли размер буфера превышенным лимитом является единственной причиной?

3) Может кто-нибудь, пожалуйста, дайте мне лучшую идею/код, как справиться с таким сценарием.

Спасибо. Sambit.

ответ

2

EAGAIN обычно возвращается при отсутствии свободного пространства для исходящего буфера. Как долго ждать зависит от скорости базового соединения. Обычный способ - подождать, пока select() или poll() скажут вам, что сокет доступен для записи. Если в Linux взглянуть на man-страницу select_tut (2) и, конечно же, на man-страницу send (2).

Вы можете перейти к операции блокировки (по умолчанию), если вы хотите, чтобы вызов подождал, пока не будет свободного места. Или вы можете вызвать select (2), чтобы подождать, пока сокет будет доступен для записи, а затем повторите попытку.

Есть еще одно важное соображение. Если вы отправляете пакеты UDP, имейте в виду, что нет гарантии контроля перегрузки, и если вы отправляете пакеты через Интернет, вы почти наверняка получите потерю пакетов, если вы просто попытаетесь как можно быстрее отправить пакеты UDP (это не обязательно относится к другим сокетам датаграмм, таким как сокеты Unix).

3

От send(): «EAGAIN - Сокет отмечен как неблокирующий, и запрошенная операция блокирует». а также

When the message does not fit into the send buffer of the socket, send normally blocks, unless the socket has been placed in non-blocking I/O mode. In non-blocking mode it would return EAGAIN in this case. The select(2) call may be used to determine when it is possible to send more data.

This thread имеет простой пример использования select() для работы с EAGAIN, за которым следует значительное обсуждение того, какие сюрпризы скрываются под поверхностью.

Смежные вопросы