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

Иногда самый простой способ - просто добавить представление, использующее границы UIScreen.

let whiteView = UIView()
    whiteView.backgroundColor = .white
    view.addSubview(whiteView)
    whiteView.translatesAutoresizingMaskIntoConstraints = false
    whiteView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    whiteView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    whiteView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    whiteView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.height).isActive = true

Иногда иногда края обзора выходят за пределы панели навигации, что дает вам новые проблемы, если вы расширяете макет представления.

7
задан e-sushi 2 December 2013 в 12:48
поделиться

3 ответа

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

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

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

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

11
ответ дан 6 December 2019 в 11:54
поделиться

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

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

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

1
ответ дан 6 December 2019 в 11:54
поделиться

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

getsockopt (носок, SOL_SOCKET, SO_SNDBUF, (интервал *) &optval, &optlen);

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

5
ответ дан 6 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: