Я хотел поэкспериментировать с размерами дейтаграмм> 64 КБ, но я застрял на этом вопросе. Я могу опубликовать код, если он будет полезен, но я обновил свой код сокета, чтобы использовать IPv6, основываясь на этом прекрасном примере: example-code.html" rel="nofollow noreferrer">http://cboard.cprogramming.com/networking-device-communication/67469-ipv6-multicast-example-code.html
После этого я попытался увеличить размер буфера отправки в надежде, что фреймворк позаботится обо всех деталях. Я сделал это:
int buffsize = 1024*1024;
auto err = setsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char*)&buffsize, sizeof(buffsize));
Никакой ошибки не было возвращено, и когда я вызвал getockopt() для размера sndbuf, он сообщил о размере, который я установил, но попытка отправить дейтаграмму> 64 КБ просто привела к ошибке, что размер слишком велик.
Из чтения документов я понял, что для отправки jumbogram длина в заголовке пакета устанавливается равной 0, а размер полезной нагрузки помещается в заголовок опций IPv6 hop-by-hop. Однако я не вижу, как это сделать. Я экспериментировал, просто включив параметры перехода (я думаю?), Выполнив следующие действия:
int value(1);
auto err = setsockopt(mS, IPPROTO_IPV6, IPV6_HOPOPTS, (char *)&value, sizeof(value));
но это просто возвращает -1. Когда я вызываю getsockopt, он не возвращает ошибки, но изменяет значение исходящей длины на 0, поэтому я не знаю, что это значит.
В рамках изучения этого я столкнулся с парой SO, которые не дали мне ответа:
Кто-нибудь реализовал решение с использованием jumbograms UDP?
Поддерживает ли Winsock заголовки расширений IPv6?
IPV6_HOPOPTS
не задокументирован как поддерживаемая опцияIPPROTO_IPV6
дляsetsockopt()
. Однако это задокументировано как доступная опция дляWSASendMsg()
иRIOSendEx()
. - person Remy Lebeau   schedule 30.04.2015