Некоторые операционные системы (например, ядро Linux после версии 2.6.20) поддерживают второй протокол для SOCK_DGRAM, называемый UDP-Lite. Если поддерживается вашей системой, она будет включена, предоставив IPPROTO_UDPLITE в качестве третьего аргумента вызова socket().
Он отличается от обычного UDP, позволяя применять контрольные суммы только к части дейтаграммы. (Обычно проверка контрольных сумм UDP - это попытка «ничего или ничего».) Таким образом, протокол может быть более устойчивым к сбоям контрольной суммы из-за фрагментированной передачи, в случае, если некоторые фрагменты вне контрольной суммы могут быть потеряны при транзите. До тех пор, пока фрагменты, покрывающие контрольную сумму, были успешно получены, большая часть дейтаграммы по возможности будет доставляться в приложение.
Для обратной совместимости с существующим кодом я подозреваю (но не могу гарантировать), что сокет вызова (AF_INET, SOCK_DGRAM, 0) будет по-прежнему использоваться по умолчанию для обычного UDP, даже в системах, которые дополнительно поддерживают UDP-Lite.
Я думаю, что использование 'IPPROTO_UDP' intsead of zero - это не тот же результат, что и у вас есть сокет, который требует, чтобы вы заполнили все заголовки. – WilliamKF