Обработка EAGAIN после poll(); send()

Есть tcp сокет. Требуется передать n байт данных с таймаутом на отправку. Было принято решение перевести сокет в не блокирующий режим

socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK, IPPROTO_TCP);

После делать poll() с требуемым таймаутом

pollfd somePollfd;
somePollfd.fd = socketFD;
somePollfd.events = POLLOUT;
poll(&somePollfd, 1, timeout);

По идеи, когда poll() устанавливает флаг POLLOUT в somePollfd.revents, можно выполнять send(). В мануале к poll написано (https://www.man7.org/linux/man-pages/man2/poll.2.html):

POLLOUT
       Writing is now possible, though a write larger than the
       available space in a socket or pipe will still block
       (unless O_NONBLOCK is set).

Не могу понять что делать, если размер данных, которые пытаюсь отправить больше, чем "доступное место в сокете". Да, поскольку установлен не блокирующий режим, поток программы не будет заблокирован. Но что дальше? Если я опять вызову poll(), он сообщит, что я могу отправить данные. Но я не могу отправить такое количество данных.

Вариант отправить поток в сон для ожидания отпадает. Вариант вычислять нужный размер данных для отправки отпадает. В идеале как-то узнать, какое количество данных за раз можно отправить, не уходя в блокировку. Если такое возможно, то как? Можно решение исключительно под linux


Ответы (0 шт):