Я где-то читал, что каждое TCP-соединение имеет собственный 125-килобайтный выходной и входной буфер. Что произойдет, если этот буфер заполнен, и я все еще продолжаю отправлять данные в Linux?
В соответствии с http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html пакеты просто молча отбрасываются, не уведомляя меня. Что я могу сделать, чтобы это не произошло? Есть ли способ узнать, правильно ли были отправлены хотя бы некоторые мои данные, чтобы я мог продолжить в более поздний момент времени?
Короткий ответ таков. вызовы «send» на сокете TCP будут просто блокироваться до тех пор, пока в результате приема и использования данных удаленной конечной точкой не откроется скользящее окно TCP (или внутренние буферы очереди). Это не сильно отличается от попытки записи байтов в файл быстрее, чем диск может его сохранить.
Если ваш сокет настроен на неблокирующий режим, send будет возвращать EWOULDBLOCK или EAGAIN, пока данные не будут отправлены. стандарт опрос, Выбрать, а также Epoll вызовы будут работать, как и ожидалось, поэтому вы знаете, когда «отправлять» снова.
Я не знаю, что «пакеты сброшены». Я думаю, что более вероятно то, что вызовы, которые программа делает для write (), будут либо блокировать, либо возвращать ошибку.