Максимальная длина буфера для sendto?

Как получить максимальное количество байтов, которое можно передать sendto(..)вызову сокета, открытого как порт UDP?

25.08.2008 10:27:55
3 ОТВЕТА

Поскольку UDP не ориентирован на соединение, нет способа указать, что два пакета принадлежат друг другу. В результате вы ограничены максимальным размером одного IP-пакета (65535). Данные, которые вы можете отправить, несколько меньше, потому что размер пакета IP также включает заголовок IP (обычно 20 байтов) и заголовок UDP (8 байтов).

Обратите внимание, что этот IP-пакет может быть фрагментирован для размещения в меньших пакетах (например, ~ 1500 байт для Ethernet).

Я не знаю ни о какой ОС, ограничивающей это далее.

бонус

SO_MAX_MSG_SIZE UDP-пакета

  • IPv4: 65 507 байт
  • IPv6: 65 527 байт
1
26.02.2020 04:52:16

Используйте getsockopt (). На этом сайте есть хорошая разбивка использования и параметров, которые вы можете получить.

В Windows вы можете сделать:

int optlen = sizeof (int);
int optval;
getsockopt (сокет, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *) & optval, & optlen);

Для Linux, согласно справочной странице UDP, ядро ​​будет использовать обнаружение MTU (оно проверит, какой максимальный размер UDP-пакета находится между этим местом и местом назначения, и выберет это), или, если обнаружение MTU выключено, оно установит Максимальный размер интерфейса MTU и фрагмент чего-либо большего. Если вы отправляете через Ethernet, типичный MTU составляет 1500 байт.

12
25.08.2008 11:23:27

В Mac OS X существуют разные значения для отправки (SO_SNDBUF) и получения (SO_RCVBUF). Это размер буфера отправки (man getsockopt):

getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (int *)&optval, &optlen);

Попытка отправить более крупное сообщение (на Leopard 9216 октетов по UDP, отправленному через локальную обратную связь) приведет к «Слишком длинному сообщению / EMSGSIZE».

5
26.02.2020 04:46:52