Обработка 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