Размер буфера приема для сокетов tcp / ip - PullRequest
1 голос
/ 27 января 2010

Какой максимальный размер данных следует ожидать в операции приема? Данные, которые должны быть отправлены, очень большие, но в какой-то момент будет фрагментация пакетов?

Ответы [ 2 ]

6 голосов
/ 27 января 2010
  1. Вы всегда можете ограничить размер буфера, который заполняет recv () (параметр)
  2. Дизайн вашего приложения не должен учитывать количество байтов, которые recv () готова предоставить за один вызов.

Это не имеет ничего общего с MTU. В некоторых конструкциях стека TCP один вызов recv () не возвращает более одной дейтаграммы базового протокола пакета. В других случаях он может быть таким же большим, как приемный буфер сокета.

1 голос
/ 27 января 2010

Существует что-то вроде максимального размера сетевого пакета:

МТ

это указывает на максимальный размер буфера низкого уровня (3 IP-адреса на уровне iso / osi) во время передачи данных по сети (без обратной связи). Что обычно составляет 1492 в сетях Ethernet.

Так что стоит оптимизировать передачу данных до размера этой суммы.

(есть также так называемые Jumbo frames , которые нарушают это правило, но должно быть программное / аппаратное обеспечение, которое принимает это)

Однако простая функция recv () для сокета может вернуть больше байтов, чем MTU. Поэтому вам нужно передать первый пакет с размером остальных данных.

size = recv(512) // size should came in one shot 
while( count(data) == size) // the rest of actual data can came sliced, so You should receive until size
    data[offset] = recv(size)
...