TCP-буфер в игре при использовании boost :: asio :: async_write? - PullRequest
1 голос
/ 13 февраля 2020

Из этого обсуждения я понимаю, что boost :: asio :: async_write записывает данные только в буферы ядра. Это не означает, что узел получил данные. Но если я отправляю большие пакеты размером, скажем, 200000 байтов каждый, а затем я тяну сетевой кабель, чтобы внезапно разорвать соединение. Будет ли по-прежнему составляться отчет о 200000 байтах, записанных в буферах ядра для каждого async_write? Мое тестирование говорит, что это не так. Он отказывается от большого буфера, такого как 200000 байтов, и не сообщает обо всех отправленных байтах. Но если это небольшой буфер, такой как 30-40 байтов, он продолжает сообщать, хорошо?

Вопрос:
Основная задача постановки этого вопроса: Существует ли базовый размер буфера, который заполняется в одной точке для async_write до Скажите, что теперь его больше нельзя записывать, потому что ранее запланированные данные не вышли? Если да, то каков размер этого основного буфера? Могу ли я запросить его у boost::asio::ip::tcp::socket?

1 Ответ

2 голосов
/ 14 февраля 2020

Вы можете запросить / изменить размер буфера сокета базовой системы с помощью опции сокета send_buffer_size .

Хотя операционная система может динамически настраивать размер буфера сокета и предел его максимальный размер:

  tcp_wmem (since Linux 2.4)
          This is a vector of 3 integers: [min, default, max].  These
          parameters are used by TCP to regulate send buffer sizes.  TCP
          dynamically adjusts the size of the send buffer from the
          default values listed below, in the range of these values,
          depending on memory available.
...