Максимальный размер буфера UDP sendto() и recvfrom()

Я понимаю, что максимальный размер буфера по умолчанию, который я могу использовать с этими функциями, - 65507 (5535 - заголовок IPv4 - заголовок UDP). Однако есть ли способ изменить это? Мне нужно отправить более крупный буфер ~ 66000 байт. Я попытался использовать функцию setsockopt(), но он, похоже, не работал.

Спасибо!

Ответ 1

Нет.

UDP предоставляет только дейтаграмму в качестве части данных IP-пакета, IP-пакет имеет поле длиной 16 бит, таким образом ограничивая данные 2 ^ 16 байтами, включая заголовки, или 65507 байт для части данных UDP (при условии, что нет ipv4), нет способа обрабатывать большие пакеты с UDP, кроме того, разбивая их на несколько пакетов и обрабатывая сборку и т.д. самостоятельно.

Ответ 2

Кроме того, вполне вероятно, что на этом пути потеряют "большие" UDP-пакеты, потому что пакет IP-пакетов упаковки может быть фрагментирован из-за ограничений MTU, Каждый фрагмент может быть потерян, и в UDP нет механизма восстановления. Поэтому, пока теоретический предел для полезной нагрузки UDP составляет ок. 64 КБ практический предел составляет около 1 КБ.

Ответ 3

Спецификация UDP дает 16 бит в заголовке UDP для размера пакета, что означает, что вы не можете отправить более 65 тыс. одновременно. Вы не можете изменить это.

Вы должны разделить свои данные на несколько пакетов. Использование TCP вместо UDP сделает задачу намного проще, поскольку гарантированы полнота и порядок приема.