Сведения о вопросе

profi

12:40, 6th August, 2020

Теги

unix   sockets   networking   udp   ioctl    

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

Просмотров: 502   Ответов: 3

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



  Сведения об ответе

padenie

19:06, 25th August, 2020

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

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

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

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


  Сведения об ответе

baggs

09:32, 23rd August, 2020

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

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

Попытка отправить большее сообщение (на Leopard 9216 октетов на UDP, отправленное через локальную петлю) приведет к "Message too long / EMSGSIZE".


  Сведения об ответе

darknet

21:08, 2nd August, 2020

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

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

Я не знаю никакого OS, ограничивающего это дальше.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться