Что происходит при переполнении буфера?

Я где-то читал, что каждое TCP-соединение имеет собственный 125-килобайтный выходной и входной буфер. Что произойдет, если этот буфер заполнен, и я все еще продолжаю отправлять данные в Linux?

В соответствии с http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html пакеты просто молча отбрасываются, не уведомляя меня. Что я могу сделать, чтобы это не произошло? Есть ли способ узнать, правильно ли были отправлены хотя бы некоторые мои данные, чтобы я мог продолжить в более поздний момент времени?

2

Решение

Короткий ответ таков. вызовы «send» на сокете TCP будут просто блокироваться до тех пор, пока в результате приема и использования данных удаленной конечной точкой не откроется скользящее окно TCP (или внутренние буферы очереди). Это не сильно отличается от попытки записи байтов в файл быстрее, чем диск может его сохранить.

Если ваш сокет настроен на неблокирующий режим, send будет возвращать EWOULDBLOCK или EAGAIN, пока данные не будут отправлены. стандарт опрос, Выбрать, а также Epoll вызовы будут работать, как и ожидалось, поэтому вы знаете, когда «отправлять» снова.

7

Другие решения

Я не знаю, что «пакеты сброшены». Я думаю, что более вероятно то, что вызовы, которые программа делает для write (), будут либо блокировать, либо возвращать ошибку.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector