Максимальная длина буфера для sendto? - PullRequest
7 голосов
/ 25 августа 2008

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

Ответы [ 3 ]

11 голосов
/ 25 августа 2008

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

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

int optlen = sizeof(int);
int optval;
getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);

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

5 голосов
/ 25 августа 2008

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

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

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

1 голос
/ 25 августа 2008

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

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

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

...